@singi-labs/sifa-sdk 0.12.21 → 0.12.22
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.
- package/dist/{adult-content-C9gi0C_Q.d.cts → adult-content-DdY7S5nN.d.cts} +1 -1
- package/dist/{adult-content-C9gi0C_Q.d.ts → adult-content-DdY7S5nN.d.ts} +1 -1
- package/dist/{index-68tJSEtA.d.cts → index-4SE7Z9SK.d.cts} +2 -2
- package/dist/{index-BEDyt4ZP.d.ts → index-BpEeBgRr.d.ts} +15 -3
- package/dist/{index-Cbjiqz7Y.d.cts → index-Bz0xL4us.d.cts} +15 -3
- package/dist/{index-B4NfsdTi.d.ts → index-M_BYlvDY.d.ts} +2 -2
- package/dist/index.cjs +21 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +21 -2
- package/dist/index.js.map +1 -1
- package/dist/{org-lScz_q2Z.d.ts → org-CQMDMN58.d.ts} +1 -1
- package/dist/{org-BX4WZoOT.d.cts → org-DVIvsT_0.d.cts} +1 -1
- package/dist/profile-summary-B9SuY-EU.d.ts +39 -0
- package/dist/profile-summary-DjRf3Snf.d.cts +39 -0
- package/dist/query/fetchers/index.cjs +37 -0
- package/dist/query/fetchers/index.cjs.map +1 -1
- package/dist/query/fetchers/index.d.cts +4 -3
- package/dist/query/fetchers/index.d.ts +4 -3
- package/dist/query/fetchers/index.js +37 -1
- package/dist/query/fetchers/index.js.map +1 -1
- package/dist/query/hooks/index.d.cts +3 -3
- package/dist/query/hooks/index.d.ts +3 -3
- package/dist/query/index.cjs +37 -0
- package/dist/query/index.cjs.map +1 -1
- package/dist/query/index.d.cts +6 -5
- package/dist/query/index.d.ts +6 -5
- package/dist/query/index.js +37 -1
- package/dist/query/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/taxonomy/continents.ts","../src/taxonomy/countries.ts","../src/taxonomy/employment-type.ts","../src/taxonomy/industry-taxonomy.ts","../src/taxonomy/open-to.ts","../src/taxonomy/workplace-type.ts","../src/taxonomy/platforms.ts","../src/taxonomy/skill-categories.ts","../src/taxonomy/skill-grouping.ts","../src/taxonomy/app-categories.ts","../src/taxonomy/app-category-map.ts","../src/taxonomy/activity-tiers.json","../src/taxonomy/activity-tiers.ts","../src/taxonomy/presentation-role.ts","../src/taxonomy/presentation-link-type.ts","../src/taxonomy/calendar-event.ts","../src/taxonomy/involvement-kind.ts","../src/taxonomy/artifact-link-kind.ts","../src/taxonomy/verification-providers.ts","../src/format/company-name.ts","../src/format/normalize-legal-form.ts","../src/format/normalize-company-key.ts","../src/format/format-time.ts","../src/format/format-duration.ts","../src/format/timeline.ts","../src/format/summarize-deliveries.ts","../src/format/sort-by-date.ts","../src/format/handle-utils.ts","../src/format/location-utils.ts","../src/format/pds-utils.ts","../src/format/embed.ts","../src/format/talk-slug.ts","../src/format/text-sanitize.ts","../src/format/text-truncate.ts","../src/format/time-utils.ts","../src/format/wcag-contrast.ts","../src/import/presentation-csv.ts","../src/cards/app-url-patterns.ts","../src/cards/resolve-card-url.ts","../src/cards/visibility.ts","../src/cards/adult-content.ts","../src/publishers/registry.ts","../src/stream/verbs.json","../src/stream/verbs.ts","../src/stream/stream-card-vm-schema.ts","../src/schemas/shared.ts","../src/publishing/registry.ts","../src/stream/to-stream-card-vm.ts","../src/logic/profile-completeness.ts","../src/logic/profile-dimensions.ts","../src/logic/primary-position.ts","../src/logic/pseudo-employer.ts","../src/logic/domain-detect.ts","../src/logic/entity-disambiguation.ts","../src/logic/entity-ref-anchor.ts","../src/logic/org-floor.ts","../src/logic/company-page-indexable.ts","../src/profile/section-model.ts","../src/profile/range-sort.ts","../src/profile/language-sort.ts","../src/profile/section-sorts.ts","../src/profile/involvement-grouping.ts","../src/schemas/blob-ref.ts","../src/schemas/endorsement-confirmation.ts","../src/schemas/entity.ts","../src/schemas/endorsement.ts","../src/schemas/org-profile.ts","../src/schemas/org-employment-attestation.ts","../src/schemas/graph-follow.ts","../src/schemas/follow-profile.ts","../src/schemas/feed.ts","../src/schemas/profile-certification.ts","../src/schemas/profile-course.ts","../src/schemas/profile-education.ts","../src/schemas/profile-external-account.ts","../src/schemas/profile-honor.ts","../src/schemas/profile-involvement.ts","../src/schemas/profile-language.ts","../src/schemas/profile-position.ts","../src/schemas/profile-presentation.ts","../src/schemas/profile-presentation-delivery.ts","../src/schemas/profile-project.ts","../src/schemas/profile-publication.ts","../src/schemas/profile-self.ts","../src/schemas/profile-skill.ts","../src/schemas/profile-volunteering.ts","../src/index.ts"],"names":["z","parsed","COMBINING_MARKS","link","isNonEmptyString"],"mappings":";;;;;AAEO,IAAM,UAAA,GAAmE;AAAA,EAC9E,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA,EAAgB;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA;AACtB;AAEA,IAAM,oBAAA,GAAsD;AAAA,EAC1D,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EA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","file":"index.cjs","sourcesContent":["export type ContinentCode = 'AF' | 'AN' | 'AS' | 'EU' | 'NA' | 'OC' | 'SA';\n\nexport const CONTINENTS: ReadonlyArray<{ code: ContinentCode; name: string }> = [\n { code: 'AF', name: 'Africa' },\n { code: 'AN', name: 'Antarctica' },\n { code: 'AS', name: 'Asia' },\n { code: 'EU', name: 'Europe' },\n { code: 'NA', name: 'North America' },\n { code: 'OC', name: 'Oceania' },\n { code: 'SA', name: 'South America' },\n];\n\nconst COUNTRY_TO_CONTINENT: Record<string, ContinentCode> = {\n AD: 'EU',\n AE: 'AS',\n AF: 'AS',\n AG: 'NA',\n AL: 'EU',\n AM: 'AS',\n AO: 'AF',\n AR: 'SA',\n AT: 'EU',\n AU: 'OC',\n AZ: 'AS',\n BA: 'EU',\n BB: 'NA',\n BD: 'AS',\n BE: 'EU',\n BF: 'AF',\n BG: 'EU',\n BH: 'AS',\n BI: 'AF',\n BJ: 'AF',\n BN: 'AS',\n BO: 'SA',\n BR: 'SA',\n BS: 'NA',\n BT: 'AS',\n BW: 'AF',\n BY: 'EU',\n BZ: 'NA',\n CA: 'NA',\n CD: 'AF',\n CF: 'AF',\n CG: 'AF',\n CH: 'EU',\n CI: 'AF',\n CL: 'SA',\n CM: 'AF',\n CN: 'AS',\n CO: 'SA',\n CR: 'NA',\n CU: 'NA',\n CV: 'AF',\n CY: 'AS',\n CZ: 'EU',\n DE: 'EU',\n DJ: 'AF',\n DK: 'EU',\n DM: 'NA',\n DO: 'NA',\n DZ: 'AF',\n EC: 'SA',\n EE: 'EU',\n EG: 'AF',\n ER: 'AF',\n ES: 'EU',\n ET: 'AF',\n FI: 'EU',\n FJ: 'OC',\n FR: 'EU',\n GA: 'AF',\n GB: 'EU',\n GD: 'NA',\n GE: 'AS',\n GH: 'AF',\n GM: 'AF',\n GN: 'AF',\n GQ: 'AF',\n GR: 'EU',\n GT: 'NA',\n GW: 'AF',\n GY: 'SA',\n HK: 'AS',\n HN: 'NA',\n HR: 'EU',\n HT: 'NA',\n HU: 'EU',\n ID: 'AS',\n IE: 'EU',\n IL: 'AS',\n IN: 'AS',\n IQ: 'AS',\n IR: 'AS',\n IS: 'EU',\n IT: 'EU',\n JM: 'NA',\n JO: 'AS',\n JP: 'AS',\n KE: 'AF',\n KG: 'AS',\n KH: 'AS',\n KM: 'AF',\n KN: 'NA',\n KP: 'AS',\n KR: 'AS',\n KW: 'AS',\n KZ: 'AS',\n LA: 'AS',\n LB: 'AS',\n LC: 'NA',\n LI: 'EU',\n LK: 'AS',\n LR: 'AF',\n LS: 'AF',\n LT: 'EU',\n LU: 'EU',\n LV: 'EU',\n LY: 'AF',\n MA: 'AF',\n MC: 'EU',\n MD: 'EU',\n ME: 'EU',\n MG: 'AF',\n MK: 'EU',\n ML: 'AF',\n MM: 'AS',\n MN: 'AS',\n MO: 'AS',\n MR: 'AF',\n MT: 'EU',\n MU: 'AF',\n MV: 'AS',\n MW: 'AF',\n MX: 'NA',\n MY: 'AS',\n MZ: 'AF',\n NA: 'AF',\n NE: 'AF',\n NG: 'AF',\n NI: 'NA',\n NL: 'EU',\n NO: 'EU',\n NP: 'AS',\n NZ: 'OC',\n OM: 'AS',\n PA: 'NA',\n PE: 'SA',\n PG: 'OC',\n PH: 'AS',\n PK: 'AS',\n PL: 'EU',\n PR: 'NA',\n PS: 'AS',\n PT: 'EU',\n PY: 'SA',\n QA: 'AS',\n RO: 'EU',\n RS: 'EU',\n RU: 'EU',\n RW: 'AF',\n SA: 'AS',\n SB: 'OC',\n SC: 'AF',\n SD: 'AF',\n SE: 'EU',\n SG: 'AS',\n SI: 'EU',\n SK: 'EU',\n SL: 'AF',\n SM: 'EU',\n SN: 'AF',\n SO: 'AF',\n SR: 'SA',\n SS: 'AF',\n ST: 'AF',\n SV: 'NA',\n SY: 'AS',\n SZ: 'AF',\n TD: 'AF',\n TG: 'AF',\n TH: 'AS',\n TJ: 'AS',\n TL: 'AS',\n TM: 'AS',\n TN: 'AF',\n TO: 'OC',\n TR: 'AS',\n TT: 'NA',\n TW: 'AS',\n TZ: 'AF',\n UA: 'EU',\n UG: 'AF',\n US: 'NA',\n UY: 'SA',\n UZ: 'AS',\n VA: 'EU',\n VC: 'NA',\n VE: 'SA',\n VN: 'AS',\n VU: 'OC',\n WS: 'OC',\n XK: 'EU',\n YE: 'AS',\n ZA: 'AF',\n ZM: 'AF',\n ZW: 'AF',\n};\n\nexport function getContinent(countryCode: string): ContinentCode | null {\n if (!countryCode) return null;\n return COUNTRY_TO_CONTINENT[countryCode.toUpperCase()] ?? null;\n}\n","/** ISO 3166-1 country list for local fallback when GeoNames is unavailable. */\nexport const COUNTRIES: ReadonlyArray<{ code: string; name: string }> = [\n { code: 'AF', name: 'Afghanistan' },\n { code: 'AL', name: 'Albania' },\n { code: 'DZ', name: 'Algeria' },\n { code: 'AD', name: 'Andorra' },\n { code: 'AO', name: 'Angola' },\n { code: 'AG', name: 'Antigua and Barbuda' },\n { code: 'AR', name: 'Argentina' },\n { code: 'AM', name: 'Armenia' },\n { code: 'AU', name: 'Australia' },\n { code: 'AT', name: 'Austria' },\n { code: 'AZ', name: 'Azerbaijan' },\n { code: 'BS', name: 'Bahamas' },\n { code: 'BH', name: 'Bahrain' },\n { code: 'BD', name: 'Bangladesh' },\n { code: 'BB', name: 'Barbados' },\n { code: 'BY', name: 'Belarus' },\n { code: 'BE', name: 'Belgium' },\n { code: 'BZ', name: 'Belize' },\n { code: 'BJ', name: 'Benin' },\n { code: 'BT', name: 'Bhutan' },\n { code: 'BO', name: 'Bolivia' },\n { code: 'BA', name: 'Bosnia and Herzegovina' },\n { code: 'BW', name: 'Botswana' },\n { code: 'BR', name: 'Brazil' },\n { code: 'BN', name: 'Brunei' },\n { code: 'BG', name: 'Bulgaria' },\n { code: 'BF', name: 'Burkina Faso' },\n { code: 'BI', name: 'Burundi' },\n { code: 'CV', name: 'Cabo Verde' },\n { code: 'KH', name: 'Cambodia' },\n { code: 'CM', name: 'Cameroon' },\n { code: 'CA', name: 'Canada' },\n { code: 'CF', name: 'Central African Republic' },\n { code: 'TD', name: 'Chad' },\n { code: 'CL', name: 'Chile' },\n { code: 'CN', name: 'China' },\n { code: 'CO', name: 'Colombia' },\n { code: 'KM', name: 'Comoros' },\n { code: 'CG', name: 'Congo' },\n { code: 'CD', name: 'Congo (DRC)' },\n { code: 'CR', name: 'Costa Rica' },\n { code: 'CI', name: \"Cote d'Ivoire\" },\n { code: 'HR', name: 'Croatia' },\n { code: 'CU', name: 'Cuba' },\n { code: 'CY', name: 'Cyprus' },\n { code: 'CZ', name: 'Czechia' },\n { code: 'DK', name: 'Denmark' },\n { code: 'DJ', name: 'Djibouti' },\n { code: 'DM', name: 'Dominica' },\n { code: 'DO', name: 'Dominican Republic' },\n { code: 'EC', name: 'Ecuador' },\n { code: 'EG', name: 'Egypt' },\n { code: 'SV', name: 'El Salvador' },\n { code: 'GQ', name: 'Equatorial Guinea' },\n { code: 'ER', name: 'Eritrea' },\n { code: 'EE', name: 'Estonia' },\n { code: 'SZ', name: 'Eswatini' },\n { code: 'ET', name: 'Ethiopia' },\n { code: 'FJ', name: 'Fiji' },\n { code: 'FI', name: 'Finland' },\n { code: 'FR', name: 'France' },\n { code: 'GA', name: 'Gabon' },\n { code: 'GM', name: 'Gambia' },\n { code: 'GE', name: 'Georgia' },\n { code: 'DE', name: 'Germany' },\n { code: 'GH', name: 'Ghana' },\n { code: 'GR', name: 'Greece' },\n { code: 'GD', name: 'Grenada' },\n { code: 'GT', name: 'Guatemala' },\n { code: 'GN', name: 'Guinea' },\n { code: 'GW', name: 'Guinea-Bissau' },\n { code: 'GY', name: 'Guyana' },\n { code: 'HT', name: 'Haiti' },\n { code: 'HN', name: 'Honduras' },\n { code: 'HU', name: 'Hungary' },\n { code: 'IS', name: 'Iceland' },\n { code: 'IN', name: 'India' },\n { code: 'ID', name: 'Indonesia' },\n { code: 'IR', name: 'Iran' },\n { code: 'IQ', name: 'Iraq' },\n { code: 'IE', name: 'Ireland' },\n { code: 'IL', name: 'Israel' },\n { code: 'IT', name: 'Italy' },\n { code: 'JM', name: 'Jamaica' },\n { code: 'JP', name: 'Japan' },\n { code: 'JO', name: 'Jordan' },\n { code: 'KZ', name: 'Kazakhstan' },\n { code: 'KE', name: 'Kenya' },\n { code: 'KI', name: 'Kiribati' },\n { code: 'KP', name: 'North Korea' },\n { code: 'KR', name: 'South Korea' },\n { code: 'KW', name: 'Kuwait' },\n { code: 'KG', name: 'Kyrgyzstan' },\n { code: 'LA', name: 'Laos' },\n { code: 'LV', name: 'Latvia' },\n { code: 'LB', name: 'Lebanon' },\n { code: 'LS', name: 'Lesotho' },\n { code: 'LR', name: 'Liberia' },\n { code: 'LY', name: 'Libya' },\n { code: 'LI', name: 'Liechtenstein' },\n { code: 'LT', name: 'Lithuania' },\n { code: 'LU', name: 'Luxembourg' },\n { code: 'MG', name: 'Madagascar' },\n { code: 'MW', name: 'Malawi' },\n { code: 'MY', name: 'Malaysia' },\n { code: 'MV', name: 'Maldives' },\n { code: 'ML', name: 'Mali' },\n { code: 'MT', name: 'Malta' },\n { code: 'MH', name: 'Marshall Islands' },\n { code: 'MR', name: 'Mauritania' },\n { code: 'MU', name: 'Mauritius' },\n { code: 'MX', name: 'Mexico' },\n { code: 'FM', name: 'Micronesia' },\n { code: 'MD', name: 'Moldova' },\n { code: 'MC', name: 'Monaco' },\n { code: 'MN', name: 'Mongolia' },\n { code: 'ME', name: 'Montenegro' },\n { code: 'MA', name: 'Morocco' },\n { code: 'MZ', name: 'Mozambique' },\n { code: 'MM', name: 'Myanmar' },\n { code: 'NA', name: 'Namibia' },\n { code: 'NR', name: 'Nauru' },\n { code: 'NP', name: 'Nepal' },\n { code: 'NL', name: 'Netherlands' },\n { code: 'NZ', name: 'New Zealand' },\n { code: 'NI', name: 'Nicaragua' },\n { code: 'NE', name: 'Niger' },\n { code: 'NG', name: 'Nigeria' },\n { code: 'MK', name: 'North Macedonia' },\n { code: 'NO', name: 'Norway' },\n { code: 'OM', name: 'Oman' },\n { code: 'PK', name: 'Pakistan' },\n { code: 'PW', name: 'Palau' },\n { code: 'PS', name: 'Palestine' },\n { code: 'PA', name: 'Panama' },\n { code: 'PG', name: 'Papua New Guinea' },\n { code: 'PY', name: 'Paraguay' },\n { code: 'PE', name: 'Peru' },\n { code: 'PH', name: 'Philippines' },\n { code: 'PL', name: 'Poland' },\n { code: 'PT', name: 'Portugal' },\n { code: 'QA', name: 'Qatar' },\n { code: 'RO', name: 'Romania' },\n { code: 'RU', name: 'Russia' },\n { code: 'RW', name: 'Rwanda' },\n { code: 'KN', name: 'Saint Kitts and Nevis' },\n { code: 'LC', name: 'Saint Lucia' },\n { code: 'VC', name: 'Saint Vincent and the Grenadines' },\n { code: 'WS', name: 'Samoa' },\n { code: 'SM', name: 'San Marino' },\n { code: 'ST', name: 'Sao Tome and Principe' },\n { code: 'SA', name: 'Saudi Arabia' },\n { code: 'SN', name: 'Senegal' },\n { code: 'RS', name: 'Serbia' },\n { code: 'SC', name: 'Seychelles' },\n { code: 'SL', name: 'Sierra Leone' },\n { code: 'SG', name: 'Singapore' },\n { code: 'SK', name: 'Slovakia' },\n { code: 'SI', name: 'Slovenia' },\n { code: 'SB', name: 'Solomon Islands' },\n { code: 'SO', name: 'Somalia' },\n { code: 'ZA', name: 'South Africa' },\n { code: 'SS', name: 'South Sudan' },\n { code: 'ES', name: 'Spain' },\n { code: 'LK', name: 'Sri Lanka' },\n { code: 'SD', name: 'Sudan' },\n { code: 'SR', name: 'Suriname' },\n { code: 'SE', name: 'Sweden' },\n { code: 'CH', name: 'Switzerland' },\n { code: 'SY', name: 'Syria' },\n { code: 'TW', name: 'Taiwan' },\n { code: 'TJ', name: 'Tajikistan' },\n { code: 'TZ', name: 'Tanzania' },\n { code: 'TH', name: 'Thailand' },\n { code: 'TL', name: 'Timor-Leste' },\n { code: 'TG', name: 'Togo' },\n { code: 'TO', name: 'Tonga' },\n { code: 'TT', name: 'Trinidad and Tobago' },\n { code: 'TN', name: 'Tunisia' },\n { code: 'TR', name: 'Turkey' },\n { code: 'TM', name: 'Turkmenistan' },\n { code: 'TV', name: 'Tuvalu' },\n { code: 'UG', name: 'Uganda' },\n { code: 'UA', name: 'Ukraine' },\n { code: 'AE', name: 'United Arab Emirates' },\n { code: 'GB', name: 'United Kingdom' },\n { code: 'US', name: 'United States' },\n { code: 'UY', name: 'Uruguay' },\n { code: 'UZ', name: 'Uzbekistan' },\n { code: 'VU', name: 'Vanuatu' },\n { code: 'VA', name: 'Vatican City' },\n { code: 'VE', name: 'Venezuela' },\n { code: 'VN', name: 'Vietnam' },\n { code: 'YE', name: 'Yemen' },\n { code: 'ZM', name: 'Zambia' },\n { code: 'ZW', name: 'Zimbabwe' },\n] as const;\n","/**\n * Employment-type taxonomy. Mirrors `id.sifa.defs#employmentType.knownValues`\n * from sifa-lexicons. Surfaces both a flat NSID→label map (for read-only\n * display) and a grouped structure (for editor dropdowns).\n */\n\nexport interface EmploymentTypeOption {\n value: string;\n label: string;\n}\n\nexport interface EmploymentTypeGroup {\n label: string;\n items: EmploymentTypeOption[];\n}\n\nexport const EMPLOYMENT_TYPE_GROUPS: EmploymentTypeGroup[] = [\n {\n label: 'Employee',\n items: [\n { value: 'id.sifa.defs#fullTime', label: 'Full-time' },\n { value: 'id.sifa.defs#partTime', label: 'Part-time' },\n { value: 'id.sifa.defs#temporary', label: 'Temporary' },\n { value: 'id.sifa.defs#seasonal', label: 'Seasonal' },\n ],\n },\n {\n label: 'Independent',\n items: [\n { value: 'id.sifa.defs#contract', label: 'Contract' },\n { value: 'id.sifa.defs#freelance', label: 'Freelance' },\n { value: 'id.sifa.defs#selfEmployed', label: 'Self-employed' },\n { value: 'id.sifa.defs#independentWork', label: 'Independent work' },\n ],\n },\n {\n label: 'Training & early-career',\n items: [\n { value: 'id.sifa.defs#internship', label: 'Internship' },\n { value: 'id.sifa.defs#apprenticeship', label: 'Apprenticeship' },\n { value: 'id.sifa.defs#fellowship', label: 'Fellowship' },\n { value: 'id.sifa.defs#trainee', label: 'Trainee' },\n ],\n },\n];\n\nexport const EMPLOYMENT_TYPE_LABELS: Record<string, string> = {\n ...Object.fromEntries(\n EMPLOYMENT_TYPE_GROUPS.flatMap((g) => g.items).map((o) => [o.value, o.label]),\n ),\n // `volunteer` is retained for legacy records but no longer offered in the\n // editor dropdown. Volunteering is a distinct thing (no payroll, no formal\n // role, no obligation) rather than a kind of employment, so it lives in the\n // dedicated `id.sifa.profile.volunteering` section, not on the employment-type\n // axis. Kept here so old positions still render a human label, not the raw NSID.\n 'id.sifa.defs#volunteer': 'Volunteer',\n};\n\n/** Resolve a label for an employment-type token. Falls back to the raw value. */\nexport function getEmploymentTypeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return EMPLOYMENT_TYPE_LABELS[value] ?? value;\n}\n\n/**\n * Employment-type group whose members may omit a company name: independent\n * workers (contract, freelance, self-employed, independent work) often have no\n * separately named or registered entity. Derived from the group rather than a\n * hand-maintained list so it stays in sync if the group's membership changes.\n */\nexport const COMPANY_OPTIONAL_EMPLOYMENT_TYPES: ReadonlySet<string> = new Set(\n EMPLOYMENT_TYPE_GROUPS.find((g) => g.label === 'Independent')?.items.map((i) => i.value) ?? [],\n);\n\n/**\n * Whether a company name is required for a position with the given employment\n * type. Company is optional for the Independent group; required otherwise,\n * including when the employment type is unspecified (the conservative default,\n * since most positions are at a named organization).\n */\nexport function isCompanyRequired(employmentType: string | undefined | null): boolean {\n if (!employmentType) return true;\n return !COMPANY_OPTIONAL_EMPLOYMENT_TYPES.has(employmentType);\n}\n","/** Two-level industry/domain taxonomy for profile classification. */\n\nexport interface IndustryOption {\n value: string;\n labelKey: string;\n domains: { value: string; labelKey: string }[];\n}\n\nexport const INDUSTRY_OPTIONS: IndustryOption[] = [\n {\n value: 'id.sifa.defs#industryTechnology',\n labelKey: 'industryTechnology',\n domains: [\n { value: 'id.sifa.defs#domainSoftwareEngineering', labelKey: 'domainSoftwareEngineering' },\n { value: 'id.sifa.defs#domainDataScience', labelKey: 'domainDataScience' },\n { value: 'id.sifa.defs#domainCybersecurity', labelKey: 'domainCybersecurity' },\n { value: 'id.sifa.defs#domainDevops', labelKey: 'domainDevops' },\n { value: 'id.sifa.defs#domainProductDesign', labelKey: 'domainProductDesign' },\n { value: 'id.sifa.defs#domainGameDev', labelKey: 'domainGameDev' },\n ],\n },\n {\n value: 'id.sifa.defs#industryFinance',\n labelKey: 'industryFinance',\n domains: [\n { value: 'id.sifa.defs#domainBanking', labelKey: 'domainBanking' },\n { value: 'id.sifa.defs#domainFintech', labelKey: 'domainFintech' },\n { value: 'id.sifa.defs#domainInsurance', labelKey: 'domainInsurance' },\n { value: 'id.sifa.defs#domainInvestmentMgmt', labelKey: 'domainInvestmentMgmt' },\n ],\n },\n {\n value: 'id.sifa.defs#industryHealthcare',\n labelKey: 'industryHealthcare',\n domains: [\n { value: 'id.sifa.defs#domainClinicalResearch', labelKey: 'domainClinicalResearch' },\n { value: 'id.sifa.defs#domainHealthtech', labelKey: 'domainHealthtech' },\n { value: 'id.sifa.defs#domainPharma', labelKey: 'domainPharma' },\n ],\n },\n {\n value: 'id.sifa.defs#industryEducation',\n labelKey: 'industryEducation',\n domains: [\n { value: 'id.sifa.defs#domainHigherEd', labelKey: 'domainHigherEd' },\n { value: 'id.sifa.defs#domainEdtech', labelKey: 'domainEdtech' },\n { value: 'id.sifa.defs#domainPrimarySecondary', labelKey: 'domainPrimarySecondary' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMedia',\n labelKey: 'industryMedia',\n domains: [\n { value: 'id.sifa.defs#domainJournalism', labelKey: 'domainJournalism' },\n { value: 'id.sifa.defs#domainFilmVideo', labelKey: 'domainFilmVideo' },\n { value: 'id.sifa.defs#domainGaming', labelKey: 'domainGaming' },\n { value: 'id.sifa.defs#domainAdvertising', labelKey: 'domainAdvertising' },\n ],\n },\n {\n value: 'id.sifa.defs#industryRetail',\n labelKey: 'industryRetail',\n domains: [\n { value: 'id.sifa.defs#domainEcommerce', labelKey: 'domainEcommerce' },\n { value: 'id.sifa.defs#domainSupplyChain', labelKey: 'domainSupplyChain' },\n ],\n },\n {\n value: 'id.sifa.defs#industryManufacturing',\n labelKey: 'industryManufacturing',\n domains: [\n { value: 'id.sifa.defs#domainAutomotive', labelKey: 'domainAutomotive' },\n { value: 'id.sifa.defs#domainAerospace', labelKey: 'domainAerospace' },\n { value: 'id.sifa.defs#domainHardware', labelKey: 'domainHardware' },\n ],\n },\n {\n value: 'id.sifa.defs#industryEnergy',\n labelKey: 'industryEnergy',\n domains: [\n { value: 'id.sifa.defs#domainRenewables', labelKey: 'domainRenewables' },\n { value: 'id.sifa.defs#domainOilGas', labelKey: 'domainOilGas' },\n { value: 'id.sifa.defs#domainClimateTech', labelKey: 'domainClimateTech' },\n ],\n },\n {\n value: 'id.sifa.defs#industryGovernment',\n labelKey: 'industryGovernment',\n domains: [\n { value: 'id.sifa.defs#domainPublicPolicy', labelKey: 'domainPublicPolicy' },\n { value: 'id.sifa.defs#domainDefense', labelKey: 'domainDefense' },\n ],\n },\n {\n value: 'id.sifa.defs#industryLegal',\n labelKey: 'industryLegal',\n domains: [\n { value: 'id.sifa.defs#domainIpLaw', labelKey: 'domainIpLaw' },\n { value: 'id.sifa.defs#domainCompliance', labelKey: 'domainCompliance' },\n ],\n },\n {\n value: 'id.sifa.defs#industryConsulting',\n labelKey: 'industryConsulting',\n domains: [\n { value: 'id.sifa.defs#domainManagementConsulting', labelKey: 'domainManagementConsulting' },\n { value: 'id.sifa.defs#domainDevrel', labelKey: 'domainDevrel' },\n { value: 'id.sifa.defs#domainHrRecruitment', labelKey: 'domainHrRecruitment' },\n ],\n },\n {\n value: 'id.sifa.defs#industryNonprofit',\n labelKey: 'industryNonprofit',\n domains: [\n { value: 'id.sifa.defs#domainHumanRights', labelKey: 'domainHumanRights' },\n { value: 'id.sifa.defs#domainOpenSource', labelKey: 'domainOpenSource' },\n ],\n },\n {\n value: 'id.sifa.defs#industryRealEstate',\n labelKey: 'industryRealEstate',\n domains: [{ value: 'id.sifa.defs#domainProptech', labelKey: 'domainProptech' }],\n },\n {\n value: 'id.sifa.defs#industryTransport',\n labelKey: 'industryTransport',\n domains: [\n { value: 'id.sifa.defs#domainAutonomousVehicles', labelKey: 'domainAutonomousVehicles' },\n { value: 'id.sifa.defs#domainLogistics', labelKey: 'domainLogistics' },\n ],\n },\n {\n value: 'id.sifa.defs#industryAgriculture',\n labelKey: 'industryAgriculture',\n domains: [\n { value: 'id.sifa.defs#domainAgritech', labelKey: 'domainAgritech' },\n { value: 'id.sifa.defs#domainFoodTech', labelKey: 'domainFoodTech' },\n ],\n },\n {\n value: 'id.sifa.defs#industryHospitality',\n labelKey: 'industryHospitality',\n domains: [\n { value: 'id.sifa.defs#domainHotels', labelKey: 'domainHotels' },\n { value: 'id.sifa.defs#domainTravelTourism', labelKey: 'domainTravelTourism' },\n { value: 'id.sifa.defs#domainFoodBeverage', labelKey: 'domainFoodBeverage' },\n ],\n },\n {\n value: 'id.sifa.defs#industryTelecom',\n labelKey: 'industryTelecom',\n domains: [\n { value: 'id.sifa.defs#domainNetworkInfra', labelKey: 'domainNetworkInfra' },\n { value: 'id.sifa.defs#domainMobileServices', labelKey: 'domainMobileServices' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMining',\n labelKey: 'industryMining',\n domains: [\n { value: 'id.sifa.defs#domainExtraction', labelKey: 'domainExtraction' },\n { value: 'id.sifa.defs#domainGeological', labelKey: 'domainGeological' },\n ],\n },\n {\n value: 'id.sifa.defs#industryFashion',\n labelKey: 'industryFashion',\n domains: [\n { value: 'id.sifa.defs#domainFashionDesign', labelKey: 'domainFashionDesign' },\n { value: 'id.sifa.defs#domainTextileManufacturing', labelKey: 'domainTextileManufacturing' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMaritime',\n labelKey: 'industryMaritime',\n domains: [\n { value: 'id.sifa.defs#domainShipping', labelKey: 'domainShipping' },\n { value: 'id.sifa.defs#domainPortOperations', labelKey: 'domainPortOperations' },\n { value: 'id.sifa.defs#domainNavalArchitecture', labelKey: 'domainNavalArchitecture' },\n ],\n },\n {\n value: 'id.sifa.defs#industryOther',\n labelKey: 'industryOther',\n domains: [],\n },\n];\n\n/** Find the industry option for a given industry value. */\nexport function findIndustry(value: string | undefined | null): IndustryOption | undefined {\n if (!value) return undefined;\n return INDUSTRY_OPTIONS.find((i) => i.value === value);\n}\n\n/** Get the label key for an industry or domain token, falling back to the raw value. */\nexport function getIndustryLabelKey(value: string): string {\n for (const industry of INDUSTRY_OPTIONS) {\n if (industry.value === value) return industry.labelKey;\n for (const domain of industry.domains) {\n if (domain.value === value) return domain.labelKey;\n }\n }\n return value;\n}\n","/**\n * \"Open to\" taxonomy. Mirrors `id.sifa.defs#openToWorkStatus.knownValues` from\n * sifa-lexicons. Surfaces a single source of truth for the editor (where the\n * user picks values) and the IdentityCard (where badges are rendered).\n *\n * Shape matches `INDUSTRY_OPTIONS`: `{ value, labelKey }` so consumers can run\n * `labelKey` through their own i18n layer (e.g. next-intl `useTranslations`).\n */\n\nexport type OpenToGroup = 'work' | 'mentorship' | 'peer';\n\nexport interface OpenToOption {\n value: string;\n labelKey: string;\n token: string;\n group: OpenToGroup;\n}\n\nexport const OPEN_TO_OPTIONS: OpenToOption[] = [\n {\n value: 'id.sifa.defs#fullTimeRoles',\n labelKey: 'fullTimeRoles',\n token: 'fullTime',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#partTimeRoles',\n labelKey: 'partTimeRoles',\n token: 'partTime',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#contractRoles',\n labelKey: 'contractRoles',\n token: 'contract',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#commissions',\n labelKey: 'commissions',\n token: 'commissions',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#boardPositions',\n labelKey: 'boardPositions',\n token: 'board',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#mentoringOthers',\n labelKey: 'mentoringOthers',\n token: 'mentor',\n group: 'mentorship',\n },\n {\n value: 'id.sifa.defs#beingMentored',\n labelKey: 'beingMentored',\n token: 'mentee',\n group: 'mentorship',\n },\n {\n value: 'id.sifa.defs#collaborations',\n labelKey: 'collaborations',\n token: 'collab',\n group: 'peer',\n },\n];\n\n/** Map short token (e.g. \"fullTime\") -> lex value (e.g. \"id.sifa.defs#fullTimeRoles\"). */\nexport const OPEN_TO_TOKEN_TO_VALUE: Record<string, string> = Object.fromEntries(\n OPEN_TO_OPTIONS.map((o) => [o.token, o.value]),\n);\n\n/** Map lex value -> short token. */\nexport const OPEN_TO_VALUE_TO_TOKEN: Record<string, string> = Object.fromEntries(\n OPEN_TO_OPTIONS.map((o) => [o.value, o.token]),\n);\n\n/** All valid tokens, useful for runtime validation. */\nexport const OPEN_TO_TOKENS: readonly string[] = OPEN_TO_OPTIONS.map((o) => o.token);\n\n/** Resolve a token to its lex value, returning `undefined` if unknown. */\nexport function openToTokenToValue(token: string | undefined | null): string | undefined {\n if (!token) return undefined;\n return OPEN_TO_TOKEN_TO_VALUE[token];\n}\n\n/** Resolve a lex value to its token, returning `undefined` if unknown. */\nexport function openToValueToToken(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return OPEN_TO_VALUE_TO_TOKEN[value];\n}\n\n/**\n * Legacy aliases — tokens the lexicon used to expose but doesn't anymore.\n * Records written before the lexicon migration may still carry them; resolve\n * them to the closest current `labelKey` for display.\n */\nconst OPEN_TO_LEGACY_ALIASES: Record<string, string> = {\n 'id.sifa.defs#mentoring': 'mentoringOthers',\n};\n\nconst OPEN_TO_LABEL_KEY_MAP: Record<string, string> = {\n ...Object.fromEntries(OPEN_TO_OPTIONS.map((o) => [o.value, o.labelKey])),\n ...OPEN_TO_LEGACY_ALIASES,\n};\n\n/**\n * Resolve a `labelKey` for an `openToWorkStatus` token. Returns `undefined`\n * for tokens not in the canonical set or the legacy alias map, so callers\n * can choose their own fallback (e.g. render the raw value).\n */\nexport function getOpenToLabelKey(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return OPEN_TO_LABEL_KEY_MAP[value];\n}\n\n/**\n * Legacy `openToWorkStatus` values mapped to their current canonical value.\n * Mirrors {@link OPEN_TO_LEGACY_ALIASES} but resolves to the full lex value\n * (not just the `labelKey`) so it can rewrite stored records.\n */\nexport const OPEN_TO_LEGACY_VALUE_ALIASES: Record<string, string> = {\n 'id.sifa.defs#mentoring': 'id.sifa.defs#mentoringOthers',\n};\n\n/**\n * Normalize a list of `openTo` values: resolve legacy aliases to their\n * canonical value, then dedup while preserving first-seen order. Unknown tokens\n * pass through untouched (forward-compat). Used by the editor (so a legacy token\n * maps onto a real option and migrates forward on save) and by display (so a\n * record carrying both the legacy and canonical token renders a single badge).\n */\nexport function normalizeOpenTo(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const value of values) {\n const canonical = OPEN_TO_LEGACY_VALUE_ALIASES[value] ?? value;\n if (seen.has(canonical)) continue;\n seen.add(canonical);\n out.push(canonical);\n }\n return out;\n}\n","/**\n * Workplace-type taxonomy. Mirrors `id.sifa.defs#workplaceType.knownValues`\n * from sifa-lexicons. `remote` is retained for legacy records but the scoped\n * variants (`remoteLocal`, `remoteRegion`, `remoteGlobal`) are preferred for\n * new records per the lexicon description.\n */\n\nexport interface WorkplaceTypeOption {\n value: string;\n label: string;\n}\n\nexport const WORKPLACE_TYPE_OPTIONS: WorkplaceTypeOption[] = [\n { value: 'id.sifa.defs#onSite', label: 'On-site' },\n { value: 'id.sifa.defs#hybrid', label: 'Hybrid' },\n { value: 'id.sifa.defs#remoteLocal', label: 'Remote (same country)' },\n { value: 'id.sifa.defs#remoteRegion', label: 'Remote (same region)' },\n { value: 'id.sifa.defs#remoteGlobal', label: 'Remote (anywhere)' },\n];\n\nexport const WORKPLACE_TYPE_LABELS: Record<string, string> = {\n ...Object.fromEntries(WORKPLACE_TYPE_OPTIONS.map((o) => [o.value, o.label])),\n 'id.sifa.defs#remote': 'Remote',\n};\n\n/** Resolve a label for a workplace-type token. Falls back to the raw value. */\nexport function getWorkplaceTypeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return WORKPLACE_TYPE_LABELS[value] ?? value;\n}\n\n/**\n * Legacy workplace tokens the lexicon retains for old records, mapped to their\n * current canonical token. `id.sifa.defs#remote` is \"Treated as remoteGlobal by\n * AppViews\" per the lexicon, so it resolves to the scoped `remoteGlobal`.\n */\nexport const WORKPLACE_TYPE_LEGACY_ALIASES: Record<string, string> = {\n 'id.sifa.defs#remote': 'id.sifa.defs#remoteGlobal',\n};\n\n/**\n * Normalize a list of workplace-type tokens: resolve legacy aliases to their\n * canonical token, then dedup while preserving first-seen order. Unknown tokens\n * pass through untouched (forward-compat). Used by the editor (so a legacy token\n * maps onto a real option and migrates forward on save) and by display (so a\n * record carrying both the legacy and canonical token renders a single badge).\n */\nexport function normalizeWorkplaceTypes(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const value of values) {\n const canonical = WORKPLACE_TYPE_LEGACY_ALIASES[value] ?? value;\n if (seen.has(canonical)) continue;\n seen.add(canonical);\n out.push(canonical);\n }\n return out;\n}\n","/**\n * Platform identifiers, labels, and URL helpers used in profile external accounts.\n *\n * This file is intentionally data-only -- icon mapping is platform-specific\n * (React DOM components on web, React Native components on mobile) and lives\n * in the consumer.\n */\n\nexport const PLATFORM_LABELS = {\n bluesky: 'Bluesky',\n github: 'GitHub',\n codeberg: 'Codeberg',\n gitlab: 'GitLab',\n forgejo: 'Forgejo',\n gitea: 'Gitea',\n linkedin: 'LinkedIn',\n youtube: 'YouTube',\n twitter: 'X (Twitter)',\n instagram: 'Instagram',\n substack: 'Substack',\n tangled: 'Tangled',\n dns: 'Domain',\n website: 'Website',\n rss: 'RSS',\n fediverse: 'Fediverse',\n orcid: 'ORCID',\n keyoxide: 'Keyoxide',\n} as const;\n\nexport type PlatformId = keyof typeof PLATFORM_LABELS;\n\n/** Prefix of the lexicon platform knownValue tokens (e.g. id.sifa.defs#platformLinkedin). */\nconst PLATFORM_TOKEN_PREFIX = 'id.sifa.defs#platform';\n\n/**\n * Normalize a platform value to the short code used throughout the app (the\n * editor, the API `VALID_PLATFORMS` enum, the DB, and {@link PLATFORM_LABELS}).\n *\n * External-account records may carry `platform` as the raw lexicon knownValue\n * token (`id.sifa.defs#platformLinkedin`) instead of the short code — written by\n * some third-party apps. This maps the token to its lowercase suffix\n * (`linkedin`) and passes short codes / unknown values through unchanged.\n */\n/**\n * Synonyms written by third-party tools and keytrace claims (whose `type` is\n * surfaced as the platform) for the same underlying network, mapped to the\n * canonical short code. Without this, a keytrace-verified Mastodon account\n * arrives as `activitypub`, an unknown platform that renders as a generic\n * website and is skipped by Fediverse ingestion.\n */\nconst PLATFORM_ALIASES: Record<string, PlatformId> = {\n activitypub: 'fediverse',\n mastodon: 'fediverse',\n};\n\nexport function normalizePlatformId(platform: string): string {\n const code = platform.startsWith(PLATFORM_TOKEN_PREFIX)\n ? platform.slice(PLATFORM_TOKEN_PREFIX.length).toLowerCase()\n : platform;\n return PLATFORM_ALIASES[code.toLowerCase()] ?? code;\n}\n\nexport function isKnownPlatform(platform: string): platform is PlatformId {\n return platform in PLATFORM_LABELS;\n}\n\nexport function getPlatformLabel(platform: string): string {\n const normalized = normalizePlatformId(platform);\n return isKnownPlatform(normalized) ? PLATFORM_LABELS[normalized] : PLATFORM_LABELS.website;\n}\n\n/** Platforms excluded from the \"Add Links\" dropdown (auto-derived or not accepted by API). */\nconst EXCLUDED_FROM_DROPDOWN = new Set<PlatformId>(['bluesky', 'dns', 'tangled']);\n\n/** Platforms available in the \"Add Links\" dropdown. */\nexport const PLATFORM_OPTIONS: ReadonlyArray<{ value: PlatformId; label: string }> = (\n Object.entries(PLATFORM_LABELS) as [PlatformId, string][]\n)\n .filter(([value]) => !EXCLUDED_FROM_DROPDOWN.has(value))\n .map(([value, label]) => ({ value, label }));\n\n/**\n * Build a favicon URL for a given site URL using Google's public favicon service.\n * Returns `null` if the URL cannot be parsed.\n */\nexport function getFaviconUrl(siteUrl: string): string | null {\n try {\n const { hostname } = new URL(siteUrl);\n return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(hostname)}&sz=32`;\n } catch {\n return null;\n }\n}\n","export const SKILL_CATEGORIES = [\n { value: 'technical', label: 'Technical' },\n { value: 'business', label: 'Business' },\n { value: 'creative', label: 'Creative' },\n { value: 'interpersonal', label: 'Interpersonal' },\n { value: 'industry', label: 'Industry' },\n { value: 'community', label: 'Community' },\n { value: 'security', label: 'Security' },\n] as const;\n\nexport type SkillCategory = (typeof SKILL_CATEGORIES)[number]['value'];\n\nexport const CATEGORY_ORDER: ReadonlyArray<SkillCategory> = SKILL_CATEGORIES.map((c) => c.value);\n\nexport const CATEGORY_LABELS: Record<SkillCategory | 'other', string> = {\n ...(Object.fromEntries(SKILL_CATEGORIES.map((c) => [c.value, c.label])) as Record<\n SkillCategory,\n string\n >),\n other: 'Other',\n};\n","import type { ProfileSkill } from '../types/index.js';\n\nimport { CATEGORY_ORDER } from './skill-categories.js';\n\nexport type MergedProfileSkill = ProfileSkill & {\n mergedRkeys: string[];\n positionRkeys?: string[];\n};\n\n/**\n * Collapses skills that resolve to the same name (case-insensitive, trimmed).\n *\n * LinkedIn import creates one skill record per (skill, position) pair, so a\n * profile can have several \"Ruby\" rows. We surface them as a single chip with\n * all underlying rkeys exposed via `mergedRkeys` so edit/delete can fan out.\n */\nexport function dedupeSkills(skills: ProfileSkill[]): MergedProfileSkill[] {\n const groups = new Map<string, MergedProfileSkill>();\n\n for (const skill of skills) {\n const key = skill.name.trim().toLowerCase();\n const existing = groups.get(key);\n const positions = (skill as ProfileSkill & { positionRkeys?: string[] }).positionRkeys ?? [];\n\n if (!existing) {\n groups.set(key, {\n ...skill,\n mergedRkeys: [skill.rkey],\n positionRkeys: [...positions],\n });\n continue;\n }\n\n existing.mergedRkeys.push(skill.rkey);\n if (!existing.category && skill.category) existing.category = skill.category;\n if ((skill.endorsementCount ?? 0) > (existing.endorsementCount ?? 0)) {\n existing.endorsementCount = skill.endorsementCount;\n }\n if (skill.endorsed) existing.endorsed = true;\n if (skill.activityBacked) existing.activityBacked = true;\n const merged = new Set([...(existing.positionRkeys ?? []), ...positions]);\n existing.positionRkeys = Array.from(merged);\n }\n\n return Array.from(groups.values());\n}\n\n/**\n * Groups skills by category in CATEGORY_ORDER, with unknown/empty categories\n * collected under \"other\". Within each group: sorted by endorsementCount desc,\n * then alphabetical by name. Empty groups are omitted.\n */\nexport function groupSkillsByCategory<T extends ProfileSkill>(skills: T[]): [string, T[]][] {\n const grouped = new Map<string, T[]>();\n\n for (const skill of skills) {\n const normalised = skill.category?.toLowerCase().trim() ?? '';\n const key = (CATEGORY_ORDER as readonly string[]).includes(normalised) ? normalised : 'other';\n const bucket = grouped.get(key) ?? [];\n bucket.push(skill);\n grouped.set(key, bucket);\n }\n\n for (const [, groupSkills] of grouped) {\n groupSkills.sort((a, b) => {\n const countDiff = (b.endorsementCount ?? 0) - (a.endorsementCount ?? 0);\n if (countDiff !== 0) return countDiff;\n return a.name.localeCompare(b.name);\n });\n }\n\n const ordered: [string, T[]][] = [];\n for (const cat of CATEGORY_ORDER) {\n const group = grouped.get(cat);\n if (group?.length) ordered.push([cat, group]);\n }\n const otherGroup = grouped.get('other');\n if (otherGroup?.length) ordered.push(['other', otherGroup]);\n\n return ordered;\n}\n","/**\n * App-category taxonomy for AT Protocol apps tracked by Sifa.\n *\n * Categories group apps by what kind of activity they produce (Posts, Photos,\n * Code, ...). They drive the pill-size icon shown in `<AppPill>` and the\n * fallback glyph used in activity-card headers when no app-specific logo\n * exists.\n *\n * This file is intentionally data-only -- icon mapping is renderer-specific\n * (React DOM Phosphor components on web, React Native components on mobile)\n * and lives in the consumer. The `phosphorIcon` field is the Phosphor icon\n * NAME, not a component reference.\n *\n * Categories are an internal grouping; we do not surface this taxonomy in\n * public-facing copy.\n */\n\nexport const APP_CATEGORIES = {\n Articles: { phosphorIcon: 'Article' },\n Chat: { phosphorIcon: 'ChatsCircle' },\n Code: { phosphorIcon: 'Code' },\n Domains: { phosphorIcon: 'Globe' },\n Endorsements: { phosphorIcon: 'HandHeart' },\n Events: { phosphorIcon: 'CalendarBlank' },\n Links: { phosphorIcon: 'LinkSimple' },\n Lists: { phosphorIcon: 'ListBullets' },\n Music: { phosphorIcon: 'MusicNote' },\n Pages: { phosphorIcon: 'Browser' },\n Pastes: { phosphorIcon: 'Clipboard' },\n Photos: { phosphorIcon: 'Camera' },\n Places: { phosphorIcon: 'MapPin' },\n Posts: { phosphorIcon: 'ChatCircle' },\n 'Q&A': { phosphorIcon: 'Question' },\n Recipes: { phosphorIcon: 'CookingPot' },\n Research: { phosphorIcon: 'Path' },\n Reviews: { phosphorIcon: 'Star' },\n Slides: { phosphorIcon: 'Presentation' },\n Social: { phosphorIcon: 'UsersThree' },\n Verification: { phosphorIcon: 'Key' },\n Video: { phosphorIcon: 'VideoCamera' },\n} as const;\n\nexport type AppCategoryId = keyof typeof APP_CATEGORIES;\n\nexport const APP_CATEGORY_IDS = Object.keys(APP_CATEGORIES) as AppCategoryId[];\n\nexport function isAppCategory(value: string): value is AppCategoryId {\n return Object.prototype.hasOwnProperty.call(APP_CATEGORIES, value);\n}\n\nexport function getAppCategoryIcon(category: AppCategoryId): string {\n return APP_CATEGORIES[category].phosphorIcon;\n}\n","/**\n * Maps every AT Protocol app Sifa tracks to its `AppCategoryId`. Single source\n * of truth for what category an app belongs to; sifa-api and sifa-web both\n * import from here.\n *\n * Add a new app: pick the category whose generic glyph best represents the\n * activity. If no existing category fits, add a new one to APP_CATEGORIES\n * rather than introducing a per-app override.\n */\n\nimport type { AppCategoryId } from './app-categories.js';\n\nexport const APP_CATEGORY_MAP = {\n // Backend-scanned (sifa-api APP_REGISTRY)\n bluesky: 'Posts',\n tangled: 'Code',\n github: 'Code',\n smokesignal: 'Events',\n flashes: 'Photos',\n grain: 'Photos',\n whitewind: 'Articles',\n frontpage: 'Links',\n pastesphere: 'Pastes',\n standard: 'Articles',\n aetheros: 'Pages',\n roomy: 'Social',\n keytrace: 'Verification',\n popfeed: 'Reviews',\n streamplace: 'Video',\n semble: 'Research',\n youandme: 'Social',\n leaflet: 'Articles',\n colibri: 'Social',\n collectivesocial: 'Lists',\n bookhive: 'Reviews',\n beaconbits: 'Places',\n passports: 'Places',\n asq: 'Q&A',\n spark: 'Posts',\n nooki: 'Social',\n atstore: 'Reviews',\n plyr: 'Music',\n anisota: 'Posts',\n atfund: 'Endorsements',\n crate: 'Articles',\n atmorsvp: 'Events',\n opensocial: 'Social',\n // Kevara speaker-directory listing — a professional speaking-availability\n // declaration (talk topics, formats like keynote/panel/conference-talk).\n // Grouped under Events as the closest fit (speaking engagements).\n kevara: 'Events',\n // Marque domain registrar — a domain registration record is a dated\n // identity/ownership action, surfaced as a \"registered a domain\" event.\n marque: 'Domains',\n // ATCR (io.atcr) — distributed OCI container registry. The portfolio entry\n // is io.atcr.repo.page (a published repository with a markdown README);\n // manifests and tags are low-level artifacts excluded backend-side.\n atcr: 'Code',\n // Batch onboard — apps surfaced on high-volume profiles. Each gives its\n // collections a named pill + category icon instead of a raw NSID.\n mcp: 'Code', // app.mcp.server — published MCP servers (name/tools/language)\n userinput: 'Social', // app.userinput — roadmap discussions + replies\n minomobi: 'Music', // com.minomobi.music.composition — authored music\n voxport: 'Video', // com.voxport.podcast.series — podcast series\n badges: 'Verification', // community.lexicon.badge.award — signed earned credentials\n atvouch: 'Endorsements', // dev.atvouch.graph.vouch — trust vouches\n watsm: 'Code', // io.calabro.watsm.program — published WASM programs\n plonk: 'Pastes', // li.plonk.paste — text pastes\n alternativeproto: 'Links', // net.alternativeproto.submission — app-directory listings\n papili: 'Links', // one.papili.post — link posts\n vit: 'Code', // org.v-it.skill — published agent skills\n lifepo: 'Social', // st.lifepo.lifeEvent — life-event timeline\n streamthought: 'Posts', // stream.thought.blip — microblog thoughts\n waow: 'Photos', // tech.waow.* — doodl drawings (dominant), polls, slides\n lichen: 'Pages', // wiki.lichen — wiki notes + wikis\n // Onboard from aramzs.xyz profile audit — new named pills.\n aetherdocs: 'Slides', // os.aether.docs.presentation — authored slide decks\n kich: 'Recipes', // io.kich.recipe.recipe — authored recipes\n margin: 'Research', // at.margin.{note,annotation} — web-annotation notes with a body\n // Onboard from moll.dev profile audit.\n recipe: 'Recipes', // exchange.recipe.recipe — authored recipes on recipe.exchange\n\n // Web-only (rendered in pills/cards via sifa-web atproto-apps.ts;\n // no backend scan collection yet)\n linkat: 'Links',\n kipclip: 'Links',\n statusphere: 'Social',\n} as const satisfies Record<string, AppCategoryId>;\n\nexport type KnownAppId = keyof typeof APP_CATEGORY_MAP;\n\nexport function isKnownAppId(appId: string): appId is KnownAppId {\n return Object.prototype.hasOwnProperty.call(APP_CATEGORY_MAP, appId);\n}\n\nexport function categoryForApp(appId: string): AppCategoryId | undefined {\n return isKnownAppId(appId) ? APP_CATEGORY_MAP[appId] : undefined;\n}\n","{\n \"$schema\": \"https://sifa.id/schemas/activity-tiers/v1.json\",\n \"version\": \"1.0.0\",\n \"updated\": \"2026-05-28\",\n \"tiers\": {\n \"creation\": {\n \"label\": \"Made\",\n \"description\": \"Substantive records the actor authored: posts, articles, repos, galleries, livestreams, RSVPs, CV entries. Surfaced on the public profile and in the network timeline.\",\n \"shownOnPublicProfile\": true\n },\n \"action\": {\n \"label\": \"Did\",\n \"description\": \"Engagement records (likes, reposts, follows, votes, stars, reactions). Visible to the actor on the 'What is public about me' page and on the originating app, but not surfaced on the Sifa public profile.\",\n \"shownOnPublicProfile\": false\n },\n \"filtered\": {\n \"label\": null,\n \"description\": \"Configuration, infrastructure, moderation, game state, ephemeral consumption signals (bookmarks, highlights), and other records Sifa does not display anywhere. The records remain public on the actor's PDS regardless.\",\n \"shownOnPublicProfile\": false\n }\n },\n \"lexicons\": {\n \"app.bsky.feed.post\": {\n \"tier\": \"creation\",\n \"app\": \"bluesky\",\n \"notes\": \"Ambiguous: many posts are casual, but the lexicon also carries long-form posts and threads. Treated as creation; empty quote-posts (no text + record embed) are filtered at the consumer layer, not here.\"\n },\n \"app.bsky.feed.like\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.feed.repost\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.feed.generator\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Feed generator definition record, not personal activity.\"\n },\n \"app.bsky.graph.follow\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.graph.block\": { \"tier\": \"filtered\", \"app\": \"bluesky\", \"notes\": \"Moderation record.\" },\n \"app.bsky.graph.mute\": { \"tier\": \"filtered\", \"app\": \"bluesky\", \"notes\": \"Moderation record.\" },\n \"app.bsky.graph.listblock\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Moderation record.\"\n },\n \"app.bsky.graph.listitem\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"List membership; rendered via the parent list, not as standalone activity.\"\n },\n \"app.bsky.graph.list\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"User-curated list metadata; not surfaced as profile activity.\"\n },\n \"app.bsky.graph.starterpack\": { \"tier\": \"filtered\", \"app\": \"bluesky\" },\n \"app.bsky.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"sh.tangled.repo\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.repo.issue\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.repo.pull\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.feed.star\": { \"tier\": \"action\", \"app\": \"tangled\" },\n \"sh.tangled.graph.follow\": { \"tier\": \"action\", \"app\": \"tangled\" },\n \"sh.tangled.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"tangled\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"community.lexicon.calendar.rsvp\": {\n \"tier\": \"creation\",\n \"app\": \"smokesignal\",\n \"notes\": \"Ambiguous: RSVPs are reactions to events, but they are public commitments and the only Smoke Signal record Sifa scans today. Classified as creation.\"\n },\n \"events.smokesignal.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"smokesignal\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"blue.flashes.feed.post\": { \"tier\": \"creation\", \"app\": \"flashes\" },\n\n \"social.grain.gallery\": { \"tier\": \"creation\", \"app\": \"grain\" },\n \"social.grain.gallery.item\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Item-within-gallery; rendered via parent gallery.\"\n },\n \"social.grain.photo\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Raw photo asset; surfaced via the gallery that references it.\"\n },\n \"social.grain.photo.exif\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"EXIF metadata for a photo.\"\n },\n \"social.grain.story\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Ephemeral story format.\"\n },\n\n \"com.whtwnd.blog.entry\": { \"tier\": \"creation\", \"app\": \"whitewind\" },\n\n \"fyi.unravel.frontpage.post\": { \"tier\": \"creation\", \"app\": \"frontpage\" },\n \"fyi.unravel.frontpage.vote\": { \"tier\": \"action\", \"app\": \"frontpage\" },\n\n \"social.psky.feed.post\": { \"tier\": \"creation\", \"app\": \"picosky\" },\n\n \"link.pastesphere.snippet\": { \"tier\": \"creation\", \"app\": \"pastesphere\" },\n\n \"site.standard.document\": { \"tier\": \"creation\", \"app\": \"standard\" },\n\n \"computer.aetheros.page\": { \"tier\": \"creation\", \"app\": \"aetheros\" },\n\n \"space.roomy.space.personal\": { \"tier\": \"creation\", \"app\": \"roomy\" },\n\n \"dev.keytrace.claim\": { \"tier\": \"creation\", \"app\": \"keytrace\" },\n\n \"social.popfeed.feed.review\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.post\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.note\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.like\": { \"tier\": \"action\", \"app\": \"popfeed\" },\n \"social.popfeed.challenge.participation\": {\n \"tier\": \"filtered\",\n \"app\": \"popfeed\",\n \"notes\": \"Challenge participation tracking.\"\n },\n \"social.popfeed.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"popfeed\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"place.stream.livestream\": { \"tier\": \"creation\", \"app\": \"streamplace\" },\n \"place.stream.broadcast.origin\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Broadcast origin/infrastructure record.\"\n },\n \"place.stream.key\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Stream key — sensitive infrastructure record.\"\n },\n \"place.stream.metadata.configuration\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Stream configuration metadata.\"\n },\n \"place.stream.chat.message\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Ephemeral chat message.\"\n },\n \"place.stream.chat.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Chat profile metadata.\"\n },\n\n \"app.sidetrail.trail\": { \"tier\": \"creation\", \"app\": \"semble\" },\n \"app.sidetrail.walk\": { \"tier\": \"creation\", \"app\": \"semble\" },\n\n \"at.youandme.connection\": { \"tier\": \"creation\", \"app\": \"youandme\" },\n\n \"pub.leaflet.comment\": { \"tier\": \"creation\", \"app\": \"leaflet\" },\n \"pub.leaflet.interactions.recommend\": { \"tier\": \"action\", \"app\": \"leaflet\" },\n \"pub.leaflet.authFullPermissions\": {\n \"tier\": \"filtered\",\n \"app\": \"leaflet\",\n \"notes\": \"OAuth permission record.\"\n },\n\n \"social.colibri.membership\": { \"tier\": \"creation\", \"app\": \"colibri\" },\n \"social.colibri.message\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Chat message — high-volume conversational signal, not portfolio.\"\n },\n \"social.colibri.reaction\": { \"tier\": \"filtered\", \"app\": \"colibri\", \"notes\": \"Chat reaction.\" },\n \"social.colibri.channel\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Channel definition.\"\n },\n \"social.colibri.community\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Community definition.\"\n },\n \"social.colibri.approval\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Moderation approval record.\"\n },\n \"social.colibri.category\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Category metadata.\"\n },\n \"social.colibri.channel.read\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Read-state marker.\"\n },\n \"social.colibri.actor.data\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Actor metadata.\"\n },\n \"social.colibri.richtext.facet\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Richtext facet sub-record.\"\n },\n\n \"app.collectivesocial.feed.list\": {\n \"tier\": \"creation\",\n \"app\": \"collectivesocial\",\n \"notes\": \"Auto-created default Inbox lists are filtered at the consumer layer via isDefault=true predicate.\"\n },\n\n \"net.alternativeproto.vote\": {\n \"tier\": \"action\",\n \"notes\": \"Vote record on a third-party protocol.\"\n },\n \"network.cosmik.collection\": {\n \"tier\": \"filtered\",\n \"notes\": \"Stale registry id — Cosmik formerly in app registry.\"\n },\n \"network.cosmik.collectionLink\": { \"tier\": \"filtered\" },\n \"network.cosmik.connection\": { \"tier\": \"filtered\" },\n \"network.cosmik.follow\": { \"tier\": \"filtered\" },\n \"network.cosmik.card\": { \"tier\": \"filtered\", \"notes\": \"Link-in-bio card; consumption signal.\" },\n\n \"social.pinksky.app.preference\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Pinkleap (Bluesky client) app preferences.\"\n },\n\n \"at.margin.bookmark\": {\n \"tier\": \"filtered\",\n \"notes\": \"Bookmark — consumption signal, not creation.\"\n },\n \"at.margin.highlight\": {\n \"tier\": \"filtered\",\n \"notes\": \"Highlight — consumption signal, not creation.\"\n },\n \"community.lexicon.bookmarks.bookmark\": {\n \"tier\": \"filtered\",\n \"notes\": \"Bookmark — consumption signal.\"\n },\n \"blue.linkat.board\": { \"tier\": \"filtered\", \"notes\": \"Link-in-bio board; consumption signal.\" },\n\n \"dev.skyboard.board\": { \"tier\": \"filtered\", \"notes\": \"Skyboard task-board metadata.\" },\n \"dev.skyboard.op\": { \"tier\": \"filtered\", \"notes\": \"Skyboard operation log.\" },\n \"dev.skyboard.task\": { \"tier\": \"filtered\", \"notes\": \"Skyboard task record.\" },\n\n \"net.anisota.player.state\": { \"tier\": \"filtered\", \"notes\": \"Anisota game player state.\" },\n \"xyz.statusphere.status\": {\n \"tier\": \"filtered\",\n \"notes\": \"Statusphere emoji status — leisure signal.\"\n },\n\n \"id.sifa.profile.self\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Sifa professional profile root.\"\n },\n \"id.sifa.profile.position\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.education\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.skill\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.certification\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.project\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.volunteering\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.publication\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.course\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.honor\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.language\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.externalAccount\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.location\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.presentation\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.presentationDelivery\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.endorsement\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Endorsement authored by the actor about another profile.\"\n },\n \"id.sifa.endorsement.confirmation\": {\n \"tier\": \"action\",\n \"app\": \"sifa\",\n \"notes\": \"Confirmation/acceptance of an endorsement received.\"\n },\n \"id.sifa.graph.follow\": { \"tier\": \"action\", \"app\": \"sifa\" },\n \"id.sifa.graph.connection\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Mutual professional connection record.\"\n },\n \"id.sifa.project.self\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.project.member\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.project.membership\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.meeting\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.authProfile\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authProfileAccess\": {\n \"tier\": \"filtered\",\n \"app\": \"sifa\",\n \"notes\": \"OAuth profile-access record.\"\n },\n \"id.sifa.authProject\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authConnection\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authMeet\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n\n \"forum.barazo.post\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.community.member\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.reputation.event\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.reaction\": { \"tier\": \"action\", \"app\": \"barazo\" },\n \"forum.barazo.reply\": {\n \"tier\": \"action\",\n \"app\": \"barazo\",\n \"notes\": \"Short conversational reply — engagement signal.\"\n },\n \"forum.barazo.flag\": { \"tier\": \"filtered\", \"app\": \"barazo\", \"notes\": \"Moderation flag.\" }\n }\n}\n","import { z } from 'zod';\n\nimport rawTaxonomy from './activity-tiers.json' with { type: 'json' };\n\nexport type ActivityTier = 'creation' | 'action' | 'filtered';\n\nexport interface TierMeta {\n label: string | null;\n description: string;\n shownOnPublicProfile: boolean;\n}\n\nexport interface LexiconEntry {\n tier: ActivityTier;\n app?: string;\n notes?: string;\n}\n\nexport interface ActivityTaxonomy {\n version: string;\n updated: string;\n tiers: Record<ActivityTier, TierMeta>;\n lexicons: Record<string, LexiconEntry>;\n}\n\nconst tierMetaSchema = z.object({\n label: z.string().nullable(),\n description: z.string(),\n shownOnPublicProfile: z.boolean(),\n});\n\nconst lexiconEntrySchema = z.object({\n tier: z.enum(['creation', 'action', 'filtered']),\n app: z.string().optional(),\n notes: z.string().optional(),\n});\n\nconst taxonomySchema = z.object({\n version: z.string(),\n updated: z.string(),\n tiers: z.object({\n creation: tierMetaSchema,\n action: tierMetaSchema,\n filtered: tierMetaSchema,\n }),\n lexicons: z.record(z.string(), lexiconEntrySchema),\n});\n\nconst parsed: ActivityTaxonomy = taxonomySchema.parse(rawTaxonomy);\n\nexport const ACTIVITY_TIERS: Readonly<ActivityTaxonomy> = Object.freeze(parsed);\n\n/**\n * Returns the activity tier for a given AT Protocol NSID.\n * Returns 'filtered' for unknown/unclassified NSIDs (safe default — won't\n * leak unknown records to public profile surfaces).\n */\nexport function getActivityTier(nsid: string): ActivityTier {\n if (!nsid) return 'filtered';\n const entry = ACTIVITY_TIERS.lexicons[nsid];\n return entry ? entry.tier : 'filtered';\n}\n\n/**\n * Returns the full lexicon entry (tier + app + notes), or null if unknown.\n */\nexport function getLexiconEntry(nsid: string): LexiconEntry | null {\n if (!nsid) return null;\n const entry = ACTIVITY_TIERS.lexicons[nsid];\n return entry ?? null;\n}\n\n/**\n * Returns tier metadata (label, description, public visibility).\n */\nexport function getTierMeta(tier: ActivityTier): TierMeta {\n return ACTIVITY_TIERS.tiers[tier];\n}\n\n/**\n * Returns the taxonomy version + updated date for diagnostics and\n * version-skew detection between SDK consumers and the canonical taxonomy.\n */\nexport function getActivityTaxonomyVersion(): { version: string; updated: string } {\n return { version: ACTIVITY_TIERS.version, updated: ACTIVITY_TIERS.updated };\n}\n","/**\n * Presentation-role taxonomy. Mirrors `id.sifa.defs#presentationRole.knownValues`\n * from sifa-lexicons. The role describes how the person took part in a single\n * delivery (it can differ between deliveries of the same presentation).\n */\n\nexport interface PresentationRoleOption {\n value: string;\n label: string;\n}\n\nexport const PRESENTATION_ROLE_OPTIONS: PresentationRoleOption[] = [\n { value: 'id.sifa.defs#presenter', label: 'Presenter' },\n { value: 'id.sifa.defs#panelist', label: 'Panelist' },\n { value: 'id.sifa.defs#keynote', label: 'Keynote' },\n { value: 'id.sifa.defs#workshop', label: 'Workshop' },\n { value: 'id.sifa.defs#host', label: 'Host' },\n];\n\nexport const PRESENTATION_ROLE_LABELS: Record<string, string> = Object.fromEntries(\n PRESENTATION_ROLE_OPTIONS.map((o) => [o.value, o.label]),\n);\n\n/** Resolve a label for a presentation-role token. Falls back to the raw value. */\nexport function getPresentationRoleLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return PRESENTATION_ROLE_LABELS[value] ?? value;\n}\n","/**\n * Presentation link-type taxonomy. Mirrors\n * `id.sifa.defs#presentationLinkType.knownValues` from sifa-lexicons. Used to\n * pick an icon and a default label for a presentation or delivery link.\n */\n\nexport interface PresentationLinkTypeOption {\n value: string;\n label: string;\n}\n\nexport const PRESENTATION_LINK_TYPE_OPTIONS: PresentationLinkTypeOption[] = [\n { value: 'id.sifa.defs#linkSlides', label: 'Slides' },\n { value: 'id.sifa.defs#linkRecording', label: 'Recording' },\n { value: 'id.sifa.defs#linkEvent', label: 'Event page' },\n { value: 'id.sifa.defs#linkRegistration', label: 'Registration' },\n { value: 'id.sifa.defs#linkWriteup', label: 'Write-up' },\n { value: 'id.sifa.defs#linkOther', label: 'Link' },\n];\n\nexport const PRESENTATION_LINK_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n PRESENTATION_LINK_TYPE_OPTIONS.map((o) => [o.value, o.label]),\n);\n\n/** Resolve a label for a presentation link-type token. Falls back to the raw value. */\nexport function getPresentationLinkTypeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return PRESENTATION_LINK_TYPE_LABELS[value] ?? value;\n}\n","/**\n * Display labels for `community.lexicon.calendar.event` mode and status tokens.\n * A presentation delivery stores the full upstream token (so it stays faithful\n * to the source event); these maps turn the token into a human label.\n */\n\nexport const CALENDAR_EVENT_MODE_LABELS: Record<string, string> = {\n 'community.lexicon.calendar.event#inperson': 'In person',\n 'community.lexicon.calendar.event#virtual': 'Virtual',\n 'community.lexicon.calendar.event#hybrid': 'Hybrid',\n};\n\n/** Resolve a label for a calendar-event mode token. Falls back to the raw value. */\nexport function getCalendarEventModeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return CALENDAR_EVENT_MODE_LABELS[value] ?? value;\n}\n\nexport const CALENDAR_EVENT_STATUS_LABELS: Record<string, string> = {\n 'community.lexicon.calendar.event#scheduled': 'Scheduled',\n 'community.lexicon.calendar.event#cancelled': 'Cancelled',\n 'community.lexicon.calendar.event#postponed': 'Postponed',\n 'community.lexicon.calendar.event#rescheduled': 'Rescheduled',\n 'community.lexicon.calendar.event#planned': 'Planned',\n};\n\n/** Resolve a label for a calendar-event status token. Falls back to the raw value. */\nexport function getCalendarEventStatusLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return CALENDAR_EVENT_STATUS_LABELS[value] ?? value;\n}\n","/**\n * Involvement-kind taxonomy. Mirrors `id.sifa.defs#involvementKind.knownValues`\n * from sifa-lexicons. `label` is the picker/select label; `heading` is the\n * profile section heading a record of this kind renders under (charity records,\n * including mapped legacy `volunteering`, render under \"Volunteering\").\n */\n\nexport interface InvolvementKindOption {\n value: string;\n label: string;\n heading: string;\n}\n\nexport const INVOLVEMENT_KIND_OPTIONS: InvolvementKindOption[] = [\n { value: 'id.sifa.defs#involvementOpenSource', label: 'Open source', heading: 'Open Source' },\n { value: 'id.sifa.defs#involvementCommunity', label: 'Community', heading: 'Community' },\n { value: 'id.sifa.defs#involvementCharity', label: 'Volunteering', heading: 'Volunteering' },\n { value: 'id.sifa.defs#involvementCivic', label: 'Civic', heading: 'Civic' },\n { value: 'id.sifa.defs#involvementOther', label: 'Other', heading: 'Other' },\n];\n\nexport const INVOLVEMENT_KIND_LABELS: Record<string, string> = Object.fromEntries(\n INVOLVEMENT_KIND_OPTIONS.map((o) => [o.value, o.label]),\n);\n\nexport const INVOLVEMENT_KIND_HEADINGS: Record<string, string> = Object.fromEntries(\n INVOLVEMENT_KIND_OPTIONS.map((o) => [o.value, o.heading]),\n);\n\n/** Resolve the select label for an involvement-kind token. Falls back to the raw value. */\nexport function getInvolvementKindLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return INVOLVEMENT_KIND_LABELS[value] ?? value;\n}\n\n/**\n * Resolve the display-section heading for an involvement-kind token. Unknown\n * kinds (including a future token an older client hasn't learned) fall under\n * \"Other\" so a record is never dropped from the profile.\n */\nexport function getInvolvementKindHeading(value: string | undefined | null): string {\n if (!value) return 'Other';\n return INVOLVEMENT_KIND_HEADINGS[value] ?? 'Other';\n}\n","/**\n * Artifact-link-kind taxonomy. Mirrors the bare-string `knownValues` of\n * `id.sifa.defs#artifactLink.kind` from sifa-lexicons. Open set: any string is\n * valid; these are the recognized kinds used to pick an icon and a default label.\n */\n\nexport interface ArtifactLinkKindOption {\n value: string;\n label: string;\n}\n\nexport const ARTIFACT_LINK_KIND_OPTIONS: ArtifactLinkKindOption[] = [\n { value: 'pull-request', label: 'Pull request' },\n { value: 'issue', label: 'Issue' },\n { value: 'commit', label: 'Commit' },\n { value: 'review', label: 'Review' },\n { value: 'release', label: 'Release' },\n { value: 'talk', label: 'Talk' },\n { value: 'video', label: 'Video' },\n { value: 'slides', label: 'Slides' },\n { value: 'article', label: 'Article' },\n { value: 'thread', label: 'Thread' },\n { value: 'dataset', label: 'Dataset' },\n { value: 'edit', label: 'Edit' },\n { value: 'other', label: 'Link' },\n];\n\nexport const ARTIFACT_LINK_KIND_LABELS: Record<string, string> = Object.fromEntries(\n ARTIFACT_LINK_KIND_OPTIONS.map((o) => [o.value, o.label]),\n);\n\n/** Resolve a label for an artifact-link-kind value. Falls back to the raw value. */\nexport function getArtifactLinkKindLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return ARTIFACT_LINK_KIND_LABELS[value] ?? value;\n}\n","/**\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","// Connector words kept lowercase in a title unless they lead the name. Includes\n// a few common non-English ones (Dutch/German/French/Spanish) since the company\n// data is international.\nconst SMALL_WORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'the',\n 'of',\n 'for',\n 'to',\n 'in',\n 'on',\n 'at',\n 'by',\n 'or',\n 'nor',\n 'but',\n 'as',\n 'vs',\n 'via',\n 'with',\n 'de',\n 'del',\n 'van',\n 'von',\n 'der',\n 'den',\n 'het',\n 'la',\n 'le',\n 'y',\n]);\n\n/**\n * True when `value` contains at least one letter outside the ASCII range\n * (accented Latin, Cyrillic, Greek, CJK, Turkish dotted/dotless i, etc).\n *\n * Iterating by code point (not `.length`) matters for astral-plane\n * characters (e.g. some CJK), which are represented as surrogate pairs.\n */\nexport function hasNonAsciiLetter(value: string): boolean {\n for (const char of value) {\n const codePoint = char.codePointAt(0) ?? 0;\n if (codePoint > 0x7f && /\\p{L}/u.test(char)) return true;\n }\n return false;\n}\n\nfunction capitalizeWord(word: string): string {\n // Uppercase the first letter/digit, leaving any leading punctuation\n // (quotes, parens) and the rest of the word untouched.\n return word.replace(\n /^([^\\p{L}\\p{N}]*)(\\p{L})/u,\n (_m, lead: string, ch: string) => lead + ch.toUpperCase(),\n );\n}\n\n/**\n * Best-effort title-case for a company display name.\n *\n * Company names from the PDL crawl are stored all-lowercase (\"spryker\",\n * \"spryker systems gmbh\"), which reads poorly in the UI. This capitalizes them\n * for display. Names that already carry any uppercase (ROR / Wikidata, e.g.\n * \"University of Testing\" or \"IBM\") are assumed correctly cased and returned\n * unchanged, so a proper name is never mangled (\"University Of Testing\").\n *\n * It is intentionally not a canonicalizer: acronyms it can't know about stay\n * word-cased (\"gmbh\" -> \"Gmbh\"). The user's own custom display name is the\n * escape hatch when the heuristic is wrong.\n *\n * Scoped to ASCII-Latin case-bearing strings (decision D8): any name\n * containing a non-ASCII letter (accented Latin, Cyrillic, Greek, CJK,\n * Turkish dotted/dotless i, etc) is returned unchanged. Locale-dependent\n * casing rules (Turkish i/İ vs ı/I is the canonical trap) make naive\n * `toUpperCase`/`toLowerCase` unsafe outside ASCII, and this formatter has\n * no reliable way to pick the right locale for an arbitrary company name.\n *\n * Known limitation: this does not (and cannot) distinguish an intentional\n * all-lowercase ASCII wordmark (\"adidas\", \"thyssenkrupp\") from a\n * PDL-lowercased name that should be title-cased (\"spryker\" -> \"Spryker\").\n * Both are pure ASCII, so both still get title-cased. See sifa-workspace#235.\n */\nexport function formatCompanyName(name: string): string {\n const trimmed = name.trim();\n if (!trimmed || hasNonAsciiLetter(trimmed) || trimmed !== trimmed.toLowerCase()) return trimmed;\n\n let seenWord = false;\n // Split on whitespace but keep the separators so original spacing survives.\n return trimmed\n .split(/(\\s+)/)\n .map((token) => {\n if (token.length === 0 || /^\\s+$/.test(token)) return token;\n const isFirst = !seenWord;\n seenWord = true;\n if (!isFirst && SMALL_WORDS.has(token)) return token;\n return capitalizeWord(token);\n })\n .join('');\n}\n","import { hasNonAsciiLetter } from './company-name.js';\n\n/**\n * Canonical casing for common legal-form designators, keyed by the token with\n * its dots stripped and lowercased (`n.v.` and `nv` both key to `nv`). The value\n * is the canonical LETTER sequence only -- dots are re-applied from the input, so\n * `n.v.` -> `N.V.` and `nv` -> `NV` from the single `nv` entry.\n *\n * Deliberately conservative. Designators whose canonical casing genuinely\n * depends on the dot style (Italian `srl`/`S.r.l.`, `spa`/`S.p.A.`) are OMITTED\n * rather than guessed -- see the module doc on `normalizeLegalForm`. Multi-word\n * forms (`Sp. z o.o.`, `Pty Ltd`) are out of scope for this single-token pass.\n */\nconst CANONICAL_LEGAL_FORMS: Readonly<Record<string, string>> = {\n llc: 'LLC',\n inc: 'Inc',\n ltd: 'Ltd',\n ltda: 'Ltda',\n corp: 'Corp',\n co: 'Co',\n plc: 'PLC',\n llp: 'LLP',\n lp: 'LP',\n gmbh: 'GmbH',\n ag: 'AG',\n ab: 'AB',\n as: 'AS',\n aps: 'ApS',\n oy: 'Oy',\n oyj: 'Oyj',\n nv: 'NV',\n bv: 'BV',\n sa: 'SA',\n sas: 'SAS',\n sarl: 'SARL',\n kk: 'KK',\n sl: 'SL',\n pty: 'Pty',\n};\n\n/**\n * Re-apply `canonical`'s casing onto `token`, letter by letter, keeping every\n * non-letter character (the dots) exactly where the input had them. `token` is\n * guaranteed ASCII (the caller bailed on non-ASCII names) and its letter count\n * equals `canonical.length`, so the index never runs past the end.\n */\nfunction recase(token: string, canonical: string): string {\n let li = 0;\n let out = '';\n for (const ch of token) {\n if (/[A-Za-z]/.test(ch)) {\n out += canonical.charAt(li);\n li += 1;\n } else {\n out += ch;\n }\n }\n return out;\n}\n\n/** Normalize one candidate token, or return it unchanged if it isn't a designator. */\nfunction normalizeToken(token: string): string {\n // Strip dots only; a clean designator token is then a pure ASCII-letter run.\n // A hyphen, comma, paren, or digit means it isn't a bare designator -> skip.\n const letters = token.replace(/\\./g, '');\n if (!/^[A-Za-z]+$/.test(letters)) return token;\n\n const key = letters.toLowerCase();\n const canonical = CANONICAL_LEGAL_FORMS[key];\n // Require a string value, not merely truthy: a bare `map[key]` lookup resolves\n // inherited Object.prototype members, so a token like \"Constructor\" (key\n // `constructor`) or \"__proto__\" returns a function/object that is truthy but\n // not a string, and `recase` would then throw on `.charAt`. This also narrows\n // away the `undefined` from a missing key.\n if (typeof canonical !== 'string') return token;\n\n return recase(token, canonical);\n}\n\n/**\n * Normalize the letter-case of a legal-form designator (GmbH, LLC, N.V., B.V.,\n * S.A., ...) appearing as the trailing whole-word token of a company\n * name. Only that one token is touched; the company name itself is never\n * recased, since brand-wordmark casing is not deterministic (see\n * sifa-workspace#235, deliberately distinct from this pass).\n *\n * The input's dot and spacing style is preserved verbatim -- dotted vs undotted\n * (`N.V.` vs `NV`) is a style choice, so the function never adds, removes, or\n * reorders dots. It only maps `gmbh`/`Gmbh`/`GMBH` -> `GmbH`, `nv` -> `NV`,\n * `n.v.` -> `N.V.`, and so on.\n *\n * Scoped to ASCII-Latin (decision D8, matching `formatCompanyName`): any name\n * containing a non-ASCII letter is returned unchanged, because locale-dependent\n * casing (Turkish i/İ) makes naive upper/lower unsafe. Idempotent: normalizing\n * an already-correct name is a no-op.\n */\nexport function normalizeLegalForm(name: string): string {\n if (!name || hasNonAsciiLetter(name)) return name;\n\n // Split into words and whitespace runs, keeping the separators so the exact\n // original spacing (including leading/trailing) survives the round-trip.\n const parts = name.split(/(\\s+)/);\n const wordIndices: number[] = [];\n for (let i = 0; i < parts.length; i += 1) {\n const part = parts[i];\n if (part !== undefined && part.length > 0 && !/^\\s+$/.test(part)) wordIndices.push(i);\n }\n if (wordIndices.length === 0) return name;\n\n const lastIdx = wordIndices[wordIndices.length - 1];\n if (lastIdx === undefined) return name;\n // Only the TRAILING token is a candidate. Legal-form designators almost always\n // trail the company name (Acme GmbH, Halma PLC); a LEADING designator token is\n // far more likely part of the brand (\"INC Research\", \"AG Innovations\"), so\n // recasing it would corrupt the name. Restricting to the trailing token avoids\n // that whole class of false positives.\n const original = parts[lastIdx];\n if (original === undefined) return name;\n const rewritten = normalizeToken(original);\n if (rewritten === original) return name;\n parts[lastIdx] = rewritten;\n return parts.join('');\n}\n","// Combining diacritical marks (U+0300-U+036F) produced by NFD decomposition.\n// Stripping these after decomposing is the standard way to fold \"é\" -> \"e\"\n// without a per-character lookup table.\nconst COMBINING_MARKS = /[\\u0300-\\u036f]/g;\n\n/**\n * Build a stable dedup/prefix key for a company name (decision D8).\n *\n * NFC-normalizes, case-folds, and strips Latin diacritics so that visually\n * or logically equivalent spellings collapse to one key: \"Nestlé\", \"Nestle\",\n * and \"NESTLE\" all produce the same value. Non-Latin scripts (Cyrillic, CJK,\n * etc) have no Latin diacritics to strip, so they pass through case-folded\n * and NFC-normalized only.\n *\n * This is a pure SDK helper for the in-memory/dedup key. Persisting it as a\n * dedicated column on the sifa-api side is tracked separately\n * (sifa-workspace#229) and out of scope here.\n */\nexport function normalizeCompanyKey(name: string): string {\n const trimmed = name.trim();\n if (!trimmed) return '';\n\n const caseFolded = trimmed.normalize('NFC').toLowerCase();\n return caseFolded.normalize('NFD').replace(COMBINING_MARKS, '').normalize('NFC');\n}\n","/**\n * Format a date string as a relative time (e.g. \"5m ago\", \"3d ago\").\n * Returns an empty string for invalid or future dates.\n */\nexport function formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n if (isNaN(date.getTime())) return '';\n\n const now = Date.now();\n const diffMs = now - date.getTime();\n if (diffMs < 0) return '';\n\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n\n const months = Math.floor(days / 30);\n if (months < 12) return `${months}mo ago`;\n\n const years = Math.floor(months / 12);\n return `${years}y ago`;\n}\n","import type { PresentationDuration } from '../schemas/profile-presentation.js';\n\n/**\n * Format a presentation duration for display. A fixed length renders as\n * \"30 min\"; a range renders as \"20-30 min\". Returns undefined when there is no\n * duration. A range whose bounds are equal, or whose max is missing, renders as\n * a single value.\n */\nexport function formatPresentationDuration(\n duration: PresentationDuration | undefined | null,\n): string | undefined {\n if (!duration) return undefined;\n const { minMinutes, maxMinutes } = duration;\n if (maxMinutes != null && maxMinutes !== minMinutes) {\n return `${minMinutes}-${maxMinutes} min`;\n }\n return `${minMinutes} min`;\n}\n","/**\n * Server-safe timeline date formatters shared by every profile surface.\n */\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n/** Format \"2007-01\" as \"Jan 2007\", pass through year-only strings. */\nexport function formatTimelineDate(dateStr: string): string {\n if (dateStr.length === 4) return dateStr;\n const [year, month] = dateStr.split('-');\n if (!month) return year ?? dateStr;\n const idx = parseInt(month, 10) - 1;\n return `${MONTHS[idx]} ${year}`;\n}\n\n/**\n * Format a date range for display. Handles missing dates, equal start/end,\n * and ongoing entries (showPresent defaults to true).\n */\nexport function formatDateRange(start?: string, end?: string, showPresent = true): string {\n if (!start && !end) return '';\n if (!start) return end ? formatTimelineDate(end) : '';\n const formattedStart = formatTimelineDate(start);\n if (!end) return showPresent ? `${formattedStart} - Present` : formattedStart;\n const formattedEnd = formatTimelineDate(end);\n if (formattedStart === formattedEnd) return formattedStart;\n return `${formattedStart} - ${formattedEnd}`;\n}\n","import type { ProfilePresentationDelivery } from '../types/index.js';\n\nconst CANCELLED_STATUS = 'community.lexicon.calendar.event#cancelled';\nconst KEYNOTE_ROLE = 'id.sifa.defs#keynote';\n\n/** A compact roll-up of a presentation's deliveries for the collapsed view. */\nexport interface PresentationDeliverySummary {\n /** Times the talk was actually delivered (cancelled occasions excluded). */\n count: number;\n /** Most recent year among counted deliveries that carry a date. */\n recentYear?: number;\n /** How many counted deliveries were keynotes. */\n keynoteCount: number;\n /** Up to `venueLimit` distinct event names, most-recent first. */\n venues: string[];\n /** Distinct counted venues beyond the ones listed in `venues`. */\n moreVenues: number;\n}\n\n/**\n * Summarize a talk's delivery history into the signals the profile shows in the\n * collapsed view: how many times it was given, the most recent year, how many\n * were keynotes, and a small sample of the most recent distinct venues.\n *\n * Cancelled occasions are excluded from every figure: a talk that was booked\n * then cancelled was not actually delivered, and counting it would inflate the\n * \"given Nx\" signal.\n */\nexport function summarizePresentationDeliveries(\n deliveries: ProfilePresentationDelivery[] | undefined,\n options: { venueLimit?: number } = {},\n): PresentationDeliverySummary {\n const venueLimit = options.venueLimit ?? 3;\n const counted = (deliveries ?? []).filter((delivery) => delivery.status !== CANCELLED_STATUS);\n const sorted = [...counted].sort((a, b) => (b.date ?? '').localeCompare(a.date ?? ''));\n\n let recentYear: number | undefined;\n for (const delivery of counted) {\n if (!delivery.date) continue;\n const year = Number(delivery.date.slice(0, 4));\n if (!Number.isNaN(year) && (recentYear === undefined || year > recentYear)) {\n recentYear = year;\n }\n }\n\n const seen = new Set<string>();\n const distinctVenues: string[] = [];\n for (const delivery of sorted) {\n const name = delivery.eventName?.trim();\n if (name && !seen.has(name)) {\n seen.add(name);\n distinctVenues.push(name);\n }\n }\n const venues = distinctVenues.slice(0, venueLimit);\n\n return {\n count: counted.length,\n recentYear,\n keynoteCount: counted.filter((delivery) => delivery.role === KEYNOTE_ROLE).length,\n venues,\n moreVenues: distinctVenues.length - venues.length,\n };\n}\n","/**\n * Sort profile section items from newest to oldest.\n *\n * Rules:\n * - Items with no end date (ongoing/current) sort to the top.\n * - Primary sort: end date descending (newest first).\n * - Secondary sort: start date descending (newest first).\n * - Items with no dates sort to the bottom.\n *\n * Date strings are ISO-ish (\"2024\", \"2024-03\", \"2024-03-15\") and\n * lexicographic comparison works correctly for them.\n */\n\ninterface DateRange {\n startDate?: string;\n endDate?: string;\n current?: boolean;\n}\n\ntype DateExtractor<T> = (item: T) => DateRange;\n\nconst FAR_FUTURE = '9999-12-31';\nconst FAR_PAST = '0000-01-01';\n\nexport function sortByDateDesc<T>(items: T[], extract: DateExtractor<T>): T[] {\n return [...items].sort((a, b) => {\n const da = extract(a);\n const db = extract(b);\n\n const endA = da.current ? FAR_FUTURE : (da.endDate ?? '');\n const endB = db.current ? FAR_FUTURE : (db.endDate ?? '');\n\n // Items with any date beat items with no dates at all\n const hasDateA = endA || da.startDate;\n const hasDateB = endB || db.startDate;\n if (hasDateA && !hasDateB) return -1;\n if (!hasDateA && hasDateB) return 1;\n\n // Primary: end date descending\n if (endA !== endB) return endB.localeCompare(endA);\n\n // Secondary: start date descending\n const startA = da.startDate ?? FAR_PAST;\n const startB = db.startDate ?? FAR_PAST;\n return startB.localeCompare(startA);\n });\n}\n\n/**\n * Convenience extractor for items that use `startDate` / `endDate` fields directly.\n * Used by volunteering, projects, and other sections that still use startDate/endDate.\n */\nexport function dateRangeExtractor<\n T extends { startDate?: string; endDate?: string; current?: boolean },\n>(item: T): DateRange {\n return { startDate: item.startDate, endDate: item.endDate, current: item.current };\n}\n\n/**\n * Extractor for lexicon-aligned items that use `startedAt` / `endedAt` fields.\n * Used by positions and education (current derived from !endedAt).\n */\nexport function lexiconDateExtractor<T extends { startedAt?: string; endedAt?: string }>(\n item: T,\n): DateRange {\n return { startDate: item.startedAt, endDate: item.endedAt, current: !item.endedAt };\n}\n\n/**\n * Convenience extractor for items with a single `date` field.\n */\nexport function singleDateExtractor<T extends { date?: string }>(item: T): DateRange {\n return { endDate: item.date };\n}\n\n/**\n * Extractor for certifications which use `issueDate` / `expiryDate`.\n */\nexport function certDateExtractor<T extends { issueDate?: string; expiryDate?: string }>(\n item: T,\n): DateRange {\n return { startDate: item.issueDate, endDate: item.expiryDate ?? item.issueDate };\n}\n","/**\n * Sanitize raw user input into a valid AT Protocol identifier (handle or DID).\n *\n * Handles common mistakes:\n * - Pasting a full Bluesky profile URL\n * - Pasting a raw HTTPS URL to a PDS domain\n * - Using an at:// URI\n * - Prefixing with @\n * - Entering a bare username without .bsky.social\n */\nexport function sanitizeHandleInput(raw: string): string {\n let identifier = raw\n .trim()\n .replace(/^https?:\\/\\/bsky\\.app\\/profile\\//i, '')\n .replace(/^at:\\/\\//i, '')\n .replace(/^@/, '')\n .replace(/^https?:\\/\\//i, '');\n if (!identifier.startsWith('did:')) {\n identifier = identifier.split('/')[0] ?? identifier;\n }\n identifier = identifier.replace(/\\.$/, '');\n if (!identifier.startsWith('did:')) {\n identifier = identifier.toLowerCase();\n }\n\n // Auto-append .bsky.social for bare usernames (no dots, not a DID)\n if (identifier && !identifier.startsWith('did:') && !identifier.includes('.')) {\n identifier = `${identifier}.bsky.social`;\n }\n\n return identifier;\n}\n","import type { LocationValue } from '../types/index.js';\n\n/**\n * Format a LocationValue for display.\n *\n * Prefers `locality` (the community.lexicon.location.address field) and\n * falls back to the legacy `city` slot so values produced before the\n * sifa-api alias migration still render correctly during the additive\n * transition window.\n */\nexport function formatLocation(loc: LocationValue | null | undefined): string {\n if (!loc) return '';\n const locality = loc.locality ?? loc.city;\n const parts = [locality, loc.region, loc.country].filter(Boolean);\n if (loc.postalCode && !locality) {\n return `${loc.postalCode}, ${loc.country}`;\n }\n return parts.join(', ');\n}\n\n/** Parse a display string back into a LocationValue (best-effort for legacy data) */\nexport function parseLocationString(str: string): LocationValue | null {\n if (!str.trim()) return null;\n const parts = str\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length >= 3) {\n return {\n city: parts[0],\n region: parts[1],\n country: parts[parts.length - 1]!,\n };\n }\n if (parts.length === 2) {\n return {\n city: parts[0],\n country: parts[1]!,\n };\n }\n return { country: parts[0]! };\n}\n\n/** Convert ISO 3166-1 alpha-2 country code to flag emoji */\nexport function countryCodeToFlag(code: string | undefined): string {\n if (!code || code.length !== 2) return '';\n const upper = code.toUpperCase();\n const a = upper.codePointAt(0);\n const b = upper.codePointAt(1);\n if (a === undefined || b === undefined) return '';\n return String.fromCodePoint(a - 0x41 + 0x1f1e6, b - 0x41 + 0x1f1e6);\n}\n","import type { PdsProviderInfo } from '../types/index.js';\n\nexport interface PdsProvider {\n name: string;\n profileUrl: string;\n host?: string;\n}\n\nconst BSKY_PROFILE_BASE = 'https://bsky.app/profile/';\n\nconst PDS_PROVIDERS: { suffix: string; name: string }[] = [\n { suffix: '.bsky.social', name: 'bluesky' },\n { suffix: '.blacksky.app', name: 'blacksky' },\n { suffix: '.eurosky.social', name: 'eurosky' },\n { suffix: '.northsky.social', name: 'northsky' },\n];\n\nconst KNOWN_PROVIDER_NAMES = new Set(PDS_PROVIDERS.map((p) => p.name));\n\nconst ICON_ONLY_PROVIDERS = new Set(['selfhosted-social', 'selfhosted']);\n\nexport function pdsProviderFromApi(\n apiProvider: PdsProviderInfo | null | undefined,\n handle: string,\n): PdsProvider | null {\n if (!apiProvider) return null;\n if (ICON_ONLY_PROVIDERS.has(apiProvider.name)) {\n return { name: apiProvider.name, profileUrl: '', host: apiProvider.host };\n }\n if (!KNOWN_PROVIDER_NAMES.has(apiProvider.name)) return null;\n return {\n name: apiProvider.name,\n profileUrl: `${BSKY_PROFILE_BASE}${handle}`,\n host: apiProvider.host,\n };\n}\n\nexport function getHandleStem(handle: string): string {\n const lower = handle.toLowerCase();\n for (const provider of PDS_PROVIDERS) {\n if (lower.endsWith(provider.suffix) && lower.length > provider.suffix.length) {\n return handle.slice(0, -provider.suffix.length);\n }\n }\n return handle;\n}\n\nexport function getDisplayLabel(displayName: string | undefined, handle: string): string {\n if (displayName) return displayName;\n return getHandleStem(handle);\n}\n\n/**\n * Combine optional structured name fields (`id.sifa.profile.self.givenName`,\n * `familyName`) into a single string in Schema.org `Person` order — given\n * before family. Returns `undefined` when both are absent so callers can\n * fall back to `displayName`. Whitespace-only inputs are treated as absent.\n * Does not impose cultural ordering: users whose preferred presentation\n * differs (e.g. Eastern name order) should set `displayName` accordingly,\n * which this helper deliberately does not consult.\n */\nexport function formatStructuredName(\n givenName: string | undefined,\n familyName: string | undefined,\n): string | undefined {\n const given = givenName?.trim();\n const family = familyName?.trim();\n if (given && family) return `${given} ${family}`;\n return given || family || undefined;\n}\n\nconst PDS_DISPLAY_NAMES: Record<string, string> = {\n bluesky: 'Bluesky',\n blacksky: 'BlackSky',\n eurosky: 'EuroSky',\n northsky: 'NorthSky',\n 'selfhosted-social': 'Self-hosted',\n selfhosted: 'Self-hosted',\n};\n\nexport function getPdsDisplayName(providerName: string): string {\n return PDS_DISPLAY_NAMES[providerName] ?? providerName;\n}\n\nexport function detectPdsProvider(handle: string): PdsProvider | null {\n const lower = handle.toLowerCase();\n for (const provider of PDS_PROVIDERS) {\n if (lower.endsWith(provider.suffix)) {\n return {\n name: provider.name,\n profileUrl: `${BSKY_PROFILE_BASE}${handle}`,\n };\n }\n }\n return null;\n}\n","/**\n * Resolve a slide / video URL to an embed descriptor. Pure and offline.\n *\n * Three outcomes:\n * - `iframe`: the URL carries everything an embed needs, so the iframe `src` is\n * known offline (YouTube, Vimeo, Google Slides, Loom, Canva).\n * - `oembed`: the URL is a known embeddable provider whose iframe `src` is NOT\n * in the URL and needs a server-side oEmbed lookup (SlideShare, SpeakerDeck\n * public deck URLs). The caller resolves the src via its own oEmbed step.\n * - `link`: not embeddable; render a plain link.\n */\n\n/**\n * A resolved embed: an iframe whose src is known offline, an `oembed` provider\n * whose src needs a server lookup (carries the original page URL), or a plain\n * link.\n */\nexport type EmbedResult =\n | { kind: 'iframe'; provider: string; src: string; aspectRatio: '16:9' | '4:3' }\n | { kind: 'oembed'; provider: string; aspectRatio: '16:9' | '4:3'; pageUrl: string }\n | { kind: 'link' };\n\nconst LINK: EmbedResult = { kind: 'link' };\n\n/** YouTube video IDs: 11 chars in practice, but accept the documented charset. */\nconst YOUTUBE_ID = /^[A-Za-z0-9_-]{6,}$/;\n\n/**\n * Extract a YouTube video id from any recognized YouTube URL (`youtu.be/ID`,\n * `youtube.com/watch?v=ID`, `/embed/ID`, `/shorts/ID`), or null. Pure/offline.\n */\nexport function youtubeVideoId(url: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n if (parsed.protocol !== 'https:') return null;\n const host = bareHost(parsed.hostname);\n const segments = parsed.pathname.split('/').filter(Boolean);\n let id: string | null = null;\n if (host === 'youtu.be') id = segments[0] ?? null;\n else if (host === 'youtube.com' || host === 'm.youtube.com') {\n if (parsed.pathname === '/watch') id = parsed.searchParams.get('v');\n else if (segments[0] === 'embed' || segments[0] === 'shorts') id = segments[1] ?? null;\n }\n return id && YOUTUBE_ID.test(id) ? id : null;\n}\n\n/**\n * The public thumbnail URL for a YouTube video id (`i.ytimg.com`). Derivable\n * offline. NOTE: this host is Google — never load it directly in a privacy\n * context; fetch and re-serve it from your own origin.\n */\nexport function youtubeThumbnailUrl(videoId: string): string {\n return `https://i.ytimg.com/vi/${videoId}/hqdefault.jpg`;\n}\n\n/** Strip a leading `www.` so host matching is scheme/subdomain tolerant. */\nfunction bareHost(hostname: string): string {\n return hostname.toLowerCase().replace(/^www\\./, '');\n}\n\n/**\n * Recognize an embeddable URL and return its iframe descriptor, else a link.\n * Only https URLs are accepted.\n */\nexport function resolveEmbed(url: string): EmbedResult {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return LINK;\n }\n if (parsed.protocol !== 'https:') return LINK;\n\n const host = bareHost(parsed.hostname);\n const segments = parsed.pathname.split('/').filter(Boolean);\n\n // --- YouTube -> privacy-enhanced nocookie embed ---\n if (host === 'youtu.be' || host === 'youtube.com' || host === 'm.youtube.com') {\n const id = youtubeVideoId(url);\n return id ? youtubeEmbed(id) : LINK;\n }\n\n // --- Vimeo ---\n if (host === 'vimeo.com') {\n const id = segments[0];\n if (id && /^\\d+$/.test(id)) {\n return {\n kind: 'iframe',\n provider: 'vimeo',\n src: `https://player.vimeo.com/video/${id}`,\n aspectRatio: '16:9',\n };\n }\n return LINK;\n }\n if (host === 'player.vimeo.com') {\n if (segments[0] === 'video' && segments[1] && /^\\d+$/.test(segments[1])) {\n return {\n kind: 'iframe',\n provider: 'vimeo',\n src: `https://player.vimeo.com/video/${segments[1]}`,\n aspectRatio: '16:9',\n };\n }\n return LINK;\n }\n\n // --- SpeakerDeck ---\n // An already-resolved `speakerdeck.com/player/HEXID` embed URL is embeddable\n // offline. A public `speakerdeck.com/USER/SLUG` deck URL needs a server oEmbed\n // lookup for the data-id, so it is `oembed`, not a dead link.\n if (host === 'speakerdeck.com') {\n if (segments[0] === 'player' && segments[1]) {\n return { kind: 'iframe', provider: 'speakerdeck', src: parsed.href, aspectRatio: '4:3' };\n }\n if (segments.length >= 2) {\n return { kind: 'oembed', provider: 'speakerdeck', aspectRatio: '4:3', pageUrl: parsed.href };\n }\n return LINK;\n }\n\n // --- SlideShare ---\n // An already-resolved `slideshow/embed_code/...` URL is embeddable offline. A\n // public deck URL needs a server oEmbed lookup for the embed_code id, so it is\n // `oembed`.\n if (host === 'slideshare.net') {\n if (segments[0] === 'slideshow' && segments[1] === 'embed_code') {\n return { kind: 'iframe', provider: 'slideshare', src: parsed.href, aspectRatio: '4:3' };\n }\n if (segments.length >= 2) {\n return { kind: 'oembed', provider: 'slideshare', aspectRatio: '4:3', pageUrl: parsed.href };\n }\n return LINK;\n }\n\n // --- Google Slides ---\n if (host === 'docs.google.com') {\n if (segments[0] === 'presentation' && segments[1] === 'd' && segments[2]) {\n return {\n kind: 'iframe',\n provider: 'googleslides',\n src: `https://docs.google.com/presentation/d/${segments[2]}/embed`,\n aspectRatio: '16:9',\n };\n }\n return LINK;\n }\n\n // --- Loom ---\n if (host === 'loom.com') {\n if (segments[0] === 'share' && segments[1]) {\n return {\n kind: 'iframe',\n provider: 'loom',\n src: `https://www.loom.com/embed/${segments[1]}`,\n aspectRatio: '16:9',\n };\n }\n return LINK;\n }\n\n // --- Canva ---\n if (host === 'canva.com') {\n if (segments[0] === 'design' && segments[1] && segments[2] === 'view') {\n return {\n kind: 'iframe',\n provider: 'canva',\n src: `https://www.canva.com/design/${segments[1]}/view?embed`,\n aspectRatio: '16:9',\n };\n }\n return LINK;\n }\n\n return LINK;\n}\n\nfunction youtubeEmbed(id: string): EmbedResult {\n return {\n kind: 'iframe',\n provider: 'youtube',\n src: `https://www.youtube-nocookie.com/embed/${id}`,\n aspectRatio: '16:9',\n };\n}\n","/**\n * Slug helpers for talk-page URLs. Pure and offline: a talk page lives at a\n * path like `/{slug}-{rkey}`, where the slug is a human-readable, SEO-friendly\n * rendering of the title and the rkey is the record's stable identifier.\n * Because TIDs never contain a `-`, the rkey can always be recovered as the\n * substring after the final `-`.\n */\n\n/** Maximum slug length before the trailing rkey is appended. */\nconst MAX_SLUG_LENGTH = 60;\n\n/** Combining diacritical marks left behind by NFKD decomposition (U+0300–U+036F). */\nconst COMBINING_MARKS = /[̀-ͯ]/g;\n\n/**\n * Render a title as a URL slug: lowercased, diacritics stripped, runs of\n * non-alphanumerics collapsed to a single `-`, trimmed, and capped at 60 chars.\n * Returns `''` for an empty or whitespace-only title.\n */\nexport function slugifyTitle(title: string): string {\n const slug = title\n .normalize('NFKD')\n // Strip combining marks left by NFKD decomposition (é -> e).\n .replace(COMBINING_MARKS, '')\n .toLowerCase()\n // Collapse any run of non-alphanumerics into a single hyphen.\n .replace(/[^a-z0-9]+/g, '-')\n // Collapse repeated hyphens.\n .replace(/-+/g, '-')\n // Trim leading/trailing hyphens.\n .replace(/^-+|-+$/g, '');\n // Cap length, then trim a trailing hyphen the cut may have exposed.\n return slug.slice(0, MAX_SLUG_LENGTH).replace(/-+$/g, '');\n}\n\n/**\n * Build the talk-page path segment `${slug}-${rkey}`, or just `rkey` when the\n * title produces an empty slug.\n */\nexport function buildTalkSlug(title: string, rkey: string): string {\n const slug = slugifyTitle(title);\n return slug ? `${slug}-${rkey}` : rkey;\n}\n\n/**\n * Recover the rkey from a talk-page segment: the substring after the final `-`\n * (TIDs contain no `-`). Returns the whole segment when there is no `-`.\n */\nexport function parseTalkRkey(segment: string): string {\n const idx = segment.lastIndexOf('-');\n return idx === -1 ? segment : segment.slice(idx + 1);\n}\n","const COMBINING_MARK = /\\p{M}/u;\nconst BIDI_CONTROLS = /[--]/gu;\n\n/**\n * Limit runs of Unicode combining marks (`\\p{M}`) to at most `maxPerBase`\n * marks following any single base character. Defuses \"Zalgo\" text where\n * dozens of stacked combining marks render outside the line box and bleed\n * into neighbouring UI.\n *\n * `maxPerBase` defaults to 4 — high enough to preserve legitimate stacks\n * in Thai, Arabic, Vietnamese, and IPA, low enough to neutralise the\n * vertical-overflow attack vector.\n */\nexport function limitCombiningMarks(value: string, maxPerBase = 4): string {\n if (!value || !COMBINING_MARK.test(value)) return value;\n\n let out = '';\n let combiningRun = 0;\n for (const char of value) {\n if (/\\p{M}/u.test(char)) {\n if (combiningRun < maxPerBase) {\n out += char;\n combiningRun += 1;\n }\n } else {\n out += char;\n combiningRun = 0;\n }\n }\n return out;\n}\n\n/**\n * Sanitise untrusted display text from PDS records before rendering in UI:\n * - strips bidi formatting controls (LRM/RLM/LRE/RLE/PDF/LRO/RLO/LRI/RLI/FSI/PDI)\n * that can hijack reading order or crash `next/og` (see Satori LRM+emoji bug)\n * - limits stacked combining marks (Zalgo defence)\n *\n * Preserves ZWJ (U+200D) so emoji sequences keep rendering.\n */\nexport function sanitizeDisplayText(value: string, maxCombiningPerBase = 4): string {\n if (!value) return value;\n return limitCombiningMarks(value.replace(BIDI_CONTROLS, ''), maxCombiningPerBase);\n}\n","const ELLIPSIS = '\\u2026';\n\n/**\n * Truncate a string to at most `maxLen` grapheme clusters, appending an\n * ellipsis when the string was shortened. Grapheme-aware so it never splits\n * emoji sequences (ZWJ, regional indicators, combining marks, surrogate pairs).\n */\nexport function truncateGraphemes(value: string, maxLen: number): string {\n if (maxLen <= 0) return '';\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n const graphemes = Array.from(segmenter.segment(value), (s) => s.segment);\n if (graphemes.length <= maxLen) return value;\n if (maxLen === 1) return ELLIPSIS;\n return graphemes.slice(0, maxLen - 1).join('') + ELLIPSIS;\n}\n","/**\n * Format a date as a relative time string (e.g. \"2 minutes ago\", \"3 days ago\").\n */\nexport function formatDistanceToNow(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n if (seconds < 60) return 'just now';\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n\n const months = Math.floor(days / 30);\n return `${months}mo ago`;\n}\n","/**\n * WCAG 2.2 contrast ratio utilities for validating publication theme colors.\n * Implements the relative luminance and contrast ratio formulas from\n * https://www.w3.org/TR/WCAG22/#dfn-relative-luminance\n */\n\nexport interface RgbColor {\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Return true when the value is an RgbColor with all channels as integers in [0, 255].\n * Use this before passing untrusted data to the luminance / contrast functions.\n */\nexport function isValidRgbColor(value: unknown): value is RgbColor {\n if (value == null || typeof value !== 'object') return false;\n const { r, g, b } = value as Record<string, unknown>;\n return (\n typeof r === 'number' &&\n typeof g === 'number' &&\n typeof b === 'number' &&\n Number.isFinite(r) &&\n Number.isFinite(g) &&\n Number.isFinite(b) &&\n r >= 0 &&\n r <= 255 &&\n g >= 0 &&\n g <= 255 &&\n b >= 0 &&\n b <= 255\n );\n}\n\n/**\n * Serialize an RgbColor to a CSS `rgb(...)` string.\n * Channels are floored to integers to prevent sub-pixel drift.\n */\nexport function rgbToString(color: RgbColor): string {\n return `rgb(${Math.floor(color.r)}, ${Math.floor(color.g)}, ${Math.floor(color.b)})`;\n}\n\n/**\n * Calculate relative luminance of an sRGB color per WCAG 2.2.\n * Input channels must be numbers in [0, 255].\n */\nexport function relativeLuminance(color: RgbColor): number {\n const [rs, gs, bs] = [color.r / 255, color.g / 255, color.b / 255];\n\n const r = rs <= 0.04045 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const g = gs <= 0.04045 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const b = bs <= 0.04045 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Calculate WCAG 2.2 contrast ratio between two colors.\n * Returns a value between 1 (identical) and 21 (black/white).\n */\nexport function contrastRatio(color1: RgbColor, color2: RgbColor): number {\n const l1 = relativeLuminance(color1);\n const l2 = relativeLuminance(color2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Check if two colors meet WCAG 2.2 AA contrast requirement (4.5:1 for normal text).\n */\nexport function meetsContrastAA(foreground: RgbColor, background: RgbColor): boolean {\n return contrastRatio(foreground, background) >= 4.5;\n}\n","import type {\n ProfilePresentationRecord,\n ProfilePresentationDeliveryRecord,\n PresentationLink,\n PresentationDuration,\n} from '../schemas/index.js';\n\n/**\n * CSV parsers for the Talks & sessions import (two templates joined by a\n * presentation_key). The value parsers and row mappers are reusable and pure;\n * the actual PDS writing (create a presentation, then write its deliveries with\n * a presentationRef to it) is orchestrated by the consumer, which has the\n * created record's AT-URI.\n */\n\n/** A CSV row as a header-keyed map. Missing cells may be undefined or empty. */\nexport type CsvRow = Record<string, string | undefined>;\n\nfunction clean(value: string | undefined): string {\n return (value ?? '').trim();\n}\n\n/**\n * Parse a free-text duration into minutes: a single value (\"30 min\", \"30\n * minutes\", \"30\") or a range (\"20-30 min\", \"20 to 30 minutes\", \"20-30\").\n * Returns undefined when no usable number is present. A second number is used\n * as the upper bound only when it is greater than or equal to the first.\n */\nexport function parsePresentationDuration(\n input: string | undefined,\n): PresentationDuration | undefined {\n const numbers = (clean(input).match(/\\d+/g) ?? [])\n .map((n) => Number.parseInt(n, 10))\n .filter((n) => Number.isInteger(n) && n > 0);\n // `.at()` is typed `number | undefined`, which both tsc (under\n // noUncheckedIndexedAccess) and eslint agree on, so the guards are clean.\n const min = numbers.at(0);\n if (min === undefined) return undefined;\n const max = numbers.at(1);\n return max !== undefined && max >= min\n ? { minMinutes: min, maxMinutes: max }\n : { minMinutes: min };\n}\n\n/** Build a duration from explicit min/max minute columns. */\nexport function durationFromMinutes(\n minRaw: string | undefined,\n maxRaw: string | undefined,\n): PresentationDuration | undefined {\n const min = Number.parseInt(clean(minRaw), 10);\n if (!Number.isInteger(min) || min < 1) return undefined;\n const max = Number.parseInt(clean(maxRaw), 10);\n return Number.isInteger(max) && max >= min\n ? { minMinutes: min, maxMinutes: max }\n : { minMinutes: min };\n}\n\n/** Split a delimited list into trimmed, non-empty values. Default delimiter \";\". */\nexport function parseIntendedAudiences(input: string | undefined, delimiter = ';'): string[] {\n return clean(input)\n .split(delimiter)\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/**\n * Strip HTML to plain text and decode the common entities, for descriptions\n * exported as HTML (e.g. Webflow). The AppView re-sanitizes on write; this is\n * only to produce readable text.\n */\nexport function stripHtmlToText(input: string | undefined): string {\n const text = clean(input)\n .replace(/<\\s*br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/\\s*(p|div|li|h[1-6])\\s*>/gi, '\\n')\n .replace(/<[^>]*>/g, '')\n .replace(/ /gi, ' ')\n .replace(/&/gi, '&')\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .replace(/"/gi, '\"')\n .replace(/�*39;|'/gi, \"'\");\n return text\n .replace(/[ \\t]+/g, ' ')\n .replace(/ *\\n */g, '\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nconst ROLE_TOKENS: Record<string, string> = {\n presenter: 'id.sifa.defs#presenter',\n speaker: 'id.sifa.defs#presenter',\n panelist: 'id.sifa.defs#panelist',\n keynote: 'id.sifa.defs#keynote',\n workshop: 'id.sifa.defs#workshop',\n host: 'id.sifa.defs#host',\n};\n\n/**\n * Map a friendly role value to its token. An existing token passes through.\n * Free-text or compound values (e.g. \"Organizer & co-host/moderator\") are\n * mapped to the nearest token by keyword. An organizer-only value has no\n * speaking token, so it, and any other unrecognized value, is dropped rather\n * than stored raw -- matching normalizePresentationMode's drop-unknown\n * behavior, so a fixed role dropdown never has to render arbitrary strings.\n */\nexport function normalizePresentationRole(value: string | undefined): string | undefined {\n const v = clean(value).toLowerCase();\n if (!v) return undefined;\n if (v.startsWith('id.sifa.defs#')) return v;\n const exact = ROLE_TOKENS[v];\n if (exact) return exact;\n if (v.includes('keynote')) return ROLE_TOKENS.keynote;\n if (v.includes('workshop') || v.includes('masterclass') || v.includes('training'))\n return ROLE_TOKENS.workshop;\n if (v.includes('panel')) return ROLE_TOKENS.panelist;\n if (v.includes('host') || v.includes('moderat') || v.includes('emcee') || v.includes('chair'))\n return ROLE_TOKENS.host;\n if (v.includes('speaker') || v.includes('present') || v.includes('talk'))\n return ROLE_TOKENS.presenter;\n return undefined;\n}\n\nconst MODE_FRAGMENTS: Record<string, string> = {\n inperson: '#inperson',\n 'in person': '#inperson',\n 'in-person': '#inperson',\n virtual: '#virtual',\n online: '#virtual',\n remote: '#virtual',\n hybrid: '#hybrid',\n};\n\n/** Map a friendly mode value to the community calendar token; drops an unknown value. */\nexport function normalizePresentationMode(value: string | undefined): string | undefined {\n const v = clean(value).toLowerCase();\n if (!v) return undefined;\n if (v.startsWith('community.lexicon.calendar.event#')) return v;\n const fragment = MODE_FRAGMENTS[v];\n return fragment ? `community.lexicon.calendar.event${fragment}` : undefined;\n}\n\nfunction link(uri: string | undefined, type: string): PresentationLink | undefined {\n const u = clean(uri);\n return u ? { uri: u, type } : undefined;\n}\n\nexport interface ParsedPresentation {\n /** presentation_key used to link delivery rows to this presentation. */\n key?: string;\n record: Omit<ProfilePresentationRecord, 'createdAt'>;\n}\n\n/** Map a row of the presentations template to a presentation record (minus createdAt). */\nexport function presentationCsvRowToRecord(row: CsvRow): ParsedPresentation {\n const description = stripHtmlToText(row.description);\n const duration =\n parsePresentationDuration(row.duration) ??\n durationFromMinutes(row.duration_min_minutes, row.duration_max_minutes);\n const intendedAudiences = parseIntendedAudiences(row.intended_audiences);\n const links = [\n link(row.slides_url, 'id.sifa.defs#linkSlides'),\n link(row.recording_url, 'id.sifa.defs#linkRecording'),\n link(row.writeup_url, 'id.sifa.defs#linkWriteup'),\n ].filter((l): l is PresentationLink => l !== undefined);\n\n const record: Omit<ProfilePresentationRecord, 'createdAt'> = { title: clean(row.title) };\n if (description) record.description = description;\n if (duration) record.duration = duration;\n if (intendedAudiences.length) record.intendedAudiences = intendedAudiences;\n if (links.length) record.links = links;\n\n return { key: clean(row.presentation_key) || undefined, record };\n}\n\nexport interface ParsedDelivery {\n /** presentation_key to resolve into a presentationRef once the presentation exists. */\n presentationKey?: string;\n record: Omit<ProfilePresentationDeliveryRecord, 'createdAt' | 'presentationRef'>;\n}\n\n/** Map a row of the deliveries template to a delivery record (minus createdAt and presentationRef). */\nexport function presentationDeliveryCsvRowToRecord(row: CsvRow): ParsedDelivery {\n const links = [\n link(row.event_url, 'id.sifa.defs#linkEvent'),\n link(row.recording_url, 'id.sifa.defs#linkRecording'),\n ].filter((l): l is PresentationLink => l !== undefined);\n\n const record: Omit<ProfilePresentationDeliveryRecord, 'createdAt' | 'presentationRef'> = {};\n const title = clean(row.title);\n const eventName = clean(row.event_name);\n const date = clean(row.date);\n const location = clean(row.location);\n const role = normalizePresentationRole(row.role);\n const mode = normalizePresentationMode(row.mode);\n if (title) record.title = title;\n if (role) record.role = role;\n if (eventName) record.eventName = eventName;\n if (date) record.date = date;\n if (location) record.location = location;\n if (mode) record.mode = mode;\n if (links.length) record.links = links;\n\n return { presentationKey: clean(row.presentation_key) || undefined, record };\n}\n","/**\n * URL patterns per app, mirroring the sifa-web registry.\n *\n * These describe how to build a clickable URL for an activity card given\n * the author's handle/did and the record rkey. The patterns are templates\n * with `{handle}`, `{did}`, and `{rkey}` placeholders; each variable is\n * URI-encoded when interpolated.\n *\n * Tier semantics:\n * - `urlPattern`: per-item URL (a specific post/event/repo). Preferred.\n * - `profileUrlPattern`: per-user profile URL on the app. Fallback.\n *\n * Apps without either pattern are not clickable.\n */\nexport interface AppUrlPatterns {\n urlPattern?: string;\n profileUrlPattern?: string;\n}\n\nexport const APP_URL_PATTERNS: Readonly<Record<string, AppUrlPatterns>> = Object.freeze({\n bluesky: {\n urlPattern: 'https://bsky.app/profile/{handle}/post/{rkey}',\n profileUrlPattern: 'https://bsky.app/profile/{handle}',\n },\n tangled: {\n profileUrlPattern: 'https://tangled.sh/{handle}',\n },\n smokesignal: {\n urlPattern: 'https://smokesignal.events/{did}/{rkey}',\n profileUrlPattern: 'https://smokesignal.events/{did}',\n },\n whitewind: {\n urlPattern: 'https://whtwnd.com/{handle}/{rkey}',\n profileUrlPattern: 'https://whtwnd.com/{handle}',\n },\n frontpage: {\n urlPattern: 'https://frontpage.fyi/post/{did}/{rkey}',\n profileUrlPattern: 'https://frontpage.fyi/profile/{did}',\n },\n linkat: {\n profileUrlPattern: 'https://linkat.blue/{handle}',\n },\n pastesphere: {\n urlPattern: 'https://pastesphere.link/user/{handle}/snippet/{rkey}',\n profileUrlPattern: 'https://pastesphere.link/user/{handle}',\n },\n kipclip: {\n profileUrlPattern: 'https://kipclip.com/{handle}',\n },\n keytrace: {\n profileUrlPattern: 'https://keytrace.dev/@{handle}',\n },\n sifa: {\n profileUrlPattern: 'https://sifa.id/p/{handle}',\n },\n popfeed: {\n urlPattern: 'https://popfeed.social/profile/{handle}',\n profileUrlPattern: 'https://popfeed.social/profile/{handle}',\n },\n streamplace: {\n profileUrlPattern: 'https://stream.place/{handle}',\n },\n semble: {\n profileUrlPattern: 'https://semble.so/profile/{handle}',\n },\n grain: {\n urlPattern: 'https://grain.social/profile/{did}/gallery/{rkey}',\n profileUrlPattern: 'https://grain.social/profile/{did}',\n },\n youandme: { profileUrlPattern: 'https://youandme.at' },\n // anisota: upgraded with per-record URL pattern below.\n margin: { profileUrlPattern: 'https://margin.at' },\n beaconbits: { profileUrlPattern: 'https://beaconbits.app' },\n bookhive: { profileUrlPattern: 'https://bookhive.buzz/profile/{handle}' },\n colibri: { profileUrlPattern: 'https://colibri.social' },\n collectivesocial: { profileUrlPattern: 'https://app.collectivesocial.app' },\n github: {},\n asq: {\n // Questions live at /q/{did}/{rkey}. Answer cards build their own URL\n // from the parsed subject.uri (which points to the question), so the\n // pattern below is invoked only for question records.\n urlPattern: 'https://asq.fyi/q/{did}/{rkey}',\n profileUrlPattern: 'https://asq.fyi',\n },\n passports: {\n // Per-record URLs don't exist on passports.social — its SvelteKit routes\n // stop at /profile/{handle}/{passport_slug}. Profile-level fallback only.\n profileUrlPattern: 'https://passports.social/profile/{handle}',\n },\n leaflet: {\n // Per-document URLs are short and rkey-only: https://leaflet.pub/{rkey}.\n // Each publication has its own base_path subdomain (e.g. zzstoatzz.leaflet.pub)\n // but the canonical short URL renders the same document. There is no\n // per-user profile route on leaflet.pub, so the profile fallback points\n // at the marketing site.\n urlPattern: 'https://leaflet.pub/{rkey}',\n profileUrlPattern: 'https://leaflet.pub',\n },\n spark: {\n // Verified live: GET /post/{did}/{rkey} returns 200.\n urlPattern: 'https://sprk.so/post/{did}/{rkey}',\n profileUrlPattern: 'https://sprk.so/profile/{handle}',\n },\n anisota: {\n urlPattern: 'https://anisota.net/post/{did}/{rkey}',\n profileUrlPattern: 'https://anisota.net/profile/{handle}',\n },\n nooki: {\n // Per-post URLs use slug-based routing (e.g. /post/{slug}), not rkey —\n // can't be constructed from a record. Profile fallback only.\n profileUrlPattern: 'https://nooki.me/user/{handle}',\n },\n atstore: {\n // atstore.fyi has no user-profile pages (the legacy `/@{handle}` pattern\n // resolved to a 404), and no per-review deep link exists. The per-product\n // page (https://atstore.fyi/products/{slug}) is the most specific URL\n // available — resolveCardUrl builds it from record.listingMeta.slug,\n // which sifa-api enriches by resolving the review's `subject` to the\n // referenced listing.detail record.\n profileUrlPattern: 'https://atstore.fyi',\n },\n plyr: {\n // SPA — per-record URLs require JS routing. plyr.fm doesn't expose a\n // public per-handle profile page server-side either; falls back to root.\n profileUrlPattern: 'https://plyr.fm',\n },\n atfund: {\n // at.fund is auth-gated — `/give/{did}` 307s to `/` when not signed in,\n // and there's no public per-endorsement permalink. Profile fallback only,\n // pointing at the main /give listing.\n profileUrlPattern: 'https://www.at.fund/give',\n },\n crate: {\n // Crate (app.crate.social) is an authoring dashboard with no public\n // per-record viewer or per-handle profile page — records are designed to\n // render on the maker's own site. `content` cards link out via\n // record.canonicalUrl (handled in resolveCardUrl); `note` records have no\n // public URL and render non-clickable. So no app-level pattern applies.\n },\n atmorsvp: {\n // atmo.rsvp events live at /p/{did}/e/{rkey}. The per-item pattern is used\n // for the event record itself; checkin records build their URL from the\n // referenced event uri in resolveCardUrl (mirrors smokesignal rsvp).\n urlPattern: 'https://atmo.rsvp/p/{did}/e/{rkey}',\n profileUrlPattern: 'https://atmo.rsvp/p/{did}',\n },\n opensocial: {\n // Open Social (opensocial.community) is community-management infrastructure\n // with no public per-membership permalink. Profile fallback only.\n profileUrlPattern: 'https://opensocial.community',\n },\n kevara: {\n // Kevara (professional network) has no live public web surface yet — its\n // domain doesn't resolve and there's no per-record viewer. Recognized so\n // the speaker-directory card renders with the right pill, but non-clickable.\n },\n atcr: {\n // ATCR repositories live at /r/{handle}/{repository}, where the rkey of an\n // io.atcr.repo.page record is the repository name. Verified live: GET\n // /r/{handle}/{rkey} and /u/{handle} both return 200.\n urlPattern: 'https://atcr.io/r/{handle}/{rkey}',\n profileUrlPattern: 'https://atcr.io/u/{handle}',\n },\n kich: {\n // Kich recipe viewer. Verified: GET /recipes/{rkey} returns 200 (the SPA\n // renders the recipe by rkey); /recipe/{rkey} 404s. No public per-handle\n // profile page, so the profile fallback points at the app root.\n urlPattern: 'https://kich.io/recipes/{rkey}',\n profileUrlPattern: 'https://kich.io',\n },\n recipe: {\n // recipe.exchange viewer. Verified: GET /recipes/{rkey} returns 200 (rkey\n // alone; no did needed) and /profiles/{handle} returns 200 for the author\n // page. /recipe/{rkey} 404s.\n urlPattern: 'https://recipe.exchange/recipes/{rkey}',\n profileUrlPattern: 'https://recipe.exchange/profiles/{handle}',\n },\n aetherdocs: {\n // Aether OS is a browser OS — presentations open inside it and there's no\n // public per-record viewer. The card embeds the deck from the record; the\n // outbound link points at the author's Aether OS space (mirrors aetheros).\n profileUrlPattern: 'https://aetheros.computer/{handle}',\n },\n});\n\n/**\n * Map collection NSID prefixes to app ids. Order matters: longer / more\n * specific prefixes must come before broader ones.\n */\nexport const COLLECTION_TO_APP: ReadonlyArray<readonly [prefix: string, appId: string]> = [\n ['app.bsky.', 'bluesky'],\n ['sh.tangled.', 'tangled'],\n ['events.smokesignal.', 'smokesignal'],\n ['community.lexicon.calendar.', 'smokesignal'],\n ['community.lexicon.bookmarks.', 'kipclip'],\n ['com.kipclip.', 'kipclip'],\n ['blue.flashes.', 'flashes'],\n ['social.grain.', 'grain'],\n ['com.whtwnd.', 'whitewind'],\n ['fyi.unravel.frontpage.', 'frontpage'],\n ['social.psky.', 'picosky'],\n ['blue.linkat.', 'linkat'],\n ['link.pastesphere.', 'pastesphere'],\n ['site.standard.', 'standard'],\n ['computer.aetheros.', 'aetheros'],\n ['space.roomy.', 'roomy'],\n ['dev.keytrace.', 'keytrace'],\n ['social.popfeed.', 'popfeed'],\n ['app.popsky.', 'popfeed'],\n ['place.stream.', 'streamplace'],\n ['app.sidetrail.', 'semble'],\n ['network.cosmik.', 'cosmik'],\n ['id.sifa.', 'sifa'],\n ['forum.barazo.', 'barazo'],\n ['xyz.statusphere.', 'statusphere'],\n ['at.youandme.', 'youandme'],\n ['net.anisota.', 'anisota'],\n ['at.margin.', 'margin'],\n ['app.beaconbits.', 'beaconbits'],\n ['buzz.bookhive.', 'bookhive'],\n ['social.colibri.', 'colibri'],\n ['social.passports.', 'passports'],\n ['fyi.asq.', 'asq'],\n ['pub.leaflet.', 'leaflet'],\n ['so.sprk.', 'spark'],\n ['community.nooki.', 'nooki'],\n ['fyi.atstore.', 'atstore'],\n ['fm.plyr.', 'plyr'],\n ['fund.at.', 'atfund'],\n ['social.crate.', 'crate'],\n ['quest.atmo.', 'atmorsvp'],\n ['community.opensocial.', 'opensocial'],\n ['is.kevara.', 'kevara'],\n ['io.atcr.', 'atcr'],\n // Batch onboard — named pills for apps that were leaking as raw NSIDs.\n ['app.mcp.', 'mcp'],\n ['app.userinput.', 'userinput'],\n ['com.minomobi.', 'minomobi'],\n ['com.voxport.', 'voxport'],\n ['community.lexicon.badge.', 'badges'],\n ['dev.atvouch.', 'atvouch'],\n ['io.calabro.watsm.', 'watsm'],\n ['li.plonk.', 'plonk'],\n ['net.alternativeproto.', 'alternativeproto'],\n ['one.papili.', 'papili'],\n ['org.v-it.', 'vit'],\n ['st.lifepo.', 'lifepo'],\n ['stream.thought.', 'streamthought'],\n ['tech.waow.', 'waow'],\n ['wiki.lichen.', 'lichen'],\n // Onboard from aramzs.xyz profile audit.\n ['os.aether.', 'aetherdocs'],\n ['io.kich.recipe.recipe', 'kich'],\n // Onboard from moll.dev profile audit.\n ['exchange.recipe.recipe', 'recipe'],\n];\n","import { APP_URL_PATTERNS, COLLECTION_TO_APP } from './app-url-patterns.js';\n\n/**\n * An activity item as consumed by the Sifa activity-card components and\n * the sifa-api external-URL health scanner. The shape mirrors the props\n * the cards already use, so the resolver returns the same URL the UI\n * renders.\n */\nexport interface ActivityItemForUrl {\n /** Collection NSID, e.g. \"sh.tangled.graph.repo\". */\n collection: string;\n /** The raw record from the PDS / API. */\n record: Record<string, unknown>;\n /** Full at-uri of the record (used by collections that derive URL from uri). */\n uri: string;\n /** Record key. */\n rkey: string;\n /** DID of the author of the record. */\n authorDid: string;\n /** Optional handle (cards prefer handle in URL paths when available). */\n authorHandle?: string;\n}\n\n/**\n * Map a collection NSID to its app id, mirroring the sifa-web prefix map.\n *\n * Falls back to the first two NSID segments (e.g. \"org.hyperboards\") when\n * the prefix is not registered, matching the existing card behaviour.\n */\nexport function getAppIdForCollection(collection: string): string {\n for (const [prefix, appId] of COLLECTION_TO_APP) {\n if (collection.startsWith(prefix)) return appId;\n }\n const parts = collection.split('.');\n if (parts.length >= 2) return `${parts[0]}.${parts[1]}`;\n return collection;\n}\n\n/**\n * How the activity-card health scanner should verify a card is still live.\n *\n * - `record`: the URL is a first-party permalink that renders THIS record\n * (e.g. a Bluesky post at bsky.app, a tangled repo, a smokesignal event).\n * The authoritative liveness check is \"does the record still exist on its\n * PDS\" — `com.atproto.repo.getRecord` on the item's own at-uri — NOT an\n * HTTP probe of the rendering app. Rendering apps (bsky.app, tangled.sh)\n * frequently answer HEAD with 404/405 while serving GET fine, which\n * false-positives every permalink as broken.\n * - `url`: the URL is a foreign or derived target — a bookmarked page, an\n * external publisher, a *different* record's page, or a profile page.\n * Its reachability is independent of this record, so probe the URL.\n * - `none`: the card has no clickable URL; nothing to check.\n */\nexport type CardHealthStrategy = 'record' | 'url' | 'none';\n\nexport interface CardHealth {\n /** The clickable URL the card renders. Null when non-clickable. */\n url: string | null;\n /** How the scanner should verify liveness. See {@link CardHealthStrategy}. */\n strategy: CardHealthStrategy;\n}\n\n/** Build a `url`-strategy result (foreign/derived/profile target). */\nfunction urlHealth(url: string | null): CardHealth {\n return url ? { url, strategy: 'url' } : { url: null, strategy: 'none' };\n}\n\n/** Build a `record`-strategy result (self-permalink of this record). */\nfunction recordHealth(url: string | null): CardHealth {\n return url ? { url, strategy: 'record' } : { url: null, strategy: 'none' };\n}\n\nfunction interpolate(pattern: string, vars: Record<string, string | undefined>): string | null {\n let result = pattern;\n for (const [key, value] of Object.entries(vars)) {\n if (result.includes(`{${key}}`)) {\n if (!value) return null;\n result = result.replaceAll(`{${key}}`, encodeURIComponent(value));\n }\n }\n return result;\n}\n\n/**\n * Whether the per-item `urlPattern` for `appId` is appropriate for `collection`.\n *\n * For bluesky, the per-item URL pattern only matches `app.bsky.feed.post` —\n * other `app.bsky.*` collections (`actor.status`, `graph.cancellation`, etc.)\n * use rkeys that would 404 at `bsky.app/profile/{handle}/post/{rkey}`. Fall\n * back to the profile URL for those. See sifa-web#1070 / sifa-web#1073.\n *\n * When `collection` is undefined we err on the safe side for bluesky and\n * prefer the profile URL.\n */\nfunction shouldUseItemPattern(appId: string, collection: string | undefined): boolean {\n if (appId === 'bluesky') {\n return collection === 'app.bsky.feed.post';\n }\n return true;\n}\n\n/**\n * Resolve a pattern-based URL, reporting which tier produced it:\n * - `item`: a per-item permalink (renders this specific record) -> record-checkable.\n * - `profile`: the app's profile page (not this record) -> url-checkable.\n * - `null`: no pattern applied.\n */\nfunction patternHealth(\n appId: string,\n vars: { handle?: string; did?: string; rkey?: string },\n collection?: string,\n): CardHealth {\n const patterns = APP_URL_PATTERNS[appId];\n if (!patterns) return { url: null, strategy: 'none' };\n\n if (patterns.urlPattern && shouldUseItemPattern(appId, collection)) {\n const url = interpolate(patterns.urlPattern, vars);\n if (url) return recordHealth(url);\n }\n if (patterns.profileUrlPattern) {\n const url = interpolate(patterns.profileUrlPattern, vars);\n if (url) return urlHealth(url);\n }\n return { url: null, strategy: 'none' };\n}\n\n/**\n * Valid tangled repo slug: alphanumeric, dot, dash, underscore. No whitespace,\n * slashes, or URL-encodable special characters. Multi-segment aggregate `name`\n * values produce 404 URLs, so callers fall back to the profile URL when\n * invalid. See sifa-web#1071 / sifa-web#1072.\n */\nconst TANGLED_REPO_SLUG = /^[a-zA-Z0-9._-]+$/;\n\nfunction stringOrNull(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\n// at://did:plc:xxx/community.lexicon.calendar.event/rkey\n// -> { did: \"did:plc:xxx\", rkey: \"rkey\" }\nfunction parseAtUri(atUri: string): { did: string; rkey: string } | null {\n const match = atUri.match(/^at:\\/\\/(did:[^/]+)\\/[^/]+\\/(.+)$/);\n if (!match || !match[1] || !match[2]) return null;\n return { did: match[1], rkey: match[2] };\n}\n\n/**\n * Resolve the canonical clickable URL for an activity item **and** how its\n * liveness should be checked — the single source of truth shared by:\n * - sifa-web activity cards (which render `.url`), and\n * - the sifa-api link-health scanner (which switches on `.strategy`: probe the\n * record's PDS for `record`-strategy cards, probe the URL for `url`).\n *\n * See {@link CardHealthStrategy} for why self-permalinks (bsky posts, etc.)\n * must be verified by record existence rather than an HTTP probe of the app.\n *\n * Resolution order:\n * 1. Per-collection bespoke logic (tangled, kipclip, margin, smokesignal\n * rsvp, standard documents). These mirror the inline logic in the\n * individual card components.\n * 2. Generic `record.url` field (used by hyperboards and similar).\n * 3. Pattern-based per-item / profile URL from the registry.\n */\nexport function resolveCardHealth(item: ActivityItemForUrl): CardHealth {\n const { collection, record, uri, rkey, authorDid, authorHandle } = item;\n const appId = getAppIdForCollection(collection);\n\n // --- Per-collection bespoke logic (mirrors the card components) ---\n\n // Tangled: prefer per-repo URL `https://tangled.sh/{handle}/{slug}`. The slug\n // is `record.name` (legacy format) or — when `name` is absent — the record's\n // rkey (newer repos use the slug as the rkey). The rkey fallback is scoped to\n // `sh.tangled.repo`; other tangled collections (e.g. feed.star) use TID rkeys\n // that are not repo slugs. Only when the slug is valid — multi-segment\n // aggregate names (whitespace, slashes, special chars) would 404. See\n // sifa-web#1071. The repo record itself is the card's subject, so it is\n // verified by the record's existence.\n if (collection.startsWith('sh.tangled.')) {\n const repoName = stringOrNull(record.name) ?? (collection === 'sh.tangled.repo' ? rkey : null);\n if (repoName && authorHandle && TANGLED_REPO_SLUG.test(repoName)) {\n return recordHealth(`https://tangled.sh/${authorHandle}/${repoName}`);\n }\n return patternHealth('tangled', { handle: authorHandle, did: authorDid, rkey }, collection);\n }\n\n // Kipclip / community.lexicon.bookmarks: the bookmark subject IS the URL —\n // a foreign page whose reachability is independent of the bookmark record.\n if (\n collection.startsWith('com.kipclip.') ||\n collection.startsWith('community.lexicon.bookmarks.')\n ) {\n const subject = stringOrNull(record.subject);\n if (subject) return urlHealth(subject);\n return patternHealth('kipclip', { handle: authorHandle, did: authorDid, rkey });\n }\n\n // Margin bookmark: card returns null entirely without record.source\n if (collection === 'at.margin.bookmark') {\n return urlHealth(stringOrNull(record.source));\n }\n\n // Margin note / annotation: both are W3C web annotations whose `target.source`\n // is the annotated page URL. Link to that source; fall back to the margin app.\n if (collection === 'at.margin.annotation' || collection === 'at.margin.note') {\n const target = record.target;\n if (target != null && typeof target === 'object') {\n const source = stringOrNull((target as Record<string, unknown>).source);\n if (source) return urlHealth(source);\n }\n return urlHealth(APP_URL_PATTERNS.margin?.profileUrlPattern ?? null);\n }\n\n // Smokesignal RSVP: parse the linked event uri. The URL points at a\n // *different* record (the event), so probe the URL, not this RSVP record.\n if (collection === 'community.lexicon.calendar.rsvp') {\n const subject = record.subject;\n if (subject != null && typeof subject === 'object') {\n const subjectUri = stringOrNull((subject as Record<string, unknown>).uri);\n if (subjectUri) {\n const parsed = parseAtUri(subjectUri);\n if (parsed) {\n return urlHealth(`https://smokesignal.events/${parsed.did}/${parsed.rkey}`);\n }\n }\n }\n return { url: null, strategy: 'none' };\n }\n\n // Smokesignal event itself: use item's own uri -> self-permalink.\n if (collection === 'community.lexicon.calendar.event') {\n const parsed = parseAtUri(uri);\n if (parsed) {\n return recordHealth(`https://smokesignal.events/${parsed.did}/${parsed.rkey}`);\n }\n return { url: null, strategy: 'none' };\n }\n\n // atmo.rsvp event itself: use item's own uri -> self-permalink.\n if (collection === 'quest.atmo.event') {\n const parsed = parseAtUri(uri);\n if (parsed) {\n return recordHealth(`https://atmo.rsvp/p/${parsed.did}/e/${parsed.rkey}`);\n }\n return { url: null, strategy: 'none' };\n }\n\n // atmo.rsvp checkin: parse the linked event uri (record.event) and link to\n // that event's page (mirrors smokesignal rsvp). The URL points at a\n // *different* record (the event), so probe the URL. The checkin's own rkey is\n // not addressable, so without a valid event reference it's non-clickable.\n if (collection === 'quest.atmo.checkin') {\n const eventUri = stringOrNull(record.event);\n if (eventUri) {\n const parsed = parseAtUri(eventUri);\n if (parsed) {\n return urlHealth(`https://atmo.rsvp/p/${parsed.did}/e/${parsed.rkey}`);\n }\n }\n return { url: null, strategy: 'none' };\n }\n\n // atstore reviews: no per-review URL exists on atstore.fyi, and user profile\n // pages don't exist either. Deep-link to the reviewed product instead.\n // The slug comes from record.listingMeta (enriched by sifa-api from the\n // review's `subject` at-uri → fyi.atstore.listing.detail record). The product\n // page is a *different* subject, so probe the URL.\n if (collection === 'fyi.atstore.listing.review') {\n const listingMeta = record.listingMeta;\n if (listingMeta != null && typeof listingMeta === 'object') {\n const slug = stringOrNull((listingMeta as Record<string, unknown>).slug);\n if (slug) return urlHealth(`https://atstore.fyi/products/${encodeURIComponent(slug)}`);\n }\n return urlHealth(APP_URL_PATTERNS.atstore?.profileUrlPattern ?? null);\n }\n\n // Crate content: link to the canonical published location the maker\n // recorded (a YouTube/podcast/personal-site URL) — a foreign page. Crate is\n // an authoring dashboard with no public per-record viewer, so `note`\n // records — which carry no canonicalUrl — render non-clickable (null).\n if (collection === 'social.crate.content') {\n return urlHealth(stringOrNull(record.canonicalUrl));\n }\n if (collection === 'social.crate.note') {\n return { url: null, strategy: 'none' };\n }\n\n // Standard documents: siteUrl + path (or just siteUrl) — an external site.\n if (collection.startsWith('site.standard.')) {\n const siteUrl = stringOrNull(record.siteUrl);\n const path = stringOrNull(record.path);\n if (siteUrl && path) return urlHealth(`${siteUrl}${path}`);\n if (siteUrl) return urlHealth(siteUrl);\n // Fall through to generic record.url / patterns\n }\n\n // Kich recipe: always link to the Kich recipe page. record.url is the\n // *source* the recipe was imported from (a YouTube video, a blog), which the\n // card shows as secondary attribution — not the primary link. Must run before\n // the generic record.url fallback below, which would otherwise hijack it. The\n // recipe page is a first-party permalink for this record.\n if (collection === 'io.kich.recipe.recipe') {\n return patternHealth('kich', { handle: authorHandle, did: authorDid, rkey }, collection);\n }\n\n // recipe.exchange: same shape as Kich — the record's attribution.url points\n // at the original source (a blog/video), not the app. Always link to the\n // recipe.exchange page. Must run before the generic fallback below.\n if (collection === 'exchange.recipe.recipe') {\n return patternHealth('recipe', { handle: authorHandle, did: authorDid, rkey }, collection);\n }\n\n // --- Generic fallbacks ---\n\n // record.url is a common ad-hoc per-item URL (hyperboards, etc.). It is an\n // arbitrary foreign URL, so probe it directly.\n const recordUrl = stringOrNull(record.url);\n if (recordUrl) return urlHealth(recordUrl);\n\n // Pattern-based fallback. Pass `collection` so app-specific guards (bluesky\n // restricting /post/{rkey} to app.bsky.feed.post) can apply. The tier\n // (per-item vs profile) decides record- vs url-strategy.\n return patternHealth(appId, { handle: authorHandle, did: authorDid, rkey }, collection);\n}\n\n/**\n * Resolve the canonical clickable URL for an activity item — the same URL\n * the activity-card UI in sifa-web renders. Thin wrapper over\n * {@link resolveCardHealth}; returns `null` when no link is appropriate.\n */\nexport function resolveCardUrl(item: ActivityItemForUrl): string | null {\n return resolveCardHealth(item).url;\n}\n","/**\n * Per-collection visibility rules for activity items.\n *\n * These rules express \"this record has nothing meaningful to render as a card\"\n * — e.g. a BookHive shelf-add with no review/stars, or a BeaconBits pin with\n * no shout. They are a UX/card concern, distinct from the api-side blocklists\n * in sifa-api/atproto-app-registry that exclude whole collections (likes,\n * follows, games) or filter spammy record shapes (empty quote posts).\n *\n * Used in two places:\n * - sifa-api's activity feed pagination, so a page-of-N returns N visible\n * items rather than silently-dropped placeholders.\n * - sifa-web's activity-feed component (and as defense-in-depth in the card\n * components themselves), so the client never relies on a stale api.\n *\n * Adding a new rule = one PR to this file. Unknown collections default to\n * visible, so the rule set is purely additive — adding a rule can only ever\n * hide more, never expose what was hidden before.\n */\n\ntype VisibilityPredicate = (record: Record<string, unknown>) => boolean;\n\nfunction isNonEmptyString(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction bookhiveHasOpinion(record: Record<string, unknown>): boolean {\n const review = typeof record.review === 'string' ? record.review.trim() : '';\n const stars = typeof record.stars === 'number' ? record.stars : 0;\n return review.length > 0 || stars > 0;\n}\n\nfunction beaconbitsHasContent(record: Record<string, unknown>): boolean {\n return isNonEmptyString(record.shout) || record.post != null;\n}\n\nfunction marginBookmarkHasSource(record: Record<string, unknown>): boolean {\n return isNonEmptyString(record.source);\n}\n\nfunction marginAnnotationHasBody(record: Record<string, unknown>): boolean {\n const body = record.body;\n if (typeof body === 'string') return body.trim().length > 0;\n if (body != null && typeof body === 'object') {\n const value = (body as Record<string, unknown>).value;\n return typeof value === 'string' && value.trim().length > 0;\n }\n return false;\n}\n\nexport const ACTIVITY_VISIBILITY_RULES: Readonly<Record<string, VisibilityPredicate>> =\n Object.freeze({\n 'buzz.bookhive.book': bookhiveHasOpinion,\n 'app.beaconbits.beacon': beaconbitsHasContent,\n 'at.margin.bookmark': marginBookmarkHasSource,\n 'at.margin.annotation': marginAnnotationHasBody,\n });\n\n/**\n * Return true if the activity item should render a card in the timeline.\n * Records that fail the rule for their collection are dropped silently —\n * they exist in the user's PDS but carry no card-worthy content.\n *\n * Unknown collections (no registered rule) default to visible.\n */\nexport function isVisibleActivityItem(collection: string, record: unknown): boolean {\n if (record === null || typeof record !== 'object') return false;\n const rule = ACTIVITY_VISIBILITY_RULES[collection];\n if (!rule) return true;\n return rule(record as Record<string, unknown>);\n}\n","/**\n * Adult-content gating for Bluesky activity items.\n *\n * Bluesky's official moderation labeler attaches content labels to\n * `app.bsky.feed.defs#postView.labels`. The four sex-and-violence labels\n * below are the ones we hide by default on Sifa: media is replaced with an\n * `<AdultContentWarning>` placeholder card in sifa-web. Authenticated\n * viewers can reveal per-card; anonymous viewers cannot.\n *\n * The list mirrors Bluesky's own globalLabelStrings; if the official set\n * grows (e.g. a new `extreme-violence` label), update this constant.\n *\n * Why a constant + predicate live in the SDK: the same logic needs to run\n * in sifa-web today and sifa-app tomorrow, and the API only forwards the\n * raw labels — the hide decision is a client concern.\n */\n\nexport const ADULT_CONTENT_LABELS = ['porn', 'sexual', 'nudity', 'graphic-media'] as const;\n\nexport type AdultContentLabel = (typeof ADULT_CONTENT_LABELS)[number];\n\n/**\n * A single label entry as emitted by `app.bsky.feed.defs#postView.labels`.\n * Matches `com.atproto.label.defs#label` (the on-wire shape after the AppView\n * resolves a `postView`). `neg: true` marks a retraction.\n */\nexport interface ActivityLabel {\n val: string;\n src: string;\n uri: string;\n cts?: string;\n neg?: boolean;\n}\n\n/**\n * Return true if the item carries at least one adult-content label that is\n * not negated. Items without a `labels` field (every non-Bluesky source,\n * legacy responses) are treated as safe.\n */\nexport function hasAdultContent(item: { labels?: ActivityLabel[] }): boolean {\n const labels = item.labels;\n if (!labels || labels.length === 0) return false;\n return labels.some(\n (label) => !label.neg && (ADULT_CONTENT_LABELS as readonly string[]).includes(label.val),\n );\n}\n","/**\n * Publisher registry — single source of truth for apps that publish documents\n * through the shared `site.standard.*` namespace (Leaflet, Pckt, Offprint, …).\n *\n * Why this exists:\n * A document published via Leaflet, Pckt, Offprint, etc. lives canonically as a\n * `site.standard.document` record. The publisher is metadata, identifiable from\n * the publication's hostname. The activity-card, the publication merger in\n * sifa-api, and the external-URL health scanner all need the same hostname →\n * publisher mapping. Keeping it in one place stops the registry from drifting.\n *\n * What lives here:\n * - `id` — stable appId, also keys sifa-web's branding (logo, color)\n * - `name` — display name\n * - `hostSuffixes` — hostnames that identify a publication URL as this publisher\n * - `homeUrl` — last-resort URL when no per-document URL is available\n *\n * What does NOT live here:\n * - Logo components, color tokens, React chrome — those belong in sifa-web\n * keyed by `id`.\n * - Per-document URL construction — Standard documents are always\n * `${publication.url}${document.path}`. The publisher doesn't change that.\n */\n\nexport interface Publisher {\n /**\n * Stable identifier. Used as the `appId` across Sifa so that sifa-web's\n * `getAppMeta(id)` lookup yields the right logo and color, and so that\n * activity-stat rows tag correctly.\n */\n id: string;\n\n /** Display name shown in pills and headers. */\n name: string;\n\n /**\n * Hostnames that identify a publication URL as belonging to this publisher.\n * Matches the publication URL's hostname when it equals the suffix\n * (e.g. `leaflet.pub`) OR ends with it as a dotted suffix\n * (e.g. `notesbyarielm.leaflet.pub`).\n *\n * Allow multiple entries to future-proof against rebrands or aliases.\n */\n hostSuffixes: readonly string[];\n\n /** Public homepage of the publisher, used as a profile-level fallback URL. */\n homeUrl: string;\n}\n\n/**\n * Neutral fallback used when no branded publisher matches.\n *\n * Synthetic publishers returned by `getPublisherFromSiteUrl` use this `id` but\n * carry the document's own hostname in `name`, so cards can still show e.g.\n * \"feeds.byarielm.fyi\" as the publisher label.\n */\nexport const STANDARD_PUBLISHER_ID = 'standard' as const;\n\nexport const PUBLISHERS: readonly Publisher[] = Object.freeze([\n {\n id: 'leaflet',\n name: 'Leaflet',\n hostSuffixes: ['leaflet.pub'],\n homeUrl: 'https://leaflet.pub',\n },\n {\n id: 'pckt',\n name: 'pckt',\n hostSuffixes: ['pckt.blog'],\n homeUrl: 'https://pckt.blog',\n },\n {\n id: 'offprint',\n name: 'Offprint',\n hostSuffixes: ['offprint.app'],\n homeUrl: 'https://offprint.app',\n },\n {\n id: 'whitewind',\n name: 'WhiteWind',\n hostSuffixes: ['whtwnd.com'],\n homeUrl: 'https://whtwnd.com',\n },\n {\n id: 'unthread',\n name: 'Unthread',\n hostSuffixes: ['unthread.at'],\n homeUrl: 'https://unthread.at',\n },\n {\n id: 'blento',\n name: 'Blento',\n hostSuffixes: ['blento.io'],\n homeUrl: 'https://blento.io',\n },\n]);\n\nconst PUBLISHERS_BY_ID: ReadonlyMap<string, Publisher> = new Map(PUBLISHERS.map((p) => [p.id, p]));\n\n/** Lookup a registered publisher by id. Returns `undefined` for unknown ids. */\nexport function getPublisherById(id: string): Publisher | undefined {\n return PUBLISHERS_BY_ID.get(id);\n}\n\n/**\n * Match a hostname against the registry. Returns the registered publisher when\n * the hostname equals or is a dotted-subdomain of any of its `hostSuffixes`.\n * Returns `undefined` when no match is found (caller decides on the fallback).\n */\nexport function getPublisherByHost(hostname: string): Publisher | undefined {\n const host = hostname.toLowerCase();\n for (const publisher of PUBLISHERS) {\n for (const suffix of publisher.hostSuffixes) {\n if (host === suffix || host.endsWith(`.${suffix}`)) {\n return publisher;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Resolve the publisher for a publication's site URL.\n *\n * - On a branded host: returns the registered `Publisher` verbatim.\n * - On any other valid URL: returns a synthetic neutral publisher with\n * `id: 'standard'`, `name: <hostname>`, `hostSuffixes: []`, and the URL\n * as `homeUrl`. Cards can therefore always render a meaningful pill label.\n * - On an unparseable string: returns the same neutral shape with the raw\n * input as `name` and `homeUrl` (defensive — should never happen for data\n * coming from a valid `site.standard.publication`).\n */\nexport function getPublisherFromSiteUrl(siteUrl: string): Publisher {\n let hostname: string;\n let homeUrl: string;\n try {\n const parsed = new URL(siteUrl);\n hostname = parsed.hostname;\n homeUrl = `${parsed.protocol}//${parsed.hostname}`;\n } catch {\n return {\n id: STANDARD_PUBLISHER_ID,\n name: siteUrl,\n hostSuffixes: [],\n homeUrl: siteUrl,\n };\n }\n\n const matched = getPublisherByHost(hostname);\n if (matched) return matched;\n\n return {\n id: STANDARD_PUBLISHER_ID,\n name: hostname,\n hostSuffixes: [],\n homeUrl,\n };\n}\n","{\n \"$schema\": \"https://sifa.id/schemas/activity-verbs/v1.json\",\n \"version\": \"1.1.0\",\n \"updated\": \"2026-07-19\",\n \"defaultVerb\": \"created\",\n \"verbs\": {\n \"app.bsky.feed.post\": \"posted\",\n \"blue.flashes.feed.post\": \"posted\",\n \"social.psky.feed.post\": \"posted\",\n \"social.popfeed.feed.post\": \"posted\",\n \"social.popfeed.feed.note\": \"posted\",\n \"social.popfeed.feed.review\": \"reviewed\",\n \"buzz.bookhive.book\": \"reviewed\",\n \"fyi.unravel.frontpage.post\": \"posted\",\n \"forum.barazo.post\": \"posted\",\n \"app.bsky.feed.repost\": \"reposted\",\n \"com.whtwnd.blog.entry\": \"published\",\n \"site.standard.document\": \"published\",\n \"computer.aetheros.page\": \"published\",\n \"link.pastesphere.snippet\": \"published\",\n \"pub.leaflet.comment\": \"published\",\n \"id.sifa.profile.presentation\": \"presented\",\n \"id.sifa.profile.presentationDelivery\": \"presented\",\n \"id.sifa.endorsement\": \"endorsed\",\n \"sh.tangled.repo\": \"shipped\",\n \"sh.tangled.repo.issue\": \"shipped\",\n \"sh.tangled.repo.pull\": \"shipped\",\n \"app.sidetrail.trail\": \"shipped\",\n \"app.sidetrail.walk\": \"shipped\",\n \"social.colibri.membership\": \"joined\",\n \"id.sifa.project.membership\": \"joined\",\n \"id.sifa.project.member\": \"joined\",\n \"community.lexicon.calendar.rsvp\": \"joined\",\n \"at.youandme.connection\": \"joined\",\n \"id.sifa.graph.connection\": \"joined\"\n }\n}\n","import { z } from 'zod';\n\nimport rawVerbs from './verbs.json' with { type: 'json' };\n\n/**\n * The human action a stream item represents — a layer on top of `collection`\n * + `tier`. Groups semantically across apps (\"published\" spans WhiteWind and\n * standard-site; \"posted\" spans Bluesky and Picosky) so a day-grouped feed\n * reads like sentences.\n */\nexport const STREAM_VERBS = [\n 'posted',\n 'reposted',\n 'published',\n 'presented',\n 'endorsed',\n 'joined',\n 'shipped',\n 'reviewed',\n 'created',\n] as const;\n\nexport type StreamVerb = (typeof STREAM_VERBS)[number];\n\n/** Zod enum for a {@link StreamVerb}, shared with the view-model schema. */\nexport const streamVerbSchema = z.enum(STREAM_VERBS);\n\nexport interface ActivityVerbMap {\n version: string;\n updated: string;\n /** Verb returned for any collection not present in `verbs`. */\n defaultVerb: StreamVerb;\n /** Verb keyed by lexicon NSID. */\n verbs: Record<string, StreamVerb>;\n}\n\nconst verbMapSchema = z.object({\n version: z.string(),\n updated: z.string(),\n defaultVerb: streamVerbSchema,\n verbs: z.record(z.string(), streamVerbSchema),\n});\n\nconst parsed: ActivityVerbMap = verbMapSchema.parse(rawVerbs);\n\n/**\n * The verb map, keyed by lexicon NSID. Versioned independently from\n * `activity-tiers.json` so tier and verb evolve on their own cadence.\n */\nexport const ACTIVITY_VERBS: Readonly<ActivityVerbMap> = Object.freeze(parsed);\n\n/**\n * Returns the {@link StreamVerb} for an AT Protocol collection NSID. Unknown\n * or empty collections fall back to the map's `defaultVerb` (`created`).\n */\nexport function verbForCollection(collection: string): StreamVerb {\n if (!collection) return ACTIVITY_VERBS.defaultVerb;\n return ACTIVITY_VERBS.verbs[collection] ?? ACTIVITY_VERBS.defaultVerb;\n}\n\n/** Verb-map version + updated date, for diagnostics and version-skew checks. */\nexport function getActivityVerbsVersion(): { version: string; updated: string } {\n return { version: ACTIVITY_VERBS.version, updated: ACTIVITY_VERBS.updated };\n}\n","import { z } from 'zod';\n\nimport type {\n StreamAddress,\n StreamAuthor,\n StreamCardBody,\n StreamCardSubject,\n StreamCardVM,\n StreamExternalLink,\n StreamGeo,\n StreamMedia,\n StreamRichSegment,\n StreamSource,\n StreamTheme,\n} from './stream-card-vm.js';\nimport { streamVerbSchema } from './verbs.js';\n\n/** RGB channel: finite number in [0, 255] (mirrors `isValidRgbColor`). */\nconst rgbChannelSchema = z.number().min(0).max(255);\nconst rgbColorSchema = z.object({\n r: rgbChannelSchema,\n g: rgbChannelSchema,\n b: rgbChannelSchema,\n});\n\nconst aspectRatioSchema = z.object({\n width: z.number(),\n height: z.number(),\n});\n\nexport const streamSourceSchema: z.ZodType<StreamSource> = z.object({\n appId: z.string(),\n label: z.string(),\n color: z.string(),\n});\n\nexport const streamAuthorSchema: z.ZodType<StreamAuthor> = z.object({\n did: z.string().optional(),\n handle: z.string().optional(),\n displayName: z.string().optional(),\n avatar: z.string().optional(),\n});\n\nexport const streamThemeSchema: z.ZodType<StreamTheme> = z.object({\n background: rgbColorSchema,\n foreground: rgbColorSchema,\n accent: rgbColorSchema,\n});\n\nconst streamMediaResolvedSchema = z.object({\n url: z.string(),\n alt: z.string(),\n aspectRatio: aspectRatioSchema.optional(),\n mimeType: z.string().optional(),\n});\n\nconst streamMediaBlobSchema = z.object({\n did: z.string(),\n cid: z.string(),\n alt: z.string(),\n aspectRatio: aspectRatioSchema.optional(),\n mimeType: z.string().optional(),\n});\n\nexport const streamMediaSchema: z.ZodType<StreamMedia> = z.union([\n streamMediaResolvedSchema,\n streamMediaBlobSchema,\n]);\n\nexport const streamExternalLinkSchema: z.ZodType<StreamExternalLink> = z.object({\n url: z.string(),\n title: z.string().optional(),\n thumb: z.string().optional(),\n});\n\nexport const streamGeoSchema: z.ZodType<StreamGeo> = z.object({\n latitude: z.number(),\n longitude: z.number(),\n});\n\nexport const streamAddressSchema: z.ZodType<StreamAddress> = z.object({\n name: z.string().optional(),\n street: z.string().optional(),\n locality: z.string().optional(),\n region: z.string().optional(),\n country: z.string().optional(),\n postalCode: z.string().optional(),\n});\n\nexport const streamRichSegmentSchema: z.ZodType<StreamRichSegment> = z.object({\n text: z.string(),\n link: z.string().optional(),\n mention: z.string().optional(),\n tag: z.string().optional(),\n});\n\nexport const streamCardBodySchema: z.ZodType<StreamCardBody> = z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('text'),\n text: z.string(),\n richSegments: z.array(streamRichSegmentSchema).optional(),\n tags: z.array(z.string()).optional(),\n }),\n z.object({\n kind: z.literal('media'),\n text: z.string().optional(),\n tags: z.array(z.string()).optional(),\n }),\n z.object({\n kind: z.literal('link'),\n text: z.string().optional(),\n tags: z.array(z.string()).optional(),\n }),\n z.object({\n kind: z.literal('track'),\n text: z.string().optional(),\n trackTitle: z.string().optional(),\n artist: z.string().optional(),\n }),\n z.object({\n kind: z.literal('generic'),\n text: z.string().optional(),\n tags: z.array(z.string()).optional(),\n }),\n z.object({\n kind: z.literal('github-pr'),\n repoOwner: z.string(),\n repoName: z.string(),\n prNumber: z.number(),\n title: z.string(),\n url: z.string().optional(),\n language: z.string().optional(),\n additions: z.number(),\n deletions: z.number(),\n mergedAt: z.string().optional(),\n }),\n z.object({\n kind: z.literal('book'),\n title: z.string(),\n authors: z.array(z.string()),\n stars: z.number().optional(),\n status: z.string().optional(),\n review: z.string().optional(),\n }),\n z.object({\n kind: z.literal('media-review'),\n reviewKind: z.enum(['review', 'post', 'note', 'other']),\n title: z.string().optional(),\n mediaType: z.string().optional(),\n rating: z.number().optional(),\n mainCredit: z.string().optional(),\n reviewText: z.string().optional(),\n isRevisit: z.boolean(),\n }),\n z.object({\n kind: z.literal('event-rsvp'),\n rsvpStatus: z.enum(['going', 'interested', 'notgoing', 'unknown']),\n eventName: z.string().optional(),\n startsAt: z.string().optional(),\n endsAt: z.string().optional(),\n mode: z.enum(['inperson', 'virtual', 'hybrid']).optional(),\n locationName: z.string().optional(),\n locationLocality: z.string().optional(),\n locationCountry: z.string().optional(),\n }),\n z.object({\n kind: z.literal('verification'),\n platform: z.string(),\n verified: z.boolean(),\n subjectLabel: z.string().optional(),\n handle: z.string().optional(),\n profileUrl: z.string().optional(),\n }),\n z.object({\n kind: z.literal('membership'),\n communityName: z.string().optional(),\n description: z.string().optional(),\n communityUri: z.string().optional(),\n }),\n z.object({\n kind: z.literal('location'),\n venueName: z.string().optional(),\n shout: z.string().optional(),\n address: streamAddressSchema.optional(),\n geo: streamGeoSchema.optional(),\n }),\n z.object({\n kind: z.literal('travel'),\n origin: z.string().optional(),\n destination: z.string().optional(),\n transportation: z.string().optional(),\n carrier: z.string().optional(),\n carrierCode: z.string().optional(),\n startDate: z.string().optional(),\n endDate: z.string().optional(),\n }),\n z.object({\n kind: z.literal('standard-site'),\n title: z.string().optional(),\n description: z.string().optional(),\n siteUrl: z.string().optional(),\n path: z.string().optional(),\n publisherName: z.string().optional(),\n icon: z.string().optional(),\n coverImageUrl: z.string().optional(),\n readingTime: z.number().optional(),\n publishedAt: z.string().optional(),\n }),\n]);\n\n/**\n * A stream item's repost / reply / quote target. The `post` variant nests a\n * full {@link streamCardVMSchema} (deferred via `z.lazy` for recursion).\n */\nexport const streamCardSubjectSchema: z.ZodType<StreamCardSubject> = z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('post'),\n post: z.lazy(() => streamCardVMSchema),\n }),\n z.object({\n kind: z.literal('person'),\n did: z.string(),\n handle: z.string().optional(),\n displayName: z.string().optional(),\n avatar: z.string().optional(),\n }),\n z.object({\n kind: z.literal('record'),\n uri: z.string(),\n title: z.string().optional(),\n }),\n]);\n\n/** Zod schema for a {@link StreamCardVM}. Recursive through `subject.post`. */\nexport const streamCardVMSchema: z.ZodType<StreamCardVM> = z.lazy(() =>\n z.object({\n uri: z.string(),\n cid: z.string(),\n verb: streamVerbSchema,\n source: streamSourceSchema,\n author: streamAuthorSchema.optional(),\n tier: z.enum(['creation', 'action', 'filtered']),\n timestamp: z.string(),\n title: z.string(),\n sourceUrl: z.string().optional(),\n body: streamCardBodySchema.optional(),\n media: z.array(streamMediaSchema).optional(),\n externalLink: streamExternalLinkSchema.optional(),\n theme: streamThemeSchema.optional(),\n subject: z.lazy(() => streamCardSubjectSchema).optional(),\n }),\n);\n","import { z } from 'zod';\n\n/**\n * Grapheme-aware refinement matching the AT Protocol lexicon `maxGraphemes`\n * constraint. JS strings are sequences of UTF-16 code units, but lexicon\n * `maxGraphemes` counts user-perceived characters (grapheme clusters), so\n * emoji sequences, regional indicators, ZWJ joins, and combining marks all\n * count as one unit each. We use `Intl.Segmenter` to enforce this correctly.\n */\nexport function maxGraphemes(max: number) {\n return (value: string): boolean => {\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n let count = 0;\n for (const _ of segmenter.segment(value)) {\n count++;\n if (count > max) return false;\n }\n return true;\n };\n}\n\n/** Decentralized identifier, AT Protocol `format: did`. */\nexport const didSchema = z.string().regex(/^did:[a-z]+:[a-zA-Z0-9._:%-]+$/, 'Invalid DID');\n\n/** RFC 3339 datetime with timezone offset, AT Protocol `format: datetime`. */\nexport const datetimeSchema = z.string().datetime({ offset: true });\n\n/**\n * Freeform calendar date for user-facing profile dates (start/end, issued,\n * completed, awarded, published, etc.). Accepts a bare year, year-month,\n * year-month-day, or a full datetime (so a legacy record's RFC-3339 date maps\n * through on backfill without loss). NOT strict `datetime` -- users typically\n * remember only month/year, and LinkedIn-importer writes carry partial dates,\n * so the lexicons document these as freeform `YYYY-MM` / `YYYY-MM-DD`. Record\n * metadata like `createdAt` stays on `datetimeSchema`.\n */\nexport const partialDateSchema = z\n .string()\n .regex(/^\\d{4}(-\\d{2}(-\\d{2}(T.+)?)?)?$/, 'Expected YYYY, YYYY-MM, YYYY-MM-DD, or a datetime');\n\n/** Generic AT-URI, AT Protocol `format: at-uri`. */\nexport const atUriSchema = z.string().regex(/^at:\\/\\/[^\\s]+$/, 'Invalid AT-URI');\n\n/** Content identifier, AT Protocol `format: cid`. Loose validation -- accepts CIDv0 and CIDv1. */\nexport const cidSchema = z\n .string()\n .regex(/^(Qm[1-9A-HJ-NP-Za-km-z]{44}|b[A-Za-z0-9+/=]+)$/, 'Invalid CID');\n\n/** BCP 47 language tag, AT Protocol `format: language`. */\nexport const languageTagSchema = z\n .string()\n .regex(/^[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*$/, 'Invalid BCP 47 language tag');\n\n/** Generic URI, AT Protocol `format: uri`. */\nexport const uriSchema = z.string().url();\n\n/**\n * StrongRef shape from `com.atproto.repo.strongRef` -- pins a record by both\n * AT-URI (identity) and CID (version).\n */\nexport const strongRefSchema = z.object({\n uri: atUriSchema,\n cid: cidSchema,\n});\n\n/**\n * Reference to a record by AT-URI, with an optional CID. Mirrors\n * `id.sifa.defs#externalRecordRef`. Unlike a strongRef the CID is optional:\n * consumers resolve the AT-URI live so the reference tracks edits to the\n * target, and the CID is a best-effort integrity hint only.\n */\nexport const externalRecordRefSchema = z.object({\n uri: atUriSchema,\n cid: cidSchema.optional(),\n});\n\n/**\n * Self-labels shape from `com.atproto.label.defs#selfLabels`. Modelled\n * permissively because clients rarely construct this directly; the AppView\n * handles label validation.\n */\nexport const selfLabelsSchema = z.object({\n $type: z.literal('com.atproto.label.defs#selfLabels').optional(),\n values: z.array(z.object({ val: z.string() })),\n});\n","/**\n * Publisher allowlist for the Standard.site rich embed.\n *\n * Mirrors `bluesky-social/social-app`\n * `src/components/Post/Embed/StandardSiteEmbed/publishers.ts`. The only\n * gate this provides is which publishers get the highlighted\n * \"Subscribe on {Publisher}\" CTA with a publisher icon vs the plain\n * \"View publication\" fallback — any Standard.site embed renders\n * regardless of allowlist membership.\n *\n * Sync policy: review additions against the upstream bsky list weekly;\n * Singi Labs reviews before merge.\n */\n\nexport interface Publisher {\n /** Lowercase host. Subdomains are matched via `hostMatches`. */\n host: string;\n /** Human-facing publisher name shown in CTA copy. */\n name: string;\n /**\n * Stable identifier used by clients to look up brand icons. The SDK\n * does not ship icon assets — sifa-web maintains them keyed by this\n * id so React Native vs web rendering can diverge.\n */\n iconKey: 'leaflet' | 'pckt' | 'offprint';\n}\n\nexport const STANDARD_SITE_PUBLISHERS: readonly Publisher[] = Object.freeze([\n { host: 'leaflet.pub', name: 'Leaflet', iconKey: 'leaflet' },\n { host: 'pckt.blog', name: 'pckt', iconKey: 'pckt' },\n { host: 'offprint.app', name: 'Offprint', iconKey: 'offprint' },\n]);\n\n/**\n * Returns true when `host` exactly matches `target` or is a subdomain of\n * it. Hosts are expected to be lowercase already.\n */\nexport function hostMatches(host: string, target: string): boolean {\n return host === target || host.endsWith('.' + target);\n}\n\nfunction hostFromUri(uri: string | undefined | null): string | null {\n if (!uri) return null;\n try {\n return new URL(uri).host.toLowerCase();\n } catch {\n return null;\n }\n}\n\n/**\n * Match a publisher by host. Returns the publisher when `host` is on the\n * allowlist (exact or subdomain match), null otherwise. Host should be\n * lowercase.\n */\nexport function matchPublisherByHost(host: string | null | undefined): Publisher | null {\n if (!host) return null;\n const lower = host.toLowerCase();\n return STANDARD_SITE_PUBLISHERS.find((p) => hostMatches(lower, p.host)) ?? null;\n}\n\n/**\n * Match a publisher by URI. Convenience wrapper around\n * `matchPublisherByHost` for callers that have a publication URL handy.\n */\nexport function matchPublisherByUri(uri: string | undefined | null): Publisher | null {\n return matchPublisherByHost(hostFromUri(uri));\n}\n","import { resolveCardUrl } from '../cards/resolve-card-url.js';\nimport { isVisibleActivityItem } from '../cards/visibility.js';\nimport { isValidRgbColor } from '../format/wcag-contrast.js';\nimport { matchPublisherByUri } from '../publishing/index.js';\nimport { getActivityTier } from '../taxonomy/activity-tiers.js';\nimport type { ActivityItem } from './activity-item.js';\nimport type {\n StreamAddress,\n StreamAuthor,\n StreamCardBody,\n StreamCardSubject,\n StreamCardVM,\n StreamExternalLink,\n StreamGeo,\n StreamMedia,\n StreamRichSegment,\n StreamSource,\n StreamTheme,\n} from './stream-card-vm.js';\nimport { verbForCollection, type StreamVerb } from './verbs.js';\n\n/** Neutral fallback token — matches sifa-api's synthetic app-registry entry. */\nconst DEFAULT_SOURCE_COLOR = 'slate';\n\n/**\n * Options for {@link toStreamCardVM}. Kept out of the record so the transform\n * stays pure (no I/O): the app registry is runtime data, so callers inject a\n * color resolver built from the registry they already fetched.\n */\nexport interface ToStreamCardVMOptions {\n /**\n * Resolve an app's design-token color NAME (not a hex literal) from its\n * appId. Falls back to `slate` when unresolved.\n */\n resolveSourceColor?: (appId: string) => string | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Small pure helpers\n// ---------------------------------------------------------------------------\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' ? (value as Record<string, unknown>) : null;\n}\n\nfunction asNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\n/** at://did:plc:xxx/collection/rkey → the authoring DID. */\nfunction didFromUri(uri: string): string | undefined {\n const match = uri.match(/^at:\\/\\/(did:[^/]+)\\//);\n return match?.[1];\n}\n\n/** Extract the CID from an AT Protocol blob ref (`ref.$link` or a bare string). */\nfunction blobCid(blob: unknown): string | undefined {\n const rec = asRecord(blob);\n if (!rec) return undefined;\n const ref = rec.ref;\n if (typeof ref === 'string') return ref;\n const link = asRecord(ref)?.['$link'];\n return typeof link === 'string' ? link : undefined;\n}\n\nfunction aspectRatio(value: unknown): { width: number; height: number } | undefined {\n const rec = asRecord(value);\n const width = rec?.width;\n const height = rec?.height;\n if (typeof width === 'number' && typeof height === 'number') return { width, height };\n return undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\n/**\n * Extract a blob CID tolerating both a proper blob (`ref.$link`) and the\n * denormalized `{ cid }` shape some apps (BookHive, Colibri) store.\n */\nfunction looseBlobCid(value: unknown): string | undefined {\n const viaRef = blobCid(value);\n if (viaRef) return viaRef;\n const cid = asRecord(value)?.cid;\n return typeof cid === 'string' && cid.length > 0 ? cid : undefined;\n}\n\n/** A single blob-ref media item from a blob value, or undefined when absent. */\nfunction blobMedia(value: unknown, did: string, alt: string): StreamMedia | undefined {\n const cid = looseBlobCid(value);\n if (!cid) return undefined;\n const media: StreamMedia = { did, cid, alt };\n const ratio = aspectRatio(asRecord(value)?.aspectRatio);\n if (ratio) media.aspectRatio = ratio;\n const mimeType = asNonEmptyString(asRecord(value)?.mimeType);\n if (mimeType) media.mimeType = mimeType;\n return media;\n}\n\n/** The `#suffix` of an NSID-with-hash value (`x#going` → `#going`), else ''. */\nfunction hashSuffix(value: string): string {\n const i = value.lastIndexOf('#');\n return i >= 0 ? value.slice(i) : '';\n}\n\nconst WORDS_PER_MINUTE = 200;\n\n/** Estimated reading time in minutes from body text (matches sifa-web). */\nfunction estimateReadingTime(text: string | undefined): number | undefined {\n if (!text) return undefined;\n const words = text.trim().split(/\\s+/).filter(Boolean).length;\n if (words === 0) return undefined;\n return Math.max(1, Math.round(words / WORDS_PER_MINUTE));\n}\n\n/** Parse a beacon `location` into numeric geo. Lat/long may be string or number. */\nfunction beaconGeo(value: unknown): StreamGeo | undefined {\n const rec = asRecord(value);\n if (!rec) return undefined;\n const { latitude, longitude } = rec;\n const okType = (v: unknown): v is string | number =>\n typeof v === 'string' || typeof v === 'number';\n if (!okType(latitude) || !okType(longitude)) return undefined;\n const lat = Number(latitude);\n const lng = Number(longitude);\n if (!Number.isFinite(lat) || !Number.isFinite(lng)) return undefined;\n return { latitude: lat, longitude: lng };\n}\n\n/** Parse a beacon `addressDetails` into a structured address, or undefined. */\nfunction beaconAddress(value: unknown): StreamAddress | undefined {\n const rec = asRecord(value);\n if (!rec) return undefined;\n const address: StreamAddress = {};\n const name = asNonEmptyString(rec.name);\n if (name) address.name = name;\n const street = asNonEmptyString(rec.street);\n if (street) address.street = street;\n const locality = asNonEmptyString(rec.locality);\n if (locality) address.locality = locality;\n const region = asNonEmptyString(rec.region);\n if (region) address.region = region;\n const country = asNonEmptyString(rec.country);\n if (country) address.country = country;\n const postalCode = asNonEmptyString(rec.postalCode);\n if (postalCode) address.postalCode = postalCode;\n return Object.keys(address).length > 0 ? address : undefined;\n}\n\n/** Split BookHive's tab-separated authors into a trimmed, non-empty list. */\nfunction parseAuthors(value: unknown): string[] {\n if (typeof value !== 'string') return [];\n return value\n .split('\\t')\n .map((a) => a.trim())\n .filter((a) => a.length > 0);\n}\n\n// ---------------------------------------------------------------------------\n// Chrome\n// ---------------------------------------------------------------------------\n\nfunction buildSource(item: ActivityItem, options: ToStreamCardVMOptions): StreamSource {\n return {\n appId: item.appId,\n label: item.appName,\n color: options.resolveSourceColor?.(item.appId) ?? DEFAULT_SOURCE_COLOR,\n };\n}\n\n/**\n * The author identity for a card, from the AppView-injected handle / display\n * name / avatar and the DID parsed from the record uri. Returns undefined when\n * nothing is known (e.g. a Fediverse post whose uri is an http permalink, not\n * an at-uri, and carries no injected author fields), so the field stays absent\n * rather than an empty object.\n */\nfunction buildAuthor(item: ActivityItem): StreamAuthor | undefined {\n const did = didFromUri(item.uri);\n const handle = asNonEmptyString(item.authorHandle);\n const displayName = asNonEmptyString(item.authorDisplayName);\n const avatar = asNonEmptyString(item.authorAvatar);\n if (!did && !handle && !displayName && !avatar) return undefined;\n const author: StreamAuthor = {};\n if (did) author.did = did;\n if (handle) author.handle = handle;\n if (displayName) author.displayName = displayName;\n if (avatar) author.avatar = avatar;\n return author;\n}\n\n// Post-type verbs drop the app name (the source pill already shows it, so\n// \"Posted on Bluesky network\" reads as redundant); verbs where the platform\n// adds meaning keep \"on {App}\".\nconst TITLE_BY_VERB: Record<StreamVerb, (label: string) => string> = {\n posted: () => 'Posted',\n reposted: () => 'Reposted',\n published: (label) => `Published on ${label}`,\n presented: () => 'Gave a presentation',\n endorsed: () => 'Wrote an endorsement',\n joined: (label) => `Joined ${label}`,\n shipped: (label) => `Shipped on ${label}`,\n reviewed: (label) => `Reviewed on ${label}`,\n created: (label) => `Shared on ${label}`,\n};\n\nfunction buildTitle(verb: StreamVerb, label: string): string {\n return TITLE_BY_VERB[verb](label);\n}\n\n/**\n * The canonical http(s) permalink to this record on its source app, or\n * undefined. Delegates to the shared, pure {@link resolveCardUrl} using the\n * author DID parsed from the uri and the author handle — the AppView-injected\n * {@link ActivityItem.authorHandle}, falling back to a handle the record itself\n * carries. With a handle, handle-keyed apps (Bluesky, Popfeed, Tangled, ...)\n * resolve; did/uri/record.url-addressable apps (Smokesignal events, GitHub PRs,\n * Standard.site docs, ...) resolve from the uri alone. Only non-null http(s)\n * URLs are returned.\n */\nfunction resolveSourceUrl(item: ActivityItem, record: Record<string, unknown>): string | undefined {\n const authorDid = didFromUri(item.uri);\n if (!authorDid) return undefined;\n const authorHandle = asNonEmptyString(item.authorHandle) ?? asNonEmptyString(record.handle);\n const url = resolveCardUrl({\n collection: item.collection,\n record,\n uri: item.uri,\n rkey: item.rkey,\n authorDid,\n ...(authorHandle ? { authorHandle } : {}),\n });\n return url && /^https?:\\/\\//i.test(url) ? url : undefined;\n}\n\n/** Per-record RGB theme (publication / standard-site cards). Validated. */\nfunction readTheme(record: Record<string, unknown> | null): StreamTheme | undefined {\n const theme = asRecord(record?.publicationTheme ?? record?.theme);\n if (!theme) return undefined;\n const { background, foreground, accent } = theme;\n if (isValidRgbColor(background) && isValidRgbColor(foreground) && isValidRgbColor(accent)) {\n return { background, foreground, accent };\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Bluesky post body\n// ---------------------------------------------------------------------------\n\nfunction bskyImages(embed: Record<string, unknown>, did: string): StreamMedia[] {\n const images = embed.images;\n if (!Array.isArray(images)) return [];\n const out: StreamMedia[] = [];\n for (const raw of images) {\n const img = asRecord(raw);\n if (!img) continue;\n const cid = blobCid(img.image);\n if (!cid) continue;\n const media: StreamMedia = { did, cid, alt: asNonEmptyString(img.alt) ?? '' };\n const ratio = aspectRatio(img.aspectRatio);\n if (ratio) media.aspectRatio = ratio;\n const mimeType = asNonEmptyString(asRecord(img.image)?.mimeType);\n if (mimeType) media.mimeType = mimeType;\n out.push(media);\n }\n return out;\n}\n\nfunction bskyExternal(embed: Record<string, unknown>): StreamExternalLink | undefined {\n const external = asRecord(embed.external);\n if (!external) return undefined;\n const url = asNonEmptyString(external.uri);\n if (!url) return undefined;\n const link: StreamExternalLink = { url };\n const title = asNonEmptyString(external.title);\n if (title) link.title = title;\n // The raw record's `external.thumb` is a blob, not a URL. Resolving it would\n // require building a CDN URL, which is a surface concern — leave `thumb`\n // unset for now (M2 widens externalLink to carry blob refs if needed).\n return link;\n}\n\ninterface BskyEmbedContent {\n media?: StreamMedia[];\n externalLink?: StreamExternalLink;\n}\n\nfunction bskyEmbedContent(record: Record<string, unknown>, did: string): BskyEmbedContent {\n const embed = asRecord(record.embed);\n if (!embed) return {};\n\n // recordWithMedia wraps the media (images/external) alongside a quoted record.\n const type = asNonEmptyString(embed['$type']);\n const target = type === 'app.bsky.embed.recordWithMedia' ? asRecord(embed.media) : embed;\n if (!target) return {};\n\n if (Array.isArray(target.images)) {\n const media = bskyImages(target, did);\n return media.length > 0 ? { media } : {};\n }\n if (target.external != null) {\n const externalLink = bskyExternal(target);\n return externalLink ? { externalLink } : {};\n }\n return {};\n}\n\nfunction applyBskyPost(\n vm: StreamCardVM,\n item: ActivityItem,\n record: Record<string, unknown> | null,\n): StreamCardVM {\n if (!record) {\n vm.body = { kind: 'generic' };\n return vm;\n }\n\n const did = didFromUri(item.uri);\n const text = asNonEmptyString(record.text);\n const { media, externalLink } = did ? bskyEmbedContent(record, did) : {};\n if (media) vm.media = media;\n if (externalLink) vm.externalLink = externalLink;\n\n let body: StreamCardBody;\n if (text) body = { kind: 'text', text };\n else if (vm.media) body = { kind: 'media' };\n else if (vm.externalLink) body = { kind: 'link' };\n else body = { kind: 'generic' };\n vm.body = body;\n return vm;\n}\n\n// ---------------------------------------------------------------------------\n// App-specific body variants\n// ---------------------------------------------------------------------------\n\n/** Fall back to a generic body when the record is missing/invalid. */\nfunction withGeneric(vm: StreamCardVM): StreamCardVM {\n vm.body = { kind: 'generic' };\n return vm;\n}\n\n/**\n * Ingested Fediverse post (`fediverse.post`). Its `url` is the post's own\n * permalink, so it becomes the card's `sourceUrl` (the renderer makes the whole\n * card clickable) rather than an `externalLink` (which would render the raw URL\n * as visible text). The item uri is that http permalink, not an at-uri, so the\n * generic `resolveSourceUrl` path -- which parses a DID out of the uri -- can't\n * set it; do it here.\n */\nfunction applyFediversePost(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const url = httpUrl(record.url);\n if (url) vm.sourceUrl = url;\n const text = asNonEmptyString(record.excerpt);\n vm.body = text ? { kind: 'text', text } : { kind: 'generic' };\n return vm;\n}\n\nfunction applyGithubPr(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const body: Extract<StreamCardBody, { kind: 'github-pr' }> = {\n kind: 'github-pr',\n repoOwner: asNonEmptyString(record.repoOwner) ?? '',\n repoName: asNonEmptyString(record.repoName) ?? '',\n prNumber: asFiniteNumber(record.prNumber) ?? 0,\n title: asNonEmptyString(record.title) ?? '',\n additions: asFiniteNumber(record.additions) ?? 0,\n deletions: asFiniteNumber(record.deletions) ?? 0,\n };\n const url = asNonEmptyString(record.url);\n if (url) body.url = url;\n const language = asNonEmptyString(record.language);\n if (language) body.language = language;\n const mergedAt = asNonEmptyString(record.mergedAt);\n if (mergedAt) body.mergedAt = mergedAt;\n vm.body = body;\n return vm;\n}\n\nfunction applyBook(\n vm: StreamCardVM,\n item: ActivityItem,\n record: Record<string, unknown>,\n): StreamCardVM {\n const title = asNonEmptyString(record.title) ?? 'Untitled book';\n const body: Extract<StreamCardBody, { kind: 'book' }> = {\n kind: 'book',\n title,\n authors: parseAuthors(record.authors),\n };\n const stars = asFiniteNumber(record.stars);\n if (stars !== undefined && stars > 0) body.stars = stars;\n const status = asNonEmptyString(record.status);\n if (status) body.status = status;\n const review = asNonEmptyString(\n typeof record.review === 'string' ? record.review.trim() : undefined,\n );\n if (review) body.review = review;\n vm.body = body;\n\n const did = didFromUri(item.uri);\n if (did) {\n const cover = blobMedia(record.cover, did, `The cover of ${title}`);\n if (cover) vm.media = [cover];\n }\n return vm;\n}\n\nfunction popfeedReviewKind(collection: string): 'review' | 'post' | 'note' | 'other' {\n if (collection.endsWith('.review')) return 'review';\n if (collection.endsWith('.post')) return 'post';\n if (collection.endsWith('.note')) return 'note';\n return 'other';\n}\n\nfunction applyMediaReview(\n vm: StreamCardVM,\n item: ActivityItem,\n record: Record<string, unknown>,\n): StreamCardVM {\n const title = asNonEmptyString(record.title) ?? asNonEmptyString(record.name);\n const body: Extract<StreamCardBody, { kind: 'media-review' }> = {\n kind: 'media-review',\n reviewKind: popfeedReviewKind(item.collection),\n isRevisit: record.isRevisit === true,\n };\n if (title) body.title = title;\n const mediaType = asNonEmptyString(record.creativeWorkType);\n if (mediaType) body.mediaType = mediaType;\n const rating = asFiniteNumber(record.rating);\n if (rating !== undefined) body.rating = rating;\n const mainCredit = asNonEmptyString(record.mainCredit);\n if (mainCredit) body.mainCredit = mainCredit;\n const reviewText = asNonEmptyString(record.text);\n if (reviewText) body.reviewText = reviewText;\n vm.body = body;\n\n const posterUrl = asNonEmptyString(record.posterUrl);\n if (posterUrl) vm.media = [{ url: posterUrl, alt: title ? `${title} poster` : '' }];\n return vm;\n}\n\nconst RSVP_STATUS: Record<string, 'going' | 'interested' | 'notgoing'> = {\n '#going': 'going',\n '#interested': 'interested',\n '#notgoing': 'notgoing',\n};\n\nconst RSVP_MODE: Record<string, 'inperson' | 'virtual' | 'hybrid'> = {\n '#inperson': 'inperson',\n '#virtual': 'virtual',\n '#hybrid': 'hybrid',\n};\n\nfunction applyEventRsvp(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const status = asNonEmptyString(record.status);\n const body: Extract<StreamCardBody, { kind: 'event-rsvp' }> = {\n kind: 'event-rsvp',\n rsvpStatus: (status ? RSVP_STATUS[hashSuffix(status)] : undefined) ?? 'unknown',\n };\n const meta = asRecord(record.eventMeta);\n if (meta) {\n const eventName = asNonEmptyString(meta.name);\n if (eventName) body.eventName = eventName;\n const startsAt = asNonEmptyString(meta.startsAt);\n if (startsAt) body.startsAt = startsAt;\n const endsAt = asNonEmptyString(meta.endsAt);\n if (endsAt) body.endsAt = endsAt;\n const mode = asNonEmptyString(meta.mode);\n const modeEnum = mode ? RSVP_MODE[hashSuffix(mode)] : undefined;\n if (modeEnum) body.mode = modeEnum;\n const locationName = asNonEmptyString(meta.locationName);\n if (locationName) body.locationName = locationName;\n const locationLocality = asNonEmptyString(meta.locationLocality);\n if (locationLocality) body.locationLocality = locationLocality;\n const locationCountry = asNonEmptyString(meta.locationCountry);\n if (locationCountry) body.locationCountry = locationCountry;\n }\n vm.body = body;\n return vm;\n}\n\nfunction applyKeytraceVerification(\n vm: StreamCardVM,\n record: Record<string, unknown>,\n): StreamCardVM {\n const identity = asRecord(record.identity) ?? {};\n const subject = asNonEmptyString(identity.subject);\n const displayName = asNonEmptyString(identity.displayName);\n const body: Extract<StreamCardBody, { kind: 'verification' }> = {\n kind: 'verification',\n platform: asNonEmptyString(record.type) ?? 'unknown',\n verified: record.status === 'verified',\n };\n const subjectLabel = displayName ?? subject;\n if (subjectLabel) body.subjectLabel = subjectLabel;\n const profileUrl = asNonEmptyString(identity.profileUrl);\n if (profileUrl) body.profileUrl = profileUrl;\n vm.body = body;\n return vm;\n}\n\nfunction applyBskyVerification(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const handle = asNonEmptyString(record.handle);\n const displayName = asNonEmptyString(record.displayName);\n const body: Extract<StreamCardBody, { kind: 'verification' }> = {\n kind: 'verification',\n platform: 'bluesky',\n verified: true,\n };\n const subjectLabel = displayName ?? handle;\n if (subjectLabel) body.subjectLabel = subjectLabel;\n if (handle) body.handle = handle;\n vm.body = body;\n return vm;\n}\n\nfunction applyMembership(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const body: Extract<StreamCardBody, { kind: 'membership' }> = { kind: 'membership' };\n const communityUri = asNonEmptyString(record.community);\n if (communityUri) body.communityUri = communityUri;\n\n const meta = asRecord(record.communityMeta);\n const communityName = meta ? asNonEmptyString(meta.name) : undefined;\n if (communityName) body.communityName = communityName;\n const description = meta ? asNonEmptyString(meta.description) : undefined;\n if (description) body.description = description;\n vm.body = body;\n\n if (meta) {\n const ownerDid =\n asNonEmptyString(meta.ownerDid) ?? (communityUri ? didFromUri(communityUri) : undefined);\n if (ownerDid) {\n const picture = blobMedia(meta.picture, ownerDid, communityName ?? '');\n if (picture) vm.media = [picture];\n }\n }\n return vm;\n}\n\nfunction applyLocation(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const body: Extract<StreamCardBody, { kind: 'location' }> = { kind: 'location' };\n const venueName = asNonEmptyString(record.venueName);\n if (venueName) body.venueName = venueName;\n const shout = asNonEmptyString(record.shout);\n if (shout) body.shout = shout;\n const address = beaconAddress(record.addressDetails);\n if (address) body.address = address;\n const geo = beaconGeo(record.location);\n if (geo) body.geo = geo;\n vm.body = body;\n return vm;\n}\n\nfunction applyTravel(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const body: Extract<StreamCardBody, { kind: 'travel' }> = { kind: 'travel' };\n const origin = asNonEmptyString(record.originTransportCode);\n if (origin) body.origin = origin;\n const destination = asNonEmptyString(record.destinationTransportCode);\n if (destination) body.destination = destination;\n const transportation = asNonEmptyString(record.transportation);\n if (transportation) body.transportation = transportation;\n const carrier = asNonEmptyString(record.carrier);\n if (carrier) body.carrier = carrier;\n const carrierCode = asNonEmptyString(record.carrierCode);\n if (carrierCode) body.carrierCode = carrierCode;\n const startDate = asNonEmptyString(record.startDate);\n if (startDate) body.startDate = startDate;\n const endDate = asNonEmptyString(record.endDate);\n if (endDate) body.endDate = endDate;\n vm.body = body;\n return vm;\n}\n\nfunction applyStandardSite(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const body: Extract<StreamCardBody, { kind: 'standard-site' }> = { kind: 'standard-site' };\n const title = asNonEmptyString(record.title);\n if (title) body.title = title;\n const description = asNonEmptyString(record.description);\n if (description) body.description = description;\n const siteUrl = asNonEmptyString(record.siteUrl);\n if (siteUrl) {\n body.siteUrl = siteUrl;\n const publisherName = matchPublisherByUri(siteUrl)?.name;\n if (publisherName) body.publisherName = publisherName;\n }\n const path = asNonEmptyString(record.path);\n if (path) body.path = path;\n const icon = asNonEmptyString(record.publicationIcon);\n if (icon) body.icon = icon;\n const coverImageUrl = asNonEmptyString(record.coverImageUrl);\n if (coverImageUrl) body.coverImageUrl = coverImageUrl;\n const readingTime = estimateReadingTime(asNonEmptyString(record.textContent));\n if (readingTime !== undefined) body.readingTime = readingTime;\n const publishedAt = asNonEmptyString(record.publishedAt);\n if (publishedAt) body.publishedAt = publishedAt;\n vm.body = body;\n return vm;\n}\n\n/** at.youandme.connection: the record's `subject` is a bare person DID. */\nfunction applyYouAndMe(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const did = asNonEmptyString(record.subject);\n if (did) vm.subject = { kind: 'person', did };\n vm.body = { kind: 'generic' };\n return vm;\n}\n\n/** fyi.asq.answer: the record's `subject.uri` is the answered question. */\nfunction applyAsqAnswer(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const uri = asNonEmptyString(asRecord(record.subject)?.uri);\n if (uri) vm.subject = { kind: 'record', uri };\n vm.body = { kind: 'generic' };\n return vm;\n}\n\n// ---------------------------------------------------------------------------\n// Generic content extraction (base collections + unknown / future apps)\n// ---------------------------------------------------------------------------\n//\n// Collections without a typed body variant (Margin, Tangled, KipClip, Grain,\n// asq questions, Semble, Passports fifty-states, Streamplace, and every\n// unrecognized/future app) fall here. The rules below are GROUNDED in the\n// sifa-web card sources so each base collection reproduces the visible content\n// its dedicated card renders; for genuinely unknown records the same shapes act\n// as a best-effort heuristic, degrading to an empty generic body when a record\n// carries no recognizable text, media, link, or subject.\n\n/** A string with at least one non-whitespace character, else undefined. */\nfunction nonBlankString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value : undefined;\n}\n\n/** Read a `body` field that is a plain string OR `{ value: string }` (Margin). */\nfunction readBodyField(value: unknown): string | undefined {\n const direct = nonBlankString(value);\n if (direct) return direct;\n return nonBlankString(asRecord(value)?.value);\n}\n\n/** An http(s) URL string, else undefined. */\nfunction httpUrl(value: unknown): string | undefined {\n return typeof value === 'string' && /^https?:\\/\\//i.test(value) ? value : undefined;\n}\n\n/**\n * Ordered human-visible text fields. `body` (handled specially for the\n * `{ value }` shape) follows `content` and `excerpt`, before `message`. Mirrors\n * the union of fields the base cards read (generic\n * `text|title|name|description|content`, Tangled `name|title|text|message`,\n * Margin `body`, asq `title|body`). `excerpt` carries the post text for\n * external-feed items (Fediverse `fediverse.post`, RSS), which have no\n * `text`/`content` field.\n */\nconst GENERIC_TEXT_ORDER = [\n 'text',\n 'title',\n 'name',\n 'description',\n 'content',\n 'excerpt',\n 'body',\n 'message',\n 'note',\n 'caption',\n 'summary',\n 'status',\n] as const;\n\n/** The record's primary human-visible text, or undefined. */\nfunction genericText(collection: string, record: Record<string, unknown>): string | undefined {\n // Passports fifty-states carries no free-text field — its card composes\n // \"Visited {city}, {state}\". Only `city` is a real record string; the state\n // name mapping (US-NC → North Carolina) and the verb are surface concerns, so\n // the VM text is just the city (intentionally partial, never invented).\n if (collection === 'social.passports.fiftyStates.visit') {\n return nonBlankString(record.city);\n }\n for (const field of GENERIC_TEXT_ORDER) {\n if (field === 'body') {\n const body = readBodyField(record.body);\n if (body) return body;\n continue;\n }\n const value = nonBlankString(record[field]);\n if (value) return value;\n }\n return undefined;\n}\n\n/** Non-empty string tags off `record.tags`, or undefined. */\nfunction genericTags(record: Record<string, unknown>): string[] | undefined {\n const tags = record.tags;\n if (!Array.isArray(tags)) return undefined;\n const out = tags.filter((t): t is string => typeof t === 'string' && t.length > 0);\n return out.length > 0 ? out : undefined;\n}\n\n/**\n * Blob-ref image media from the common record shapes (reuses M1's blob helpers;\n * never builds a URL). Prefers an `images[]` / `embed.images[]` array (all\n * valid items), then single-blob fields, then Grain's bare `galleryMeta\n * .coverPhotoCid`.\n */\nfunction genericMedia(record: Record<string, unknown>, did: string, alt: string): StreamMedia[] {\n const fromArray = (raw: unknown): StreamMedia | undefined => {\n const img = asRecord(raw);\n if (!img) return undefined;\n return blobMedia(img.image ?? raw, did, asNonEmptyString(img.alt) ?? alt);\n };\n\n const images = record.images;\n if (Array.isArray(images)) {\n const out = images.map(fromArray).filter((m): m is StreamMedia => m !== undefined);\n if (out.length > 0) return out;\n }\n\n const embed = asRecord(record.embed);\n if (embed && Array.isArray(embed.images)) {\n const out = embed.images.map(fromArray).filter((m): m is StreamMedia => m !== undefined);\n if (out.length > 0) return out;\n }\n\n const single =\n blobMedia(record.image, did, alt) ??\n blobMedia(record.thumbnail, did, alt) ??\n blobMedia(record.thumb, did, alt) ??\n blobMedia(record.photo, did, alt) ??\n (embed ? blobMedia(embed.thumbnail, did, alt) : undefined);\n if (single) return [single];\n\n // Grain galleries store the cover as a bare CID string, not a blob object.\n const coverCid = asRecord(record.galleryMeta)?.coverPhotoCid;\n if (typeof coverCid === 'string' && coverCid.length > 0) {\n return [{ did, cid: coverCid, alt }];\n }\n return [];\n}\n\n/**\n * An outbound link from the common shapes: a Bluesky-style `embed.external`,\n * then a bare URL in `source` (Margin bookmark), `subject` (KipClip), or `url`.\n */\nfunction genericExternalLink(record: Record<string, unknown>): StreamExternalLink | undefined {\n const embed = asRecord(record.embed);\n if (embed) {\n const fromEmbed = bskyExternal(embed);\n if (fromEmbed) return fromEmbed;\n }\n const url = httpUrl(record.source) ?? httpUrl(record.subject) ?? httpUrl(record.url);\n return url ? { url } : undefined;\n}\n\n/**\n * A reply/quote/answer target from common reference shapes: `subject` as an\n * `at://` uri or a bare `did:` (person), or `subject.uri` (strongRef). A bare\n * http(s) `subject` is a bookmark target, handled as `externalLink` instead.\n */\nfunction genericSubject(record: Record<string, unknown>): StreamCardSubject | undefined {\n const subject = record.subject;\n if (typeof subject === 'string') {\n if (subject.startsWith('at://')) return { kind: 'record', uri: subject };\n if (subject.startsWith('did:')) return { kind: 'person', did: subject };\n return undefined;\n }\n const uri = nonBlankString(asRecord(subject)?.uri);\n if (uri && uri.startsWith('at://')) return { kind: 'record', uri };\n return undefined;\n}\n\n/** Recognize one facet feature (link / mention / tag), tolerating a missing $type. */\nfunction parseFacetFeature(\n features: unknown[],\n): Pick<StreamRichSegment, 'link' | 'mention' | 'tag'> | undefined {\n for (const raw of features) {\n const feat = asRecord(raw);\n if (!feat) continue;\n const type = asNonEmptyString(feat['$type']) ?? '';\n const uri = asNonEmptyString(feat.uri);\n const did = asNonEmptyString(feat.did);\n const tag = asNonEmptyString(feat.tag);\n if (type.endsWith('#link') && uri) return { link: uri };\n if (type.endsWith('#mention') && did) return { mention: did };\n if (type.endsWith('#tag') && tag) return { tag };\n // No / unknown $type: fall back to whichever identifying field is present.\n if (uri) return { link: uri };\n if (did) return { mention: did };\n if (tag) return { tag };\n }\n return undefined;\n}\n\n/**\n * Slice `text` into rich segments using `app.bsky.richtext.facet`-style\n * byte-offset facets. Heuristic and additive: `body.text` always holds the full\n * plain string, so a renderer may ignore this. Returns undefined unless at least\n * one enriched (link/mention/tag) span is produced.\n */\nfunction genericRichSegments(\n text: string,\n record: Record<string, unknown>,\n): StreamRichSegment[] | undefined {\n const facets = record.facets;\n if (!Array.isArray(facets)) return undefined;\n\n const parsed: { start: number; end: number; link?: string; mention?: string; tag?: string }[] =\n [];\n for (const raw of facets) {\n const facet = asRecord(raw);\n const index = asRecord(facet?.index);\n const start = asFiniteNumber(index?.byteStart);\n const end = asFiniteNumber(index?.byteEnd);\n if (start === undefined || end === undefined || start < 0 || end <= start) continue;\n const features = facet?.features;\n if (!Array.isArray(features)) continue;\n const feature = parseFacetFeature(features);\n if (!feature) continue;\n parsed.push({ start, end, ...feature });\n }\n if (parsed.length === 0) return undefined;\n\n const bytes = new TextEncoder().encode(text);\n const decoder = new TextDecoder();\n parsed.sort((a, b) => a.start - b.start);\n\n const segments: StreamRichSegment[] = [];\n let cursor = 0;\n for (const span of parsed) {\n if (span.start < cursor || span.start > bytes.length) continue; // overlap / OOB\n const end = Math.min(span.end, bytes.length);\n if (span.start > cursor) {\n const plain = decoder.decode(bytes.slice(cursor, span.start));\n if (plain) segments.push({ text: plain });\n }\n const seg: StreamRichSegment = { text: decoder.decode(bytes.slice(span.start, end)) };\n if (span.link) seg.link = span.link;\n if (span.mention) seg.mention = span.mention;\n if (span.tag) seg.tag = span.tag;\n segments.push(seg);\n cursor = end;\n }\n if (cursor < bytes.length) {\n const rest = decoder.decode(bytes.slice(cursor));\n if (rest) segments.push({ text: rest });\n }\n\n return segments.some((s) => s.link ?? s.mention ?? s.tag) ? segments : undefined;\n}\n\n/**\n * Populate a generic body with any real content the record carries — text,\n * media (blob refs), an external link, and a reply/quote/answer subject —\n * choosing `body.kind` the same way the Bluesky path does (text, else media,\n * else link, else generic).\n */\nfunction applyGeneric(\n vm: StreamCardVM,\n item: ActivityItem,\n record: Record<string, unknown> | null,\n): StreamCardVM {\n if (!record) return withGeneric(vm);\n\n const text = genericText(item.collection, record);\n const tags = genericTags(record);\n const did = didFromUri(item.uri);\n if (did) {\n const media = genericMedia(record, did, text ?? '');\n if (media.length > 0) vm.media = media;\n }\n const externalLink = genericExternalLink(record);\n if (externalLink) vm.externalLink = externalLink;\n // Don't clobber a repost/reply subject already normalized from item.subject.\n if (!vm.subject) {\n const subject = genericSubject(record);\n if (subject) vm.subject = subject;\n }\n\n let body: StreamCardBody;\n if (text) {\n body = { kind: 'text', text };\n const richSegments = genericRichSegments(text, record);\n if (richSegments) body.richSegments = richSegments;\n if (tags) body.tags = tags;\n } else if (vm.media) {\n body = { kind: 'media' };\n if (tags) body.tags = tags;\n } else if (vm.externalLink) {\n body = { kind: 'link' };\n if (tags) body.tags = tags;\n } else {\n body = { kind: 'generic' };\n if (tags) body.tags = tags;\n }\n vm.body = body;\n return vm;\n}\n\n// ---------------------------------------------------------------------------\n// Entry points\n// ---------------------------------------------------------------------------\n\n/**\n * Normalize one {@link ActivityItem} into a framework-free {@link StreamCardVM}.\n * Pure: no I/O, no React, no DOM, and no resolved CDN URLs (media carries raw\n * blob refs so each surface builds its own URL). Total: always returns a VM.\n *\n * Reference implementations: the generic/unknown case, `app.bsky.feed.post`\n * (text + images + external embed), and reposts (whose `subject` is normalized\n * through this same function). Collections with a typed body variant\n * (`github-pr`, `book`, `media-review`, `event-rsvp`, `verification`,\n * `membership`, `location`, `travel`, `standard-site`) are enriched from their\n * raw record below; `at.youandme.connection` and `fyi.asq.answer` populate a\n * person / record `subject`. Everything else (base collections + unknown apps)\n * flows through {@link applyGeneric}, which extracts text / media / link /\n * subject from common record shapes, degrading to an empty generic body.\n */\nexport function toStreamCardVM(\n item: ActivityItem,\n options: ToStreamCardVMOptions = {},\n): StreamCardVM {\n const verb = verbForCollection(item.collection);\n const source = buildSource(item, options);\n const record = asRecord(item.record);\n const timestamp = (record ? asNonEmptyString(record.createdAt) : undefined) ?? item.indexedAt;\n\n const vm: StreamCardVM = {\n uri: item.uri,\n cid: item.cid,\n verb,\n source,\n tier: getActivityTier(item.collection),\n timestamp,\n title: buildTitle(verb, source.label),\n };\n\n const author = buildAuthor(item);\n if (author) vm.author = author;\n\n const theme = readTheme(record);\n if (theme) vm.theme = theme;\n\n // Link to the record on its source app. Set before the switch so every\n // body-variant return path (each mutates and returns this same vm) keeps it.\n if (record) {\n const sourceUrl = resolveSourceUrl(item, record);\n if (sourceUrl) vm.sourceUrl = sourceUrl;\n }\n\n // Repost / reply target, normalized through the same transform. Its own\n // sourceUrl is computed by this recursion.\n if (item.subject) {\n vm.subject = { kind: 'post', post: toStreamCardVM(item.subject, options) };\n }\n\n switch (item.collection) {\n case 'app.bsky.feed.post':\n return applyBskyPost(vm, item, record);\n case 'github.pull_request':\n return record ? applyGithubPr(vm, record) : withGeneric(vm);\n case 'buzz.bookhive.book':\n return record ? applyBook(vm, item, record) : withGeneric(vm);\n case 'community.lexicon.calendar.rsvp':\n return record ? applyEventRsvp(vm, record) : withGeneric(vm);\n case 'dev.keytrace.claim':\n return record ? applyKeytraceVerification(vm, record) : withGeneric(vm);\n case 'app.bsky.graph.verification':\n return record ? applyBskyVerification(vm, record) : withGeneric(vm);\n case 'social.colibri.membership':\n return record ? applyMembership(vm, record) : withGeneric(vm);\n case 'app.beaconbits.beacon':\n return record ? applyLocation(vm, record) : withGeneric(vm);\n case 'social.passports.travel.leg':\n return record ? applyTravel(vm, record) : withGeneric(vm);\n case 'site.standard.document':\n return record ? applyStandardSite(vm, record) : withGeneric(vm);\n case 'at.youandme.connection':\n return record ? applyYouAndMe(vm, record) : withGeneric(vm);\n case 'fyi.asq.answer':\n return record ? applyAsqAnswer(vm, record) : withGeneric(vm);\n case 'fediverse.post':\n return record ? applyFediversePost(vm, record) : withGeneric(vm);\n }\n\n // social.popfeed.feed.{post,note,review} — registered by prefix in sifa-web.\n if (record && item.collection.startsWith('social.popfeed.feed.')) {\n return applyMediaReview(vm, item, record);\n }\n\n // Base collections + unknown / future apps: extract real content generically.\n return applyGeneric(vm, item, record);\n}\n\n/**\n * Map a list of activity items to VMs, applying {@link isVisibleActivityItem}\n * first so both surfaces (sifa-web, page.sifa.id) filter identically — a\n * filtered item produces no VM rather than a null-rendering card.\n */\nexport function toStreamCardVMs(\n items: ActivityItem[],\n options: ToStreamCardVMOptions = {},\n): StreamCardVM[] {\n const out: StreamCardVM[] = [];\n for (const item of items) {\n if (isVisibleActivityItem(item.collection, item.record)) {\n out.push(toStreamCardVM(item, options));\n }\n }\n return out;\n}\n","/**\n * Profile completeness scoring.\n *\n * Six binary signals, equal weight: headline filled, about filled, has at least\n * one position, education, skill, certification.\n *\n * Score: integer 0..6. Percent: round(score / 6 * 100) -- discrete values\n * {0, 17, 33, 50, 67, 83, 100}.\n *\n * Canonical source of truth for completeness scoring across Sifa clients.\n * sifa-api computes the underlying `ProfileCompletion` shape inline (in SQL\n * for admin-stats queries, in route handlers elsewhere) but defers scoring\n * to this module.\n */\n\nexport const COMPLETENESS_MAX_SCORE = 6;\n\nexport interface ProfileCompletion {\n hasHeadline: boolean;\n hasAbout: boolean;\n positionCount: number;\n educationCount: number;\n skillCount: number;\n certificationCount: number;\n}\n\n/** Pure-TS computation of the 0..6 score. */\nexport function completenessScore(c: ProfileCompletion): number {\n let filled = 0;\n if (c.hasHeadline) filled++;\n if (c.hasAbout) filled++;\n if (c.positionCount > 0) filled++;\n if (c.educationCount > 0) filled++;\n if (c.skillCount > 0) filled++;\n if (c.certificationCount > 0) filled++;\n return filled;\n}\n\n/** Completion as a rounded 0..100 integer percent (matches API serialisation). */\nexport function completenessPercent(c: ProfileCompletion): number {\n return Math.round((completenessScore(c) / COMPLETENESS_MAX_SCORE) * 100);\n}\n","/**\n * Profile dimensions -- the routing signal used by the Sifa homepage to choose\n * between the V3 \"still building\" and V4 \"established\" variants.\n *\n * Six binary signals, equal weight: avatar, headline, about, current position,\n * minimum-skill threshold, and at least one education entry. The routing\n * threshold itself (e.g. \">= 4 of 6 -> ESTABLISHED\") lives in the consumer\n * because different surfaces may want to cut at different bars over time.\n *\n * Canonical source of truth for dimension scoring across Sifa clients.\n * sifa-api computes the underlying `ProfileDimensionInputs` shape inline\n * (in SQL on the session route) but defers scoring to this module so the\n * frontend and backend cannot drift on what \"filled\" means.\n *\n * See `docs/plans/2026-04-27-homepage-variants.md` (sifa-web) for the\n * history of why these six were chosen over the original eight.\n */\n\nimport type { Profile, ProfilePosition } from '../types/index.js';\n\nexport const DIMENSIONS_MAX_SCORE = 6;\nexport const MIN_SKILLS = 3;\n\nexport type DimensionKey =\n | 'avatar'\n | 'headline'\n | 'about'\n | 'currentPosition'\n | 'skills'\n | 'education';\n\nexport type DimensionMap = Record<DimensionKey, boolean>;\n\n/**\n * Minimal raw inputs needed to compute the dimension map. sifa-api can\n * populate this from a single composite SQL query without loading the full\n * Profile shape, which is the whole point of putting this in the SDK.\n */\nexport interface ProfileDimensionInputs {\n hasAvatar: boolean;\n hasHeadline: boolean;\n hasAbout: boolean;\n currentPositionCount: number;\n skillCount: number;\n educationCount: number;\n}\n\nfunction nonEmptyString(value: string | undefined | null): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/**\n * Pure-TS computation of the 6-key boolean map from minimal inputs.\n * Use this when you already have aggregate counts (e.g. server-side).\n */\nexport function dimensionsFromInputs(inputs: ProfileDimensionInputs): DimensionMap {\n return {\n avatar: inputs.hasAvatar,\n headline: inputs.hasHeadline,\n about: inputs.hasAbout,\n currentPosition: inputs.currentPositionCount > 0,\n skills: inputs.skillCount >= MIN_SKILLS,\n education: inputs.educationCount > 0,\n };\n}\n\n/**\n * Derives `ProfileDimensionInputs` from a full Profile. Use this on the\n * client when you already have the profile loaded.\n */\nexport function profileToDimensionInputs(profile: Profile): ProfileDimensionInputs {\n const positions = profile.positions ?? [];\n const skills = profile.skills ?? [];\n const education = profile.education ?? [];\n const currentPositionCount = positions.filter((p: ProfilePosition) => !p.endedAt).length;\n return {\n hasAvatar: nonEmptyString(profile.avatar),\n hasHeadline: nonEmptyString(profile.headline),\n hasAbout: nonEmptyString(profile.about),\n currentPositionCount,\n skillCount: skills.length,\n educationCount: education.length,\n };\n}\n\n/** Convenience: full Profile -> dimension boolean map. */\nexport function getFilledDimensionsMap(profile: Profile): DimensionMap {\n return dimensionsFromInputs(profileToDimensionInputs(profile));\n}\n\n/** Count of filled dimensions, 0..6. Accepts either raw inputs or a full Profile. */\nexport function countFilledDimensions(input: ProfileDimensionInputs | Profile): number {\n const map = 'hasAvatar' in input ? dimensionsFromInputs(input) : getFilledDimensionsMap(input);\n let n = 0;\n for (const v of Object.values(map)) {\n if (v) n++;\n }\n return n;\n}\n","/**\n * Canonical rule for picking the \"primary\" position to surface on profile cards,\n * social previews, and structured-data outputs.\n *\n * Without this shared helper, different surfaces (visible hero, OG image,\n * <meta description>, JSON-LD) re-derived \"primary\" inconsistently and diverged\n * for users with multiple concurrent roles.\n *\n * Rules (in order):\n * 1. A position the user explicitly flagged `primary` AND that is still active.\n * 2. Otherwise, the active position with the most recent `startedAt`.\n * 3. Otherwise, undefined (no active position).\n */\n\nexport interface PrimaryPositionCandidate {\n startedAt?: string;\n endedAt?: string;\n primary?: boolean;\n}\n\nexport function pickPrimaryPosition<T extends PrimaryPositionCandidate>(\n positions: readonly T[] | undefined,\n): T | undefined {\n if (!positions || positions.length === 0) return undefined;\n\n const active = positions.filter((p) => !p.endedAt);\n if (active.length === 0) return undefined;\n\n const flagged = active.find((p) => p.primary === true);\n if (flagged) return flagged;\n\n return [...active].sort((a, b) => (b.startedAt ?? '').localeCompare(a.startedAt ?? ''))[0];\n}\n","/**\n * Pseudo-employer detection (#159). Self-employment strings (\"self-employed\",\n * \"freelance\", \"independent\", ...) are NOT organizations: the position editor\n * routes them to the company-optional / \"Independent\" path instead of the entity\n * typeahead, and they are excluded from entity matching everywhere.\n *\n * Matching is on the WHOLE normalized string, not substrings, so real employers\n * that merely contain one of these words (\"Independent School District 191\")\n * are not misclassified. Mirrors the sifa-api matcher.\n */\nconst PSEUDO_EMPLOYERS = new Set<string>([\n 'self',\n 'self employed',\n 'selfemployed',\n 'self employment',\n 'self employed freelance',\n 'freelance',\n 'freelancer',\n 'freelancing',\n 'freelance work',\n 'independent',\n 'independent contractor',\n 'independent consultant',\n 'independent professional',\n 'sole proprietor',\n 'sole proprietorship',\n 'sole trader',\n 'own business',\n 'my own business',\n 'self employed consultant',\n]);\n\nfunction normalizePseudo(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n .replace(/\\s+/g, ' ');\n}\n\n/** True when the whole employer string is a self-employment / pseudo employer. */\nexport function isPseudoEmployer(company: string): boolean {\n const normalized = normalizePseudo(company);\n if (!normalized) return false;\n return PSEUDO_EMPLOYERS.has(normalized);\n}\n","/**\n * Lightweight \"does this typeahead query look like a domain?\" predicate, used to\n * decide whether to fire the domain grow-on-demand path (resolve-domain) on a\n * local typeahead miss. It is a heuristic, NOT a validator: the API re-validates\n * against the public suffix list. It only needs to distinguish \"randstad.com\"\n * (a domain) from \"Randstad\" / \"Acme Corp\" (a name) so a plain company name\n * never triggers a domain lookup.\n *\n * Accepts an optional scheme and path (`https://www.stripe.com/pricing`), a\n * leading `www.`, and multi-label hosts; requires at least one dot and a >=2\n * alpha final label (TLD-shaped); rejects whitespace and `@` (emails).\n *\n * Runs on uncontrolled typeahead input, so it is deliberately ReDoS-safe: the\n * input length is bounded up front (a domain is <=253 chars), the host is\n * extracted with plain string ops (no scheme/path/trailing-dot regex), and each\n * label is validated by a single anchored, bounded pattern. There is no\n * ambiguous or nested quantifier anywhere, so matching is linear in the input.\n */\n\n/** Max DNS name length; anything longer is rejected before any matching. */\nconst MAX_DOMAIN_LEN = 253;\n\n/**\n * One DNS label: 1-63 chars, alphanumeric, internal hyphens allowed. Anchored\n * and length-bounded, with a single optional group and no outer quantifier, so\n * it cannot backtrack polynomially.\n */\nconst LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;\n\n/** Final label must be TLD-shaped: 2-63 alphabetic chars. */\nconst TLD = /^[a-z]{2,63}$/;\n\n/** Strip trailing dots without a regex (avoids the `\\.+$` polynomial pattern). */\nfunction stripTrailingDots(s: string): string {\n let end = s.length;\n while (end > 0 && s.charCodeAt(end - 1) === 0x2e /* '.' */) end -= 1;\n return s.slice(0, end);\n}\n\nexport function looksLikeDomain(query: string): boolean {\n const q = query.trim().toLowerCase();\n // Bound the input BEFORE any matching. A domain is <=253 chars; a longer\n // typeahead value is never a domain, and this caps every check below to a\n // constant amount of work (ReDoS guard).\n if (!q || q.length > MAX_DOMAIN_LEN) return false;\n if (q.includes(' ') || q.includes('\\t') || q.includes('@')) return false;\n\n // Extract the host with plain string ops -- no backtracking regex on input.\n let host = q;\n const schemeAt = host.indexOf('://');\n if (schemeAt !== -1) host = host.slice(schemeAt + 3);\n // Cut at the first path / query / fragment delimiter.\n for (let i = 0; i < host.length; i += 1) {\n const ch = host[i];\n if (ch === '/' || ch === '?' || ch === '#') {\n host = host.slice(0, i);\n break;\n }\n }\n if (host.startsWith('www.')) host = host.slice(4);\n // Strip a trailing :port.\n const colonAt = host.lastIndexOf(':');\n if (colonAt !== -1 && /^[0-9]{1,5}$/.test(host.slice(colonAt + 1))) {\n host = host.slice(0, colonAt);\n }\n host = stripTrailingDots(host);\n if (!host || host.length > MAX_DOMAIN_LEN) return false;\n\n // Validate each label independently (split first, so no quantifier spans dots).\n const labels = host.split('.');\n if (labels.length < 2) return false;\n const tld = labels[labels.length - 1];\n if (tld === undefined || !TLD.test(tld)) return false;\n for (let i = 0; i < labels.length - 1; i += 1) {\n if (!LABEL.test(labels[i] as string)) return false;\n }\n return true;\n}\n","import type { EntitySearchResult } from '../schemas/entity.js';\n\n/**\n * Disambiguation-display helpers for the org typeahead (#159, Flow 1A-2). Two\n * same-name orgs must be told apart at a glance, so each row shows its domain,\n * country, and parent where known.\n */\n\nexport interface DisambiguationFields {\n domain?: string | null;\n country?: string | null;\n parentName?: string | null;\n}\n\n/**\n * Build the muted secondary line for a typeahead row, e.g.\n * `spryker.com · DE · part of Spryker Holding`. Empty when nothing to show.\n */\nexport function entityDisambiguationLabel(fields: DisambiguationFields): string {\n const parts: string[] = [];\n if (fields.domain) parts.push(fields.domain);\n if (fields.country) parts.push(fields.country);\n if (fields.parentName) parts.push(`part of ${fields.parentName}`);\n return parts.join(' · ');\n}\n\n/** Convenience over {@link entityDisambiguationLabel} for a search result row. */\nexport function searchResultDisambiguation(result: EntitySearchResult): string {\n return entityDisambiguationLabel({\n domain: result.domain,\n country: result.country,\n parentName: result.parentName,\n });\n}\n\n/** Stable per-row identity for React keys and dedupe (entity id or PDL id). */\nexport function entityResultKey(result: EntitySearchResult): string {\n return result.source === 'entity' ? `entity:${result.entityId}` : `pdl:${result.pdlId}`;\n}\n","/**\n * Anchor-quality classification for a position's `entityRef` pointer (#159).\n *\n * A durable company link tiers by the quality of its anchor, which drives the\n * link indicator in the UI (registry-backed reads stronger than a Sifa-scoped\n * PDL pointer, per the ratified D5 chip policy). The classification is derived\n * purely from the ref URI's host, so it is a shared, cross-platform predicate\n * (web today, the native app later).\n *\n * registry -- a portable external id any atproto app can resolve\n * (Wikidata / ROR / GLEIF). Renders as a full \"Linked\" indicator.\n * sifa -- a Sifa-scoped `sifa.id/company/<publicId>` pointer for a\n * PDL-only company. Renders as a muted \"Linked\" (no glyph).\n * unlinked -- no ref, a malformed URL, or an unrecognized host. Free text.\n *\n * NEVER surfaced as \"verified\": a link is not a verification.\n */\nexport const ENTITY_REF_ANCHORS = ['registry', 'sifa', 'unlinked'] as const;\nexport type EntityRefAnchor = (typeof ENTITY_REF_ANCHORS)[number];\n\n/** Hosts of portable, app-neutral company registries. */\nconst REGISTRY_HOSTS = new Set([\n 'wikidata.org',\n 'www.wikidata.org',\n 'ror.org',\n 'gleif.org',\n 'www.gleif.org',\n]);\n\nconst SIFA_HOST = 'sifa.id';\n\n/**\n * Classify an entityRef by anchor quality. Uses strict host parsing (never\n * substring matching) so a hostile URL that merely contains a registry host in a\n * query string is treated as unlinked, not falsely linked.\n */\nexport function classifyEntityRef(entityRef: string | null | undefined): EntityRefAnchor {\n if (!entityRef || !entityRef.trim()) return 'unlinked';\n let url: URL;\n try {\n url = new URL(entityRef.trim());\n } catch {\n return 'unlinked';\n }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') return 'unlinked';\n const host = url.hostname.toLowerCase();\n if (REGISTRY_HOSTS.has(host)) return 'registry';\n if (host === SIFA_HOST) return 'sifa';\n return 'unlinked';\n}\n\n/** Whether a position carries a durable link of any anchor quality. */\nexport function isLinked(entityRef: string | null | undefined): boolean {\n return classifyEntityRef(entityRef) !== 'unlinked';\n}\n","import type { OrgProfileRecord } from '../schemas/org-profile.js';\nimport { looksLikeDomain } from './domain-detect.js';\n\n/**\n * Handle hosts that are shared PDS / signup domains, never a single\n * organization's registrable identity. A handle under one of these (e.g.\n * `acme.bsky.social`) is a subdomain of someone else's domain, so it can never\n * satisfy the org rendering floor. Lowercased, leading-dot form for a suffix\n * match. Kept in sync with the PDS provider list in `format/pds-utils.ts`.\n */\nconst KNOWN_HANDLE_HOST_SUFFIXES = [\n '.bsky.social',\n '.blacksky.app',\n '.eurosky.social',\n '.northsky.social',\n] as const;\n\n/**\n * Approximate \"is this handle a custom registrable domain?\" check for the org\n * rendering floor.\n *\n * IMPORTANT -- this is deliberately NARROW, not authoritative. The SDK has no\n * public-suffix-list (PSL) dependency, so it cannot compute the true eTLD+1\n * apex: it cannot tell `acme.co.uk` (an apex) from `careers.acme.co.uk` (a\n * subdomain that routes to the subsidiary case), nor reject every PSL-private\n * host. It performs only the rejects it CAN make correctly with no PSL:\n * - DIDs (never a domain handle),\n * - bare / no-dot handles and non-TLD-shaped hosts (via `looksLikeDomain`),\n * - known shared PDS / handle hosts (`*.bsky.social` and friends).\n *\n * The AUTHORITATIVE apex + eTLD+1 + confusable check is server-side in\n * sifa-api's `bind-domain-guard` (`isBindableHandleDomain`, backed by `tldts`);\n * `computeOrgFloorVerdict` there is the source of truth and is surfaced to\n * clients on the profile resolve (read it via `useOrgProfile`). Recompute here\n * only when a client-side floor gate is needed without a round-trip.\n *\n * TODO(#160): promote a shared PSL-backed eTLD+1 helper into the SDK (or vendor\n * a compact public-suffix table) and tighten this to a true apex check.\n *\n * Pure: no network, no I/O.\n */\nexport function isRegistrableDomainHandle(handle: string): boolean {\n const h = handle.trim().toLowerCase();\n if (!h) return false;\n if (h.startsWith('did:')) return false;\n // Requires >=1 dot and a TLD-shaped final label; rejects bare usernames.\n if (!looksLikeDomain(h)) return false;\n for (const suffix of KNOWN_HANDLE_HOST_SUFFIXES) {\n if (h.endsWith(suffix)) return false;\n }\n return true;\n}\n\n/**\n * The org rendering floor (#160) -- the \"any AppView can evaluate\" promise made\n * executable. An account renders as an organization when BOTH:\n * 1. It has an `id.sifa.org.profile` record (record present), AND\n * 2. Its handle is a custom registrable domain\n * ({@link isRegistrableDomainHandle}).\n *\n * Only the PRESENCE of the record matters here (declaration marks the account\n * as presenting-as-org; trust is layered separately). The handle check is LIVE:\n * evaluate it on every render so a lost domain drops org rendering\n * automatically.\n *\n * Pure: no network, no I/O. Pass the fetched record (or null) and the current\n * handle.\n */\nexport function qualifiesAsOrg(\n record: OrgProfileRecord | null | undefined,\n handle: string,\n): boolean {\n if (record === null || record === undefined) return false;\n return isRegistrableDomainHandle(handle);\n}\n","/**\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","/**\n * Shared, single-source-of-truth model for which profile sections render, in\n * what order, their nav grouping, and which items a given viewer may see.\n *\n * Every Sifa profile surface builds on this: the HTML profile page, the\n * Markdown / DOCX / print exports, and the standalone personal-site renderer.\n * Adding a section to {@link ALL_SECTIONS} makes it appear everywhere (the\n * exports drive presence + order from here, and {@link SECTION_LABELS} is an\n * exhaustive `Record<SectionId, string>`, so a new id is a compile error until\n * it has a label).\n *\n * The per-section sorts live in `./section-sorts.js`, built on the same SDK\n * date extractors the HTML section components use, so the surfaces cannot\n * diverge on ordering.\n */\n\nimport type { Profile } from '../types/index.js';\n\n/**\n * Side-nav groups, in display order. Each labels a contiguous run of sections\n * in {@link ALL_SECTIONS}. `labelKey` resolves against the consumer's `sections`\n * i18n namespace.\n */\nexport const SECTION_GROUPS = [\n { id: 'overview', labelKey: 'groupOverview' },\n { id: 'experience', labelKey: 'groupExperience' },\n { id: 'qualifications', labelKey: 'groupQualifications' },\n { id: 'more', labelKey: 'groupMore' },\n] as const;\n\nexport type SectionGroupId = (typeof SECTION_GROUPS)[number]['id'];\n\n/**\n * Profile body sections in render + nav order (evidence-first): identity and\n * activity lead, then living work (career, skills, projects, talks,\n * publications), then the formal record (credentials, education, courses), then\n * the rest. `ns` selects the consumer's i18n namespace for `labelKey`; `group`\n * ties the section to a {@link SECTION_GROUPS} header.\n */\nexport const ALL_SECTIONS = [\n { id: 'about', labelKey: 'about', ns: 'profile' as const, group: 'overview' as const },\n { id: 'career', labelKey: 'career', ns: 'sections' as const, group: 'experience' as const },\n { id: 'skills', labelKey: 'skills', ns: 'sections' as const, group: 'experience' as const },\n { id: 'projects', labelKey: 'projects', ns: 'sections' as const, group: 'experience' as const },\n {\n id: 'presentations',\n labelKey: 'talksAndSessions',\n ns: 'sections' as const,\n group: 'experience' as const,\n },\n {\n id: 'publications',\n labelKey: 'publications',\n ns: 'sections' as const,\n group: 'experience' as const,\n },\n {\n id: 'credentials',\n labelKey: 'credentials',\n ns: 'sections' as const,\n group: 'qualifications' as const,\n },\n {\n id: 'education',\n labelKey: 'education',\n ns: 'sections' as const,\n group: 'qualifications' as const,\n },\n { id: 'courses', labelKey: 'courses', ns: 'sections' as const, group: 'qualifications' as const },\n { id: 'awards', labelKey: 'awards', ns: 'sections' as const, group: 'more' as const },\n { id: 'involvement', labelKey: 'involvement', ns: 'sections' as const, group: 'more' as const },\n { id: 'languages', labelKey: 'languages', ns: 'sections' as const, group: 'more' as const },\n {\n id: 'other-profiles',\n labelKey: 'otherProfiles',\n ns: 'sections' as const,\n group: 'more' as const,\n },\n] as const;\n\n/** Every profile section id, in canonical render order. */\nexport type SectionId = (typeof ALL_SECTIONS)[number]['id'];\n\n/** Whether a section has content for a given profile (used to hide empty nav entries for visitors). */\nexport function isSectionPopulated(profile: Profile, id: string): boolean {\n switch (id) {\n case 'about':\n return Boolean(profile.about && profile.headline);\n case 'career':\n return Boolean(profile.positions?.length);\n case 'education':\n return Boolean(profile.education?.length);\n case 'courses':\n return Boolean(profile.courses?.length);\n case 'skills':\n return Boolean(profile.skills?.length);\n case 'projects':\n return Boolean(profile.projects?.length);\n case 'credentials':\n return Boolean(profile.certifications?.length);\n case 'publications':\n return Boolean(profile.publications?.length);\n case 'presentations':\n return (\n Boolean(profile.presentations?.length) || Boolean(profile.presentationDeliveries?.length)\n );\n case 'involvement':\n return Boolean(profile.involvement?.length);\n case 'awards':\n return Boolean(profile.honors?.length);\n case 'languages':\n return Boolean(profile.languages?.length);\n case 'other-profiles':\n return Boolean(profile.externalAccounts?.length);\n default:\n return false;\n }\n}\n\n/**\n * The section ids a given viewer should see, in {@link ALL_SECTIONS} order.\n * Owners see every section; visitors only see populated ones.\n */\nexport function getVisibleSectionIds(profile: Profile, isOwnProfile: boolean): SectionId[] {\n return ALL_SECTIONS.map((s) => s.id).filter(\n (id) => isOwnProfile || isSectionPopulated(profile, id),\n );\n}\n\n/** Drop items the owner has hidden from visitors. */\nexport function filterHidden<T extends { hidden?: boolean }>(items: T[] | undefined): T[] {\n return (items ?? []).filter((i) => !i.hidden);\n}\n\n/**\n * Items visible to a given viewer: owners see their own hidden items, visitors\n * do not. Shared by every export format (markdown, docx, print) and the public\n * `.md` route so the hidden rule lives in one place.\n */\nexport function visibleItems<T extends { hidden?: boolean }>(\n items: T[] | undefined,\n isOwnProfile: boolean,\n): T[] {\n return isOwnProfile ? (items ?? []) : filterHidden(items);\n}\n\n/**\n * English heading text for each section, keyed by {@link SectionId} (e.g.\n * `other-profiles` renders as \"Links\"). Exhaustive `Record<SectionId, string>`:\n * adding a section to {@link ALL_SECTIONS} without a label here is a compile\n * error, so a section can never silently render without (or with a stale)\n * heading. Consumers with i18n resolve their own localized labels via\n * `labelKey`; this is the canonical English fallback used by the exports.\n */\nexport const SECTION_LABELS: Record<SectionId, string> = {\n about: 'About',\n career: 'Career',\n skills: 'Skills',\n projects: 'Projects',\n presentations: 'Talks & sessions',\n publications: 'Publications',\n credentials: 'Credentials',\n education: 'Education',\n courses: 'Courses',\n awards: 'Awards',\n involvement: 'Involvement',\n languages: 'Languages',\n 'other-profiles': 'Links',\n};\n","import { sortByDateDesc } from '../format/sort-by-date.js';\n\nconst hasValue = (date?: string) => !!date;\n\n/**\n * Sort items by date range, floating ongoing entries (startDate present, endDate\n * absent) to the top. Items with no dates sink to the bottom.\n *\n * Used by sections whose lexicons have no explicit `current` flag -- ongoing is\n * implicit from a missing endDate. Without this wrapper, the shared\n * `dateRangeExtractor` reads `item.current` (always undefined for these items)\n * and sinks ongoing entries below completed ones.\n *\n * Sections using lexicon-aligned `startedAt`/`endedAt` fields (positions,\n * education) should use `lexiconDateExtractor` instead -- that extractor already\n * derives `current` correctly.\n */\nexport function sortByActiveDateRange<T extends { startDate?: string; endDate?: string }>(\n items: T[],\n): T[] {\n return sortByDateDesc(items, (p) => ({\n startDate: p.startDate,\n endDate: p.endDate,\n current: !hasValue(p.endDate) && hasValue(p.startDate),\n }));\n}\n","const PROFICIENCY_RANK: Record<string, number> = {\n native: 5,\n full_professional: 4,\n professional_working: 3,\n limited_working: 2,\n elementary: 1,\n};\n\nfunction rank(proficiency: string | undefined): number {\n if (!proficiency) return 0;\n return PROFICIENCY_RANK[proficiency] ?? 0;\n}\n\n/** Sort languages by proficiency (native first), then alphabetically within a rank. */\nexport function sortLanguagesByProficiency<T extends { language?: string; proficiency?: string }>(\n items: T[],\n): T[] {\n return [...items].sort((a, b) => {\n const diff = rank(b.proficiency) - rank(a.proficiency);\n if (diff !== 0) return diff;\n return (a.language ?? '').localeCompare(b.language ?? '');\n });\n}\n","/**\n * Per-section item sorts, shared by every profile surface so ordering can't\n * diverge between the HTML page and the Markdown / DOCX / print exports and the\n * standalone personal-site renderer. Thin wrappers over the SDK date extractors\n * plus the range/language sorts in this directory.\n */\n\nimport type {\n ProfilePosition,\n ProfileEducation,\n ProfileProject,\n ProfilePublication,\n ProfileCertification,\n ProfileHonor,\n ProfileLanguage,\n} from '../types/index.js';\nimport {\n sortByDateDesc,\n lexiconDateExtractor,\n singleDateExtractor,\n certDateExtractor,\n} from '../format/sort-by-date.js';\nimport { sortByActiveDateRange } from './range-sort.js';\nimport { sortLanguagesByProficiency } from './language-sort.js';\n\n/**\n * Move a `primary && !endedAt` position to the top, matching the HTML career\n * section, so the current primary role always leads.\n */\nexport function hoistPrimary(positions: ProfilePosition[]): ProfilePosition[] {\n const idx = positions.findIndex((p) => p.primary && !p.endedAt);\n if (idx <= 0) return positions;\n const primary = positions[idx]!;\n return [primary, ...positions.slice(0, idx), ...positions.slice(idx + 1)];\n}\n\nexport const sortPositions = (items: ProfilePosition[]): ProfilePosition[] =>\n hoistPrimary(sortByDateDesc(items, lexiconDateExtractor));\n\nexport const sortEducation = (items: ProfileEducation[]): ProfileEducation[] =>\n sortByDateDesc(items, lexiconDateExtractor);\n\nexport const sortProjects = (items: ProfileProject[]): ProfileProject[] =>\n sortByActiveDateRange(items);\n\nexport const sortPublications = (items: ProfilePublication[]): ProfilePublication[] =>\n sortByDateDesc(items, singleDateExtractor);\n\nexport const sortCertifications = (items: ProfileCertification[]): ProfileCertification[] =>\n sortByDateDesc(items, certDateExtractor);\n\nexport const sortHonors = (items: ProfileHonor[]): ProfileHonor[] =>\n sortByDateDesc(items, singleDateExtractor);\n\nexport const sortLanguages = (items: ProfileLanguage[]): ProfileLanguage[] =>\n sortLanguagesByProficiency(items);\n","import { getInvolvementKindHeading } from '../taxonomy/involvement-kind.js';\nimport type { ProfileInvolvement } from '../types/index.js';\n\n/**\n * Fixed display order of involvement headings. A group renders only when it has\n * records. Charity + mapped legacy volunteering fall under \"Volunteering\".\n */\nexport const INVOLVEMENT_HEADING_ORDER = [\n 'Open Source',\n 'Community',\n 'Volunteering',\n 'Civic',\n 'Other',\n] as const;\n\nexport interface InvolvementGroup {\n heading: string;\n items: ProfileInvolvement[];\n}\n\n/**\n * Group involvement records by their kind's display heading, in the fixed order\n * above, most-recent first within a group. Empty groups are omitted. An unknown\n * kind falls under \"Other\" (via the shared heading map).\n */\nexport function groupInvolvementByHeading(items: ProfileInvolvement[]): InvolvementGroup[] {\n const byHeading = new Map<string, ProfileInvolvement[]>();\n for (const item of items) {\n const heading = getInvolvementKindHeading(item.kind);\n const bucket = byHeading.get(heading) ?? [];\n bucket.push(item);\n byHeading.set(heading, bucket);\n }\n const recency = (i: ProfileInvolvement) => i.endedAt ?? i.startedAt ?? '';\n const groups: InvolvementGroup[] = [];\n for (const heading of INVOLVEMENT_HEADING_ORDER) {\n const bucket = byHeading.get(heading);\n if (!bucket?.length) continue;\n const sorted = [...bucket].sort((a, b) => recency(b).localeCompare(recency(a)));\n groups.push({ heading, items: sorted });\n }\n return groups;\n}\n","import { z } from 'zod';\n\n/**\n * Blob-ref passthrough shared by records that carry an uploaded blob (org logo,\n * presentation cover image, ...). Mirrors the `blobRefSchema` validated by the\n * sifa-api write endpoints -- the shape is validated, then written to the PDS\n * verbatim.\n */\nexport const BlobRefSchema = z.object({\n $type: z.literal('blob'),\n ref: z.object({ $link: z.string().min(1) }),\n mimeType: z.string().min(1).max(255),\n size: z.number().int().nonnegative(),\n});\n\nexport type BlobRef = z.infer<typeof BlobRefSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, strongRefSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.endorsement.confirmation` records.\n * Lives in the endorsee's PDS to approve display of an endorsement.\n */\nexport const EndorsementConfirmationRecordSchema = z.object({\n endorsement: strongRefSchema,\n createdAt: datetimeSchema,\n});\n\nexport type EndorsementConfirmationRecord = z.infer<typeof EndorsementConfirmationRecordSchema>;\n","import { z } from 'zod';\n\n/**\n * Organization entity-resolution payloads (#159). Shared by the typeahead,\n * selection, and grow-on-demand import-search endpoints on sifa-api.\n */\n\n/**\n * A nullable string constrained to an http(s) URL. Rejects `javascript:` and\n * other script-bearing schemes at the SDK boundary so a hostile API response\n * cannot smuggle an XSS payload into a rendered `href`/`src`. Note: Wikidata\n * entity URIs are canonically `http://`, so both http and https are allowed.\n */\nconst httpUrlNullable = z\n .string()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'must be an http(s) URL' })\n .nullable();\n\nconst searchResultCommon = {\n kind: z.string(),\n name: z.string(),\n domain: z.string().nullable(),\n country: z.string().nullable(),\n logoUrl: httpUrlNullable,\n parentName: z.string().nullable(),\n};\n\n/**\n * A single typeahead row. Discriminated on `source`: a curated `entity` row\n * carries `entityId`, a `pdl` staging row carries `pdlId`. The union guarantees\n * the identifier for the row's source is always present, so a stable React key\n * can never be `entity:undefined`. The disambiguation fields\n * (domain/country/parentName) drive the dropdown display.\n */\nexport const EntitySearchResultSchema = z.discriminatedUnion('source', [\n z.object({\n source: z.literal('entity'),\n entityId: z.number().int().positive(),\n ...searchResultCommon,\n }),\n z.object({\n source: z.literal('pdl'),\n pdlId: z.string().min(1),\n ...searchResultCommon,\n }),\n]);\nexport type EntitySearchResult = z.infer<typeof EntitySearchResultSchema>;\n\n/** Response of `GET /api/entities/search`. */\nexport const EntitySearchResponseSchema = z.object({\n results: z.array(EntitySearchResultSchema),\n hasMore: z.boolean(),\n});\nexport type EntitySearchResponse = z.infer<typeof EntitySearchResponseSchema>;\n\n/**\n * Body of `POST /api/entities/select`: promote a PDL row OR bump an entity.\n * Exactly one of `entityId`/`pdlId` must be present -- supplying both is\n * ambiguous (the server would have to silently pick one) and is rejected.\n */\nexport const EntitySelectRequestSchema = z\n .object({\n entityId: z.number().int().positive().optional(),\n pdlId: z.string().min(1).optional(),\n })\n .refine((v) => (v.entityId != null) !== (v.pdlId != null), {\n message: 'exactly one of entityId or pdlId is required',\n });\nexport type EntitySelectRequest = z.infer<typeof EntitySelectRequestSchema>;\n\n/** Response of `POST /api/entities/select`. `entityRef` is the portable\n * Wikidata/ROR/LEI URI to write to the position record, or null for a\n * PDL-only entity (its resolution stays AppView-side). */\nexport const EntitySelectResponseSchema = z.object({\n entityId: z.number().int().positive(),\n slug: z.string(),\n kind: z.string(),\n canonicalName: z.string(),\n domain: z.string().nullable(),\n entityRef: httpUrlNullable,\n});\nexport type EntitySelectResponse = z.infer<typeof EntitySelectResponseSchema>;\n\n/** Response of `POST /api/entities/import-search`. */\nexport const EntityImportSearchResponseSchema = z.object({\n results: z.array(EntitySearchResultSchema),\n});\nexport type EntityImportSearchResponse = z.infer<typeof EntityImportSearchResponseSchema>;\n\n/**\n * Body of the domain grow-on-demand endpoints (`POST /api/entities/resolve-domain`\n * and `POST /api/entities/mint-domain`). The server re-validates the value as a\n * registrable domain; 253 is the max DNS name length.\n */\nexport const EntityResolveDomainRequestSchema = z.object({\n domain: z.string().min(1).max(253),\n});\nexport type EntityResolveDomainRequest = z.infer<typeof EntityResolveDomainRequestSchema>;\n\n/**\n * Response of `POST /api/entities/resolve-domain` (grow-on-demand Branch 1). Any\n * notable companies whose official website is the domain, imported from Wikidata.\n * `canMint` is true when nothing notable matched AND the domain is eligible for\n * the user-initiated mint-from-domain path -- it drives the \"Add <domain>\"\n * affordance.\n */\nexport const EntityResolveDomainResponseSchema = z.object({\n results: z.array(EntitySearchResultSchema),\n canMint: z.boolean(),\n});\nexport type EntityResolveDomainResponse = z.infer<typeof EntityResolveDomainResponseSchema>;\n\n/**\n * Response of `POST /api/entities/mint-domain` (grow-on-demand Branch 2). The\n * linkable entity minted from (or already resolved for) the domain. A non-2xx\n * status (e.g. the domain is not mintable, a confusable look-alike, or the site\n * yielded nothing usable) surfaces as a thrown error, not a null result.\n *\n * `pending` is true when the entity is a fresh hidden-pending mint: the\n * requesting user's own link resolves to it immediately, but it stays out of\n * other users' typeahead + aggregation until an admin approves it. Clients should\n * reflect this (\"added -- pending review\") rather than \"added & live\".\n */\nexport const EntityMintDomainResponseSchema = z.object({\n result: EntitySearchResultSchema,\n pending: z.boolean(),\n});\nexport type EntityMintDomainResponse = z.infer<typeof EntityMintDomainResponseSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, strongRefSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.endorsement` records. Lives in the endorser's PDS;\n * the endorser identity is implicit (whoever owns the repository).\n */\nexport const EndorsementRecordSchema = z.object({\n subject: didSchema,\n skill: strongRefSchema,\n skillName: z.string().min(1).refine(maxGraphemes(64)).max(640),\n comment: z.string().refine(maxGraphemes(300)).max(3000).optional(),\n createdAt: datetimeSchema,\n});\n\nexport type EndorsementRecord = z.infer<typeof EndorsementRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes, selfLabelsSchema, uriSchema } from './shared.js';\n\n/**\n * Structured physical address for an organization. Mirrors\n * `community.lexicon.location.address` (all fields optional). Sifa enforces\n * ISO 3166-1 alpha-2 country codes at the app layer.\n */\nconst orgAddressSchema = z.object({\n country: z.string().optional(),\n postalCode: z.string().optional(),\n region: z.string().optional(),\n locality: z.string().optional(),\n street: z.string().optional(),\n name: z.string().optional(),\n});\n\n/** A featured link on the org profile. Both `name` and `url` are required. */\nconst orgLinkSchema = z.object({\n name: z.string().refine(maxGraphemes(60)).max(600),\n url: uriSchema.max(2048),\n});\n\n/**\n * Zod schema for `id.sifa.org.profile` records -- the self-declared\n * organization profile. Singleton (record key `self`), lives in the org's PDS.\n * Presence of this record marks the account as presenting as an organization;\n * trust is layered separately (rendering floor, verification labels).\n *\n * Mirrors the lexicon wire shape (grapheme + byte caps, blob logo, uri refs).\n * For the sifa-api write-endpoint contract, use the schemas under\n * `@singi-labs/sifa-sdk/schemas/write` instead.\n */\nexport const OrgProfileRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n /** Blob ref for the org logo (`image/png` | `image/jpeg`). Not deeply validated client-side. */\n logo: z.unknown().optional(),\n website: uriSchema.optional(),\n entityRefs: z.array(uriSchema).max(20).optional(),\n /** Contact email. NOT rendered publicly; validated as email at the app layer. */\n contact: z.string().optional(),\n /** Physical addresses (headquarters, offices). */\n addresses: z.array(orgAddressSchema).max(10).optional(),\n /**\n * Self-selected headcount range (a declared bucket, never a calculated count).\n * Open enum (bare-string knownValues in the lexicon): `1-10`, `11-50`,\n * `51-200`, `201-500`, `501-1000`, `1001-5000`, `5001-10000`, `10001+`. Any\n * string is accepted so future ranges do not break older records.\n */\n companySize: z.string().optional(),\n /** Featured links or content surfaced on the org profile. */\n links: z.array(orgLinkSchema).max(10).optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type OrgProfileRecord = z.infer<typeof OrgProfileRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n strongRefSchema,\n uriSchema,\n} from './shared.js';\n\n/**\n * Zod schema for `id.sifa.org.employmentAttestation` records -- an\n * organization's attestation that a person is or was employed in a specific\n * position. Lives in the org's PDS (the org is implicit: whoever owns the repo).\n *\n * The position identity is pinned via a snapshot triple (`title`, `startedAt`,\n * and the entity identifier `entityRef` | `companyDid`) so editing those pinned\n * fields on the referenced position record voids the attestation. The free-text\n * company name is never pinned (a rebrand must not invalidate the attestation).\n *\n * `startedAt` / `endedAt` mirror the position lexicon's freeform `YYYY-MM` /\n * `YYYY-MM-DD` date shape, not strict `datetime`.\n */\nexport const OrgEmploymentAttestationRecordSchema = z.object({\n subject: didSchema,\n position: strongRefSchema,\n status: z.enum(['current', 'past']),\n title: z.string().min(1).refine(maxGraphemes(256)).max(2560),\n startedAt: partialDateSchema,\n entityRef: uriSchema.optional(),\n companyDid: didSchema.optional(),\n endedAt: partialDateSchema.optional(),\n comment: z.string().refine(maxGraphemes(300)).max(3000).optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type OrgEmploymentAttestationRecord = z.infer<typeof OrgEmploymentAttestationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.graph.follow` records.\n *\n * One-way professional follow; the record lives in the follower's PDS. Per\n * iter-1 decisions (`plans/2026-06-01-in-sifa-follow-primitive.md`), this is\n * a **distinct** graph from `app.bsky.graph.follow`, not a superset — but\n * the required field shape (`subject` + `createdAt`) is intentionally\n * identical so generic Bluesky `listRecords` consumers get usable records.\n *\n * `note` is a Sifa addition: an optional reason for the follow (\"why I\n * followed\"). Capped at 200 graphemes to match other profile-flavored\n * lexicon fields.\n */\nexport const GraphFollowRecordSchema = z.object({\n subject: didSchema,\n createdAt: datetimeSchema,\n note: z.string().refine(maxGraphemes(200), 'note must be at most 200 graphemes').optional(),\n});\n\nexport type GraphFollowRecord = z.infer<typeof GraphFollowRecordSchema>;\n\n/**\n * Build a `GraphFollowRecordSchema` that rejects self-follow at the Zod\n * layer (CLAUDE.md mandatory standards #3 — input validation; sifa-api#673\n * E8 — defence in depth).\n *\n * Use this on the **client side** when constructing a new follow record\n * (the follower DID is the authenticated user). The plain\n * {@link GraphFollowRecordSchema} stays without the refine so firehose\n * consumers can validate records without context.\n */\nexport function makeGraphFollowRecordSchema(followerDid: string) {\n return GraphFollowRecordSchema.refine((record) => record.subject !== followerDid, {\n message: 'Self-follow is not allowed',\n path: ['subject'],\n });\n}\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema } from './shared.js';\n\n/**\n * Profile row shared across `/api/following`, `/api/profile/:handleOrDid/mutuals`,\n * and `/api/me/bluesky-suggestions`. Matches the existing `FollowProfile` TS\n * interface byte-for-byte but adds runtime validation for the SDK's pagination\n * helpers and the upcoming `sifa-app` consumer (where we can't trust the wire).\n *\n * Per `sifa-api#674` PR body: mutuals + bluesky-suggestions reuse this shape\n * exactly, so a single Zod schema covers all three endpoints.\n */\nexport const FollowProfileSchema = z.object({\n did: didSchema,\n handle: z.string(),\n displayName: z.string().optional(),\n headline: z.string().optional(),\n avatarUrl: z.string().optional(),\n source: z.string(),\n claimed: z.boolean(),\n followedAt: datetimeSchema,\n blueskyVerified: z.boolean().optional(),\n blueskyVerifiedAt: datetimeSchema.nullable().optional(),\n});\n\nexport type FollowProfileItem = z.infer<typeof FollowProfileSchema>;\n\n/**\n * Cursor-paginated page of {@link FollowProfileSchema} rows. Used by mutuals\n * + bluesky-suggestions. The legacy `/api/following` endpoint uses a different\n * wrapper key (`follows` instead of `items`) and is intentionally NOT covered\n * by this schema.\n */\nexport const FollowProfilePageSchema = z.object({\n items: z.array(FollowProfileSchema),\n cursor: z.string().nullable(),\n});\n\nexport type FollowProfilePage = z.infer<typeof FollowProfilePageSchema>;\n\n/**\n * Per-flag allowlist row returned by `GET /api/admin/feature-allowlists/:flag`.\n * Mirrors the `feature_allowlists` table; `note` is optional free-form text.\n */\nexport const FeatureAllowlistEntrySchema = z.object({\n did: didSchema,\n addedAt: datetimeSchema,\n note: z.string().nullable().optional(),\n});\n\nexport type FeatureAllowlistEntry = z.infer<typeof FeatureAllowlistEntrySchema>;\n\n/**\n * Known feature flags accepted by the admin allowlist endpoints. Mirrors the\n * server-side `FEATURE_FLAGS` const in `sifa-api`. Kept as a `const` tuple so\n * consumers can `as const`-narrow when building UIs.\n */\nexport const FEATURE_FLAGS = ['FEED_V5_ENABLED'] as const;\nexport type FeatureFlag = (typeof FEATURE_FLAGS)[number];\n","import { z } from 'zod';\n\nimport { atUriSchema, cidSchema, datetimeSchema, didSchema } from './shared.js';\n\n/**\n * Feed item from `GET /api/following/feed`. Discriminated on `source`:\n *\n * - `sifa`: a Sifa-native event (e.g. profile update, endorsement).\n * - `atmosphere`: a curated creation event from another ATproto app\n * (Barazo post, etc.). Payload is the hydrated `app.bsky.embed.*#view`\n * shape, NOT the raw record (per memory `sifa-hydrated-view-embed-types`).\n *\n * Both variants share `actor`, `indexedAt`, and `id` (the materialized\n * `feed_events.id` row identifier, used in the cursor).\n */\nexport const FeedActorSchema = z.object({\n did: didSchema,\n handle: z.string(),\n displayName: z.string().optional(),\n avatarUrl: z.string().optional(),\n});\n\nexport type FeedActor = z.infer<typeof FeedActorSchema>;\n\nconst FeedItemBaseSchema = z.object({\n id: z.string(),\n actor: FeedActorSchema,\n indexedAt: datetimeSchema,\n eventType: z.string(),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const SifaFeedItemSchema = FeedItemBaseSchema.extend({\n source: z.literal('sifa'),\n appId: z.literal('sifa').optional(),\n payload: z.record(z.string(), z.unknown()),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type SifaFeedItem = z.infer<typeof SifaFeedItemSchema>;\n\n/**\n * ATmosphere feed item. `payload` is intentionally permissive: it carries\n * a hydrated `app.bsky.embed.*#view` shape that varies by source app. The\n * AppView resolves the hydration; clients render via the existing\n * embed-view union (mirrors `sifa-web/src/components/stream/`).\n *\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const AtmosphereFeedItemSchema = FeedItemBaseSchema.extend({\n source: z.literal('atmosphere'),\n appId: z.string(),\n uri: atUriSchema.optional(),\n cid: cidSchema.optional(),\n payload: z.record(z.string(), z.unknown()),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type AtmosphereFeedItem = z.infer<typeof AtmosphereFeedItemSchema>;\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const FollowFeedItemSchema = z.discriminatedUnion('source', [\n SifaFeedItemSchema,\n AtmosphereFeedItemSchema,\n]);\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type FollowFeedItem = z.infer<typeof FollowFeedItemSchema>;\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const FollowFeedPageSchema = z.object({\n items: z.array(FollowFeedItemSchema),\n cursor: z.string().nullable(),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type FollowFeedPage = z.infer<typeof FollowFeedPageSchema>;\n\n/**\n * Composite feed cursor `(indexedAt DESC, source, id)`. Encoded as a\n * URL-safe base64 string so it survives `URLSearchParams` round-trips\n * without further encoding. Decoupling encode/decode from the API call\n * lets consumers persist cursors (e.g. for \"jump-back-here\" UX) and\n * lets us unit-test the format.\n */\nexport interface FeedCursor {\n indexedAt: string;\n source: 'sifa' | 'atmosphere';\n id: string;\n}\n\nconst FeedCursorSchema = z.object({\n indexedAt: datetimeSchema,\n source: z.union([z.literal('sifa'), z.literal('atmosphere')]),\n id: z.string().min(1),\n});\n\ninterface BufferLike {\n from: (input: string, encoding: 'utf-8' | 'base64') => { toString: (encoding: string) => string };\n}\n\ninterface Base64Global {\n btoa?: (input: string) => string;\n atob?: (input: string) => string;\n Buffer?: BufferLike;\n}\n\nfunction toBase64Url(input: string): string {\n const g = globalThis as unknown as Base64Global;\n const b64: string =\n typeof g.btoa === 'function'\n ? g.btoa(unescape(encodeURIComponent(input)))\n : (g.Buffer as BufferLike).from(input, 'utf-8').toString('base64');\n // Strip up to 2 trailing '=' (base64 padding). CodeQL flags `/=+$/` as a\n // polynomial regex on tainted input; we don't accept tainted input here,\n // but the deterministic loop sidesteps the alert.\n let end = b64.length;\n while (end > 0 && b64.charCodeAt(end - 1) === 61) end--;\n return b64.slice(0, end).replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n\nfunction fromBase64Url(input: string): string {\n const padded = input.replace(/-/g, '+').replace(/_/g, '/') + '==='.slice((input.length + 3) % 4);\n const g = globalThis as unknown as Base64Global;\n if (typeof g.atob === 'function') {\n return decodeURIComponent(escape(g.atob(padded)));\n }\n return (g.Buffer as BufferLike).from(padded, 'base64').toString('utf-8');\n}\n\nexport function encodeFeedCursor(cursor: FeedCursor): string {\n return toBase64Url(JSON.stringify(cursor));\n}\n\nexport function decodeFeedCursor(encoded: string): FeedCursor {\n const json = fromBase64Url(encoded);\n const parsed: unknown = JSON.parse(json);\n return FeedCursorSchema.parse(parsed);\n}\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n uriSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.certification` records. */\nexport const ProfileCertificationRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n authority: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n authorityDid: didSchema.optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n credentialId: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n credentialUrl: uriSchema.optional(),\n issuedAt: partialDateSchema.optional(),\n expiresAt: partialDateSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileCertificationRecord = z.infer<typeof ProfileCertificationRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n atUriSchema,\n datetimeSchema,\n maxGraphemes,\n partialDateSchema,\n strongRefSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.course` records. */\nexport const ProfileCourseRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n number: z.string().refine(maxGraphemes(50)).max(500).optional(),\n institution: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n education: strongRefSchema.optional(),\n // AT-URI of the associated id.sifa.profile.certification record. Plain\n // at-uri (not a strongRef) so the link tracks the live certification.\n credential: atUriSchema.optional(),\n completedAt: partialDateSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileCourseRecord = z.infer<typeof ProfileCourseRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.education` records. */\nexport const ProfileEducationRecordSchema = z.object({\n institution: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n institutionDid: didSchema.optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n degree: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n fieldOfStudy: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n grade: z.string().refine(maxGraphemes(50)).max(500).optional(),\n activities: z.string().refine(maxGraphemes(1000)).max(10000).optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n location: z.unknown().optional(),\n startedAt: partialDateSchema.optional(),\n endedAt: partialDateSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileEducationRecord = z.infer<typeof ProfileEducationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes, uriSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.externalAccount` records.\n *\n * `platform` is advisory (`knownValues` in the lexicon) -- known values live\n * under `id.sifa.defs#platform*` but unknown values are accepted.\n */\nexport const ProfileExternalAccountRecordSchema = z.object({\n platform: z.string(),\n url: uriSchema,\n label: z.string().refine(maxGraphemes(64)).max(640).optional(),\n feedUrl: uriSchema.optional(),\n isPrimary: z.boolean().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileExternalAccountRecord = z.infer<typeof ProfileExternalAccountRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, partialDateSchema } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.honor` records. */\nexport const ProfileHonorRecordSchema = z.object({\n title: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n issuer: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n issuerDid: didSchema.optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n awardedAt: partialDateSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileHonorRecord = z.infer<typeof ProfileHonorRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n uriSchema,\n} from './shared.js';\n\n/** Collection NSID for involvement records. Pass to the generic record helpers. */\nexport const PROFILE_INVOLVEMENT_NSID = 'id.sifa.profile.involvement';\n\n/**\n * A public artifact proving a piece of work. Mirrors `id.sifa.defs#artifactLink`.\n * `kind` is an open enum (bare-string knownValues), so any string is accepted.\n * `.passthrough()` keeps unknown fields a newer client or co-writer may emit.\n */\nexport const ArtifactLinkSchema = z\n .object({\n url: uriSchema,\n kind: z.string().optional(),\n label: z.string().refine(maxGraphemes(200)).max(2000).optional(),\n })\n .passthrough();\n\nexport type ArtifactLink = z.infer<typeof ArtifactLinkSchema>;\n\n/**\n * Zod schema for `id.sifa.profile.involvement` records.\n *\n * `.passthrough()` (not `.strict()`): external apps (Verak, weareonhire)\n * co-write `id.sifa.*`, so an older SDK must not reject a record carrying a\n * field it doesn't know yet. `kind` is an open enum matching the lexicon's\n * knownValues but accepting any string for the same forward-compat reason.\n */\nexport const ProfileInvolvementRecordSchema = z\n .object({\n kind: z.string(),\n upstream: z.string().refine(maxGraphemes(256)).max(2560).optional(),\n upstreamDid: didSchema.optional(),\n upstreamUrl: uriSchema.optional(),\n role: z.string().refine(maxGraphemes(256)).max(2560).optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n startedAt: partialDateSchema.optional(),\n endedAt: partialDateSchema.optional(),\n links: z.array(ArtifactLinkSchema).max(50).optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the resolver\n // typeahead, constrained to http(s) so a script scheme is never a valid ref.\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n // community.lexicon.location.address — validated at the app layer.\n location: z.unknown().optional(),\n // id.sifa.defs#skillRef references (at-uri to a skill record in the same repo).\n skills: z\n .array(z.object({ uri: z.string() }))\n .max(50)\n .optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n })\n .passthrough();\n\nexport type ProfileInvolvementRecord = z.infer<typeof ProfileInvolvementRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.language` records.\n *\n * `proficiency` is advisory (`knownValues` in the lexicon) -- known values\n * are the five-level LinkedIn-compatible scale under `id.sifa.defs#*`.\n */\nexport const ProfileLanguageRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(64)).max(640),\n proficiency: z.string().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileLanguageRecord = z.infer<typeof ProfileLanguageRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n strongRefSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.position` records. */\nexport const ProfilePositionRecordSchema = z.object({\n company: z.string().min(1).refine(maxGraphemes(100)).max(1000).optional(),\n companyDid: didSchema.optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n title: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n employmentType: z.string().optional(),\n workplaceType: z.string().optional(),\n location: z.unknown().optional(),\n startedAt: partialDateSchema,\n endedAt: partialDateSchema.optional(),\n skills: z.array(strongRefSchema).max(50).optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePositionRecord = z.infer<typeof ProfilePositionRecordSchema>;\n","import { z } from 'zod';\n\nimport { BlobRefSchema } from './blob-ref.js';\nimport { datetimeSchema, externalRecordRefSchema, maxGraphemes, uriSchema } from './shared.js';\n\n/**\n * Duration of a presentation, in minutes. Mirrors\n * `id.sifa.profile.presentation#duration`: a fixed length (minMinutes only) or\n * a range (minMinutes to maxMinutes).\n */\nexport const PresentationDurationSchema = z\n .object({\n minMinutes: z.number().int().min(1),\n maxMinutes: z.number().int().min(1).optional(),\n })\n .refine((d) => d.maxMinutes === undefined || d.maxMinutes >= d.minMinutes, {\n message: 'maxMinutes must be greater than or equal to minMinutes',\n path: ['maxMinutes'],\n });\n\nexport type PresentationDuration = z.infer<typeof PresentationDurationSchema>;\n\n/**\n * A related link for a presentation or one of its deliveries. Mirrors\n * `id.sifa.defs#presentationLink`. `type` is an open enum (knownValues), so any\n * string is accepted.\n */\nexport const PresentationLinkSchema = z.object({\n uri: uriSchema,\n label: z.string().refine(maxGraphemes(64)).max(640).optional(),\n type: z.string().optional(),\n});\n\nexport type PresentationLink = z.infer<typeof PresentationLinkSchema>;\n\n/** Zod schema for `id.sifa.profile.presentation` records (the reusable content). */\nexport const ProfilePresentationRecordSchema = z.object({\n title: z.string().min(1).refine(maxGraphemes(300)).max(3000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n duration: PresentationDurationSchema.optional(),\n intendedAudiences: z\n .array(z.string().refine(maxGraphemes(100)).max(1000))\n .max(20)\n .optional(),\n links: z.array(PresentationLinkSchema).max(20).optional(),\n // Optional reference to a long-form write-up (pub.leaflet.document or\n // site.standard.document). Plain at-uri + optional cid so it tracks edits.\n writeupRef: externalRecordRefSchema.optional(),\n // Optional uploaded cover image for the talk page.\n coverImage: BlobRefSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePresentationRecord = z.infer<typeof ProfilePresentationRecordSchema>;\n","import { z } from 'zod';\n\nimport { PresentationLinkSchema } from './profile-presentation.js';\nimport { datetimeSchema, externalRecordRefSchema, maxGraphemes } from './shared.js';\n\n/**\n * Structured address for a delivery occasion. Mirrors\n * `community.lexicon.location.address` (all fields optional).\n */\nconst communityAddressSchema = z.object({\n country: z.string().optional(),\n postalCode: z.string().optional(),\n region: z.string().optional(),\n locality: z.string().optional(),\n street: z.string().optional(),\n name: z.string().optional(),\n});\n\n/**\n * Zod schema for `id.sifa.profile.presentationDelivery` records (one occasion\n * on which a presentation was delivered). Works standalone or linked to a\n * presentation and/or a calendar event. `role`, `mode`, and `status` are open\n * enums (knownValues); `mode`/`status` store the full\n * `community.lexicon.calendar.event` token.\n */\nexport const ProfilePresentationDeliveryRecordSchema = z.object({\n // Optional reference to the id.sifa.profile.presentation delivered here.\n presentationRef: externalRecordRefSchema.optional(),\n // Fallback title used when there is no presentationRef.\n title: z.string().refine(maxGraphemes(300)).max(3000).optional(),\n role: z.string().refine(maxGraphemes(64)).max(640).optional(),\n eventName: z.string().refine(maxGraphemes(300)).max(3000).optional(),\n // Calendar date as YYYY-MM-DD (day only).\n date: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'date must be YYYY-MM-DD')\n .optional(),\n location: z.string().refine(maxGraphemes(256)).max(2560).optional(),\n // Structured community.lexicon.location.address for the occasion. The\n // free-text `location` string above stays as a legacy fallback.\n address: communityAddressSchema.optional(),\n mode: z.string().optional(),\n status: z.string().optional(),\n links: z.array(PresentationLinkSchema).max(20).optional(),\n // Optional reference to a community.lexicon.calendar.event for this occasion.\n eventRef: externalRecordRefSchema.optional(),\n // DIDs of co-speakers who presented alongside the author at this occasion.\n coSpeakers: z\n .array(z.string().regex(/^did:[a-z]+:[^\\s]+$/, 'must be a DID'))\n .max(20)\n .optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePresentationDeliveryRecord = z.infer<\n typeof ProfilePresentationDeliveryRecordSchema\n>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n strongRefSchema,\n uriSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.project` records. */\nexport const ProfileProjectRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n url: uriSchema.optional(),\n position: strongRefSchema.optional(),\n startedAt: partialDateSchema.optional(),\n endedAt: partialDateSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileProjectRecord = z.infer<typeof ProfileProjectRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, partialDateSchema, uriSchema } from './shared.js';\n\n/** Author shape from `id.sifa.profile.publication#author`. */\nexport const PublicationAuthorSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n did: didSchema.optional(),\n});\n\nexport type PublicationAuthor = z.infer<typeof PublicationAuthorSchema>;\n\n/** Zod schema for `id.sifa.profile.publication` records. */\nexport const ProfilePublicationRecordSchema = z.object({\n title: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n subtitle: z.string().refine(maxGraphemes(200)).max(2000).optional(),\n publisher: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n url: uriSchema.optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n authors: z.array(PublicationAuthorSchema).max(50).optional(),\n publishedAt: partialDateSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePublicationRecord = z.infer<typeof ProfilePublicationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, languageTagSchema, maxGraphemes, selfLabelsSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.self` records. Singleton (record key `self`).\n *\n * `knownValues` on `openTo` and `preferredWorkplace` are advisory per the\n * lexicon spec -- unknown values are allowed, but documented options live\n * under the `id.sifa.defs#*` namespace.\n */\nexport const ProfileSelfRecordSchema = z.object({\n headline: z.string().refine(maxGraphemes(120)).max(1200).optional(),\n about: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n industry: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n givenName: z.string().refine(maxGraphemes(64)).max(640).optional(),\n familyName: z.string().refine(maxGraphemes(64)).max(640).optional(),\n location: z.unknown().optional(),\n openTo: z.array(z.string()).max(10).optional(),\n preferredWorkplace: z.array(z.string()).max(3).optional(),\n langs: z.array(languageTagSchema).max(3).optional(),\n labels: selfLabelsSchema.optional(),\n discoverable: z.boolean().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileSelfRecord = z.infer<typeof ProfileSelfRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.skill` records.\n *\n * `category` is advisory (`knownValues` in the lexicon) -- known values live\n * under `id.sifa.defs#*` but unknown values are accepted.\n */\nexport const ProfileSkillRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(64)).max(640),\n category: z.string().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileSkillRecord = z.infer<typeof ProfileSkillRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, partialDateSchema } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.volunteering` records. */\nexport const ProfileVolunteeringRecordSchema = z.object({\n organization: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n organizationDid: didSchema.optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n role: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n cause: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n startedAt: partialDateSchema.optional(),\n endedAt: partialDateSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileVolunteeringRecord = z.infer<typeof ProfileVolunteeringRecordSchema>;\n","/**\n * Sifa SDK -- public client library for the Sifa AppView on AT Protocol.\n *\n * Pre-1.0: the public API is unstable and may change in any minor release.\n *\n * @see https://github.com/singi-labs/sifa-sdk\n */\n\ndeclare const __SIFA_SDK_VERSION__: string;\n\nexport const SIFA_SDK_VERSION: string = __SIFA_SDK_VERSION__;\n\nexport type {\n ActiveApp,\n Endorsement,\n EndorsementData,\n ExternalAccount,\n ExternalAccountKeytraceClaim,\n FeedItem,\n LanguageProficiency,\n LocationValue,\n OrgAddressView,\n OrgFloorVerdict,\n OrgLinkView,\n OrgProfileView,\n RecognizedEntity,\n PdsProviderInfo,\n PresentationLinkView,\n Profile,\n ProfileCertification,\n ProfileCourse,\n ProfileEducation,\n ProfileHonor,\n ProfileIndustry,\n ProfileInvolvement,\n ProfileInvolvementLink,\n ProfileLanguage,\n ProfileLocation,\n ProfileOverrideSource,\n ProfilePosition,\n ProfilePresentation,\n CoSpeaker,\n ProfilePresentationDelivery,\n ProfileProject,\n ProfilePublication,\n ProfileSkill,\n ProfileVolunteering,\n PublicationContributor,\n SkillRef,\n SkillSuggestion,\n TrustStat,\n VerifiedAccount,\n} from './types/index.js';\n\n// Aggregated public profile view (`id.sifa.getProfileView` XRPC query).\nexport type {\n ProfileView,\n IndustryDomain,\n ProfileLocationView,\n PositionView,\n EducationView,\n SkillView,\n CertificationView,\n ProjectView,\n VolunteeringView,\n InvolvementView,\n InvolvementLinkView,\n PublicationView,\n ContributorView,\n CourseView,\n DurationView,\n CoSpeakerView,\n PresentationDeliveryView,\n PresentationView,\n HonorView,\n LanguageView,\n ExternalAccountView,\n ActiveAppView,\n AtfundLinkView,\n} from './types/profile-view.js';\n\nexport {\n ACTIVITY_TIERS,\n APP_CATEGORIES,\n APP_CATEGORY_IDS,\n APP_CATEGORY_MAP,\n CATEGORY_LABELS,\n CATEGORY_ORDER,\n CONTINENTS,\n COMPANY_OPTIONAL_EMPLOYMENT_TYPES,\n COUNTRIES,\n CALENDAR_EVENT_MODE_LABELS,\n CALENDAR_EVENT_STATUS_LABELS,\n PRESENTATION_LINK_TYPE_LABELS,\n PRESENTATION_LINK_TYPE_OPTIONS,\n PRESENTATION_ROLE_LABELS,\n PRESENTATION_ROLE_OPTIONS,\n EMPLOYMENT_TYPE_GROUPS,\n EMPLOYMENT_TYPE_LABELS,\n INDUSTRY_OPTIONS,\n OPEN_TO_OPTIONS,\n OPEN_TO_TOKENS,\n OPEN_TO_TOKEN_TO_VALUE,\n OPEN_TO_VALUE_TO_TOKEN,\n categoryForApp,\n findIndustry,\n getActivityTaxonomyVersion,\n getActivityTier,\n getCalendarEventModeLabel,\n getCalendarEventStatusLabel,\n getPresentationLinkTypeLabel,\n getPresentationRoleLabel,\n getAppCategoryIcon,\n getEmploymentTypeLabel,\n isCompanyRequired,\n getIndustryLabelKey,\n getLexiconEntry,\n getOpenToLabelKey,\n normalizeOpenTo,\n openToTokenToValue,\n openToValueToToken,\n getTierMeta,\n getWorkplaceTypeLabel,\n normalizeWorkplaceTypes,\n isAppCategory,\n isKnownAppId,\n PLATFORM_LABELS,\n PLATFORM_OPTIONS,\n SKILL_CATEGORIES,\n WORKPLACE_TYPE_LABELS,\n WORKPLACE_TYPE_OPTIONS,\n dedupeSkills,\n getContinent,\n getFaviconUrl,\n getPlatformLabel,\n groupSkillsByCategory,\n isKnownPlatform,\n normalizePlatformId,\n type ActivityTaxonomy,\n type ActivityTier,\n type AppCategoryId,\n type ContinentCode,\n type EmploymentTypeGroup,\n type EmploymentTypeOption,\n type IndustryOption,\n type KnownAppId,\n type LexiconEntry,\n type MergedProfileSkill,\n type PresentationLinkTypeOption,\n type PresentationRoleOption,\n INVOLVEMENT_KIND_OPTIONS,\n INVOLVEMENT_KIND_LABELS,\n INVOLVEMENT_KIND_HEADINGS,\n getInvolvementKindHeading,\n getInvolvementKindLabel,\n ARTIFACT_LINK_KIND_OPTIONS,\n ARTIFACT_LINK_KIND_LABELS,\n getArtifactLinkKindLabel,\n VERIFICATION_PROVIDERS,\n getVerificationProvider,\n isKnownVerificationProvider,\n resolveVerifierProvider,\n primaryVerification,\n type AccountVerification,\n type VerificationProvider,\n type VerificationProviderId,\n type VerificationSource,\n type InvolvementKindOption,\n type ArtifactLinkKindOption,\n type OpenToGroup,\n type OpenToOption,\n type PlatformId,\n type SkillCategory,\n type TierMeta,\n type WorkplaceTypeOption,\n} from './taxonomy/index.js';\n\nexport {\n certDateExtractor,\n contrastRatio,\n countryCodeToFlag,\n dateRangeExtractor,\n detectPdsProvider,\n formatCompanyName,\n formatDateRange,\n formatDistanceToNow,\n formatLocation,\n formatPresentationDuration,\n formatRelativeTime,\n formatTimelineDate,\n getDisplayLabel,\n getHandleStem,\n getPdsDisplayName,\n isValidRgbColor,\n lexiconDateExtractor,\n limitCombiningMarks,\n meetsContrastAA,\n normalizeCompanyKey,\n normalizeLegalForm,\n parseLocationString,\n parseTalkRkey,\n pdsProviderFromApi,\n relativeLuminance,\n resolveEmbed,\n youtubeVideoId,\n youtubeThumbnailUrl,\n rgbToString,\n sanitizeDisplayText,\n sanitizeHandleInput,\n singleDateExtractor,\n slugifyTitle,\n buildTalkSlug,\n sortByDateDesc,\n summarizePresentationDeliveries,\n truncateGraphemes,\n type EmbedResult,\n type PdsProvider,\n type PresentationDeliverySummary,\n type RgbColor,\n} from './format/index.js';\n\nexport {\n parsePresentationDuration,\n durationFromMinutes,\n parseIntendedAudiences,\n stripHtmlToText,\n normalizePresentationRole,\n normalizePresentationMode,\n presentationCsvRowToRecord,\n presentationDeliveryCsvRowToRecord,\n type CsvRow,\n type ParsedPresentation,\n type ParsedDelivery,\n} from './import/index.js';\n\nexport {\n ACTIVITY_VISIBILITY_RULES,\n ADULT_CONTENT_LABELS,\n APP_URL_PATTERNS,\n COLLECTION_TO_APP,\n getAppIdForCollection,\n hasAdultContent,\n isVisibleActivityItem,\n resolveCardHealth,\n resolveCardUrl,\n type ActivityItemForUrl,\n type ActivityLabel,\n type AdultContentLabel,\n type AppUrlPatterns,\n type CardHealth,\n type CardHealthStrategy,\n} from './cards/index.js';\n\nexport {\n PUBLISHERS,\n STANDARD_PUBLISHER_ID,\n getPublisherById,\n getPublisherByHost,\n getPublisherFromSiteUrl,\n type Publisher,\n} from './publishers/index.js';\n\n// Shared activity-stream view-model: the normalized, framework-free feed both\n// sifa-web (React cards) and page.sifa.id (string-HTML renderer) consume.\nexport {\n ACTIVITY_VERBS,\n STREAM_VERBS,\n getActivityVerbsVersion,\n streamVerbSchema,\n verbForCollection,\n streamAddressSchema,\n streamAuthorSchema,\n streamCardBodySchema,\n streamCardSubjectSchema,\n streamCardVMSchema,\n streamExternalLinkSchema,\n streamGeoSchema,\n streamMediaSchema,\n streamRichSegmentSchema,\n streamSourceSchema,\n streamThemeSchema,\n toStreamCardVM,\n toStreamCardVMs,\n type ActivityItem,\n type ActivityVerbMap,\n type StreamAddress,\n type StreamAuthor,\n type StreamCardBody,\n type StreamCardSubject,\n type StreamCardVM,\n type StreamExternalLink,\n type StreamGeo,\n type StreamMedia,\n type StreamMediaBase,\n type StreamMediaBlob,\n type StreamMediaResolved,\n type StreamRichSegment,\n type StreamSource,\n type StreamTheme,\n type StreamVerb,\n type ToStreamCardVMOptions,\n} from './stream/index.js';\n\nexport {\n COMPLETENESS_MAX_SCORE,\n completenessPercent,\n completenessScore,\n DIMENSIONS_MAX_SCORE,\n MIN_SKILLS,\n countFilledDimensions,\n dimensionsFromInputs,\n getFilledDimensionsMap,\n pickPrimaryPosition,\n profileToDimensionInputs,\n isPseudoEmployer,\n looksLikeDomain,\n entityDisambiguationLabel,\n searchResultDisambiguation,\n entityResultKey,\n classifyEntityRef,\n isLinked,\n ENTITY_REF_ANCHORS,\n qualifiesAsOrg,\n isRegistrableDomainHandle,\n isCompanyPageIndexable,\n COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS,\n type DimensionKey,\n type DimensionMap,\n type PrimaryPositionCandidate,\n type ProfileCompletion,\n type ProfileDimensionInputs,\n type DisambiguationFields,\n type EntityRefAnchor,\n type CompanyFirmographics,\n} from './logic/index.js';\n\n// Profile section model: which sections render, in what order, their nav\n// grouping, per-section sorts, and involvement grouping. Shared by the HTML\n// profile page, the Markdown/DOCX/print exports, and the personal-site renderer.\nexport {\n ALL_SECTIONS,\n INVOLVEMENT_HEADING_ORDER,\n SECTION_GROUPS,\n SECTION_LABELS,\n filterHidden,\n getVisibleSectionIds,\n groupInvolvementByHeading,\n hoistPrimary,\n isSectionPopulated,\n sortByActiveDateRange,\n sortCertifications,\n sortEducation,\n sortHonors,\n sortLanguages,\n sortLanguagesByProficiency,\n sortPositions,\n sortProjects,\n sortPublications,\n visibleItems,\n type InvolvementGroup,\n type SectionGroupId,\n type SectionId,\n} from './profile/index.js';\n\nexport {\n AtmosphereFeedItemSchema,\n BlobRefSchema,\n EndorsementConfirmationRecordSchema,\n EndorsementRecordSchema,\n OrgProfileRecordSchema,\n OrgEmploymentAttestationRecordSchema,\n EntitySearchResultSchema,\n EntitySearchResponseSchema,\n EntitySelectRequestSchema,\n EntitySelectResponseSchema,\n EntityImportSearchResponseSchema,\n EntityResolveDomainRequestSchema,\n EntityResolveDomainResponseSchema,\n EntityMintDomainResponseSchema,\n FEATURE_FLAGS,\n FeatureAllowlistEntrySchema,\n FeedActorSchema,\n FollowFeedItemSchema,\n FollowFeedPageSchema,\n FollowProfilePageSchema,\n FollowProfileSchema,\n GraphFollowRecordSchema,\n PresentationDurationSchema,\n PresentationLinkSchema,\n ProfileCertificationRecordSchema,\n ProfileCourseRecordSchema,\n ProfileEducationRecordSchema,\n ProfileExternalAccountRecordSchema,\n ProfileHonorRecordSchema,\n ProfileInvolvementRecordSchema,\n ArtifactLinkSchema,\n PROFILE_INVOLVEMENT_NSID,\n ProfileLanguageRecordSchema,\n ProfilePositionRecordSchema,\n ProfilePresentationDeliveryRecordSchema,\n ProfilePresentationRecordSchema,\n ProfileProjectRecordSchema,\n ProfilePublicationRecordSchema,\n ProfileSelfRecordSchema,\n ProfileSkillRecordSchema,\n ProfileVolunteeringRecordSchema,\n PublicationAuthorSchema,\n SifaFeedItemSchema,\n atUriSchema,\n cidSchema,\n datetimeSchema,\n decodeFeedCursor,\n didSchema,\n encodeFeedCursor,\n externalRecordRefSchema,\n languageTagSchema,\n makeGraphFollowRecordSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n strongRefSchema,\n uriSchema,\n type AtmosphereFeedItem,\n type BlobRef,\n type EndorsementConfirmationRecord,\n type EndorsementRecord,\n type OrgProfileRecord,\n type OrgEmploymentAttestationRecord,\n type EntitySearchResult,\n type EntitySearchResponse,\n type EntitySelectRequest,\n type EntitySelectResponse,\n type EntityImportSearchResponse,\n type EntityResolveDomainRequest,\n type EntityResolveDomainResponse,\n type EntityMintDomainResponse,\n type FeatureAllowlistEntry,\n type FeatureFlag,\n type FeedActor,\n type FeedCursor,\n type FollowFeedItem,\n type FollowFeedPage,\n type FollowProfileItem,\n type FollowProfilePage,\n type GraphFollowRecord,\n type SifaFeedItem,\n type ProfileCertificationRecord,\n type ProfileCourseRecord,\n type ProfileEducationRecord,\n type ProfileExternalAccountRecord,\n type ProfileHonorRecord,\n type ProfileInvolvementRecord,\n type ArtifactLink,\n type ProfileLanguageRecord,\n type PresentationDuration,\n type PresentationLink,\n type ProfilePositionRecord,\n type ProfilePresentationDeliveryRecord,\n type ProfilePresentationRecord,\n type ProfileProjectRecord,\n type ProfilePublicationRecord,\n type ProfileSelfRecord,\n type ProfileSkillRecord,\n type ProfileVolunteeringRecord,\n type PublicationAuthor,\n} from './schemas/index.js';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/taxonomy/continents.ts","../src/taxonomy/countries.ts","../src/taxonomy/employment-type.ts","../src/taxonomy/industry-taxonomy.ts","../src/taxonomy/open-to.ts","../src/taxonomy/workplace-type.ts","../src/taxonomy/platforms.ts","../src/taxonomy/skill-categories.ts","../src/taxonomy/skill-grouping.ts","../src/taxonomy/app-categories.ts","../src/taxonomy/app-category-map.ts","../src/taxonomy/activity-tiers.json","../src/taxonomy/activity-tiers.ts","../src/taxonomy/presentation-role.ts","../src/taxonomy/presentation-link-type.ts","../src/taxonomy/calendar-event.ts","../src/taxonomy/involvement-kind.ts","../src/taxonomy/artifact-link-kind.ts","../src/taxonomy/verification-providers.ts","../src/format/company-name.ts","../src/format/normalize-legal-form.ts","../src/format/normalize-company-key.ts","../src/format/format-time.ts","../src/format/format-duration.ts","../src/format/timeline.ts","../src/format/summarize-deliveries.ts","../src/format/sort-by-date.ts","../src/format/handle-utils.ts","../src/format/location-utils.ts","../src/format/pds-utils.ts","../src/format/embed.ts","../src/format/talk-slug.ts","../src/format/text-sanitize.ts","../src/format/text-truncate.ts","../src/format/time-utils.ts","../src/format/wcag-contrast.ts","../src/import/presentation-csv.ts","../src/cards/app-url-patterns.ts","../src/cards/resolve-card-url.ts","../src/cards/visibility.ts","../src/cards/adult-content.ts","../src/publishers/registry.ts","../src/stream/verbs.json","../src/stream/verbs.ts","../src/stream/stream-card-vm-schema.ts","../src/schemas/shared.ts","../src/publishing/registry.ts","../src/stream/to-stream-card-vm.ts","../src/logic/profile-completeness.ts","../src/logic/profile-dimensions.ts","../src/logic/primary-position.ts","../src/logic/profile-summary.ts","../src/logic/pseudo-employer.ts","../src/logic/domain-detect.ts","../src/logic/entity-disambiguation.ts","../src/logic/entity-ref-anchor.ts","../src/logic/org-floor.ts","../src/logic/company-page-indexable.ts","../src/profile/section-model.ts","../src/profile/range-sort.ts","../src/profile/language-sort.ts","../src/profile/section-sorts.ts","../src/profile/involvement-grouping.ts","../src/schemas/blob-ref.ts","../src/schemas/endorsement-confirmation.ts","../src/schemas/entity.ts","../src/schemas/endorsement.ts","../src/schemas/org-profile.ts","../src/schemas/org-employment-attestation.ts","../src/schemas/graph-follow.ts","../src/schemas/follow-profile.ts","../src/schemas/feed.ts","../src/schemas/profile-certification.ts","../src/schemas/profile-course.ts","../src/schemas/profile-education.ts","../src/schemas/profile-external-account.ts","../src/schemas/profile-honor.ts","../src/schemas/profile-involvement.ts","../src/schemas/profile-language.ts","../src/schemas/profile-position.ts","../src/schemas/profile-presentation.ts","../src/schemas/profile-presentation-delivery.ts","../src/schemas/profile-project.ts","../src/schemas/profile-publication.ts","../src/schemas/profile-self.ts","../src/schemas/profile-skill.ts","../src/schemas/profile-volunteering.ts","../src/index.ts"],"names":["z","parsed","COMBINING_MARKS","link","isNonEmptyString"],"mappings":";;;;;AAEO,IAAM,UAAA,GAAmE;AAAA,EAC9E,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,YAAA,EAAa;AAAA,EACjC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,EAC3B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAS;AAAA,EAC7B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA,EAAgB;AAAA,EACpC,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC9B,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,eAAA;AACtB;AAEA,IAAM,oBAAA,GAAsD;AAAA,EAC1D,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EA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","file":"index.cjs","sourcesContent":["export type ContinentCode = 'AF' | 'AN' | 'AS' | 'EU' | 'NA' | 'OC' | 'SA';\n\nexport const CONTINENTS: ReadonlyArray<{ code: ContinentCode; name: string }> = [\n { code: 'AF', name: 'Africa' },\n { code: 'AN', name: 'Antarctica' },\n { code: 'AS', name: 'Asia' },\n { code: 'EU', name: 'Europe' },\n { code: 'NA', name: 'North America' },\n { code: 'OC', name: 'Oceania' },\n { code: 'SA', name: 'South America' },\n];\n\nconst COUNTRY_TO_CONTINENT: Record<string, ContinentCode> = {\n AD: 'EU',\n AE: 'AS',\n AF: 'AS',\n AG: 'NA',\n AL: 'EU',\n AM: 'AS',\n AO: 'AF',\n AR: 'SA',\n AT: 'EU',\n AU: 'OC',\n AZ: 'AS',\n BA: 'EU',\n BB: 'NA',\n BD: 'AS',\n BE: 'EU',\n BF: 'AF',\n BG: 'EU',\n BH: 'AS',\n BI: 'AF',\n BJ: 'AF',\n BN: 'AS',\n BO: 'SA',\n BR: 'SA',\n BS: 'NA',\n BT: 'AS',\n BW: 'AF',\n BY: 'EU',\n BZ: 'NA',\n CA: 'NA',\n CD: 'AF',\n CF: 'AF',\n CG: 'AF',\n CH: 'EU',\n CI: 'AF',\n CL: 'SA',\n CM: 'AF',\n CN: 'AS',\n CO: 'SA',\n CR: 'NA',\n CU: 'NA',\n CV: 'AF',\n CY: 'AS',\n CZ: 'EU',\n DE: 'EU',\n DJ: 'AF',\n DK: 'EU',\n DM: 'NA',\n DO: 'NA',\n DZ: 'AF',\n EC: 'SA',\n EE: 'EU',\n EG: 'AF',\n ER: 'AF',\n ES: 'EU',\n ET: 'AF',\n FI: 'EU',\n FJ: 'OC',\n FR: 'EU',\n GA: 'AF',\n GB: 'EU',\n GD: 'NA',\n GE: 'AS',\n GH: 'AF',\n GM: 'AF',\n GN: 'AF',\n GQ: 'AF',\n GR: 'EU',\n GT: 'NA',\n GW: 'AF',\n GY: 'SA',\n HK: 'AS',\n HN: 'NA',\n HR: 'EU',\n HT: 'NA',\n HU: 'EU',\n ID: 'AS',\n IE: 'EU',\n IL: 'AS',\n IN: 'AS',\n IQ: 'AS',\n IR: 'AS',\n IS: 'EU',\n IT: 'EU',\n JM: 'NA',\n JO: 'AS',\n JP: 'AS',\n KE: 'AF',\n KG: 'AS',\n KH: 'AS',\n KM: 'AF',\n KN: 'NA',\n KP: 'AS',\n KR: 'AS',\n KW: 'AS',\n KZ: 'AS',\n LA: 'AS',\n LB: 'AS',\n LC: 'NA',\n LI: 'EU',\n LK: 'AS',\n LR: 'AF',\n LS: 'AF',\n LT: 'EU',\n LU: 'EU',\n LV: 'EU',\n LY: 'AF',\n MA: 'AF',\n MC: 'EU',\n MD: 'EU',\n ME: 'EU',\n MG: 'AF',\n MK: 'EU',\n ML: 'AF',\n MM: 'AS',\n MN: 'AS',\n MO: 'AS',\n MR: 'AF',\n MT: 'EU',\n MU: 'AF',\n MV: 'AS',\n MW: 'AF',\n MX: 'NA',\n MY: 'AS',\n MZ: 'AF',\n NA: 'AF',\n NE: 'AF',\n NG: 'AF',\n NI: 'NA',\n NL: 'EU',\n NO: 'EU',\n NP: 'AS',\n NZ: 'OC',\n OM: 'AS',\n PA: 'NA',\n PE: 'SA',\n PG: 'OC',\n PH: 'AS',\n PK: 'AS',\n PL: 'EU',\n PR: 'NA',\n PS: 'AS',\n PT: 'EU',\n PY: 'SA',\n QA: 'AS',\n RO: 'EU',\n RS: 'EU',\n RU: 'EU',\n RW: 'AF',\n SA: 'AS',\n SB: 'OC',\n SC: 'AF',\n SD: 'AF',\n SE: 'EU',\n SG: 'AS',\n SI: 'EU',\n SK: 'EU',\n SL: 'AF',\n SM: 'EU',\n SN: 'AF',\n SO: 'AF',\n SR: 'SA',\n SS: 'AF',\n ST: 'AF',\n SV: 'NA',\n SY: 'AS',\n SZ: 'AF',\n TD: 'AF',\n TG: 'AF',\n TH: 'AS',\n TJ: 'AS',\n TL: 'AS',\n TM: 'AS',\n TN: 'AF',\n TO: 'OC',\n TR: 'AS',\n TT: 'NA',\n TW: 'AS',\n TZ: 'AF',\n UA: 'EU',\n UG: 'AF',\n US: 'NA',\n UY: 'SA',\n UZ: 'AS',\n VA: 'EU',\n VC: 'NA',\n VE: 'SA',\n VN: 'AS',\n VU: 'OC',\n WS: 'OC',\n XK: 'EU',\n YE: 'AS',\n ZA: 'AF',\n ZM: 'AF',\n ZW: 'AF',\n};\n\nexport function getContinent(countryCode: string): ContinentCode | null {\n if (!countryCode) return null;\n return COUNTRY_TO_CONTINENT[countryCode.toUpperCase()] ?? null;\n}\n","/** ISO 3166-1 country list for local fallback when GeoNames is unavailable. */\nexport const COUNTRIES: ReadonlyArray<{ code: string; name: string }> = [\n { code: 'AF', name: 'Afghanistan' },\n { code: 'AL', name: 'Albania' },\n { code: 'DZ', name: 'Algeria' },\n { code: 'AD', name: 'Andorra' },\n { code: 'AO', name: 'Angola' },\n { code: 'AG', name: 'Antigua and Barbuda' },\n { code: 'AR', name: 'Argentina' },\n { code: 'AM', name: 'Armenia' },\n { code: 'AU', name: 'Australia' },\n { code: 'AT', name: 'Austria' },\n { code: 'AZ', name: 'Azerbaijan' },\n { code: 'BS', name: 'Bahamas' },\n { code: 'BH', name: 'Bahrain' },\n { code: 'BD', name: 'Bangladesh' },\n { code: 'BB', name: 'Barbados' },\n { code: 'BY', name: 'Belarus' },\n { code: 'BE', name: 'Belgium' },\n { code: 'BZ', name: 'Belize' },\n { code: 'BJ', name: 'Benin' },\n { code: 'BT', name: 'Bhutan' },\n { code: 'BO', name: 'Bolivia' },\n { code: 'BA', name: 'Bosnia and Herzegovina' },\n { code: 'BW', name: 'Botswana' },\n { code: 'BR', name: 'Brazil' },\n { code: 'BN', name: 'Brunei' },\n { code: 'BG', name: 'Bulgaria' },\n { code: 'BF', name: 'Burkina Faso' },\n { code: 'BI', name: 'Burundi' },\n { code: 'CV', name: 'Cabo Verde' },\n { code: 'KH', name: 'Cambodia' },\n { code: 'CM', name: 'Cameroon' },\n { code: 'CA', name: 'Canada' },\n { code: 'CF', name: 'Central African Republic' },\n { code: 'TD', name: 'Chad' },\n { code: 'CL', name: 'Chile' },\n { code: 'CN', name: 'China' },\n { code: 'CO', name: 'Colombia' },\n { code: 'KM', name: 'Comoros' },\n { code: 'CG', name: 'Congo' },\n { code: 'CD', name: 'Congo (DRC)' },\n { code: 'CR', name: 'Costa Rica' },\n { code: 'CI', name: \"Cote d'Ivoire\" },\n { code: 'HR', name: 'Croatia' },\n { code: 'CU', name: 'Cuba' },\n { code: 'CY', name: 'Cyprus' },\n { code: 'CZ', name: 'Czechia' },\n { code: 'DK', name: 'Denmark' },\n { code: 'DJ', name: 'Djibouti' },\n { code: 'DM', name: 'Dominica' },\n { code: 'DO', name: 'Dominican Republic' },\n { code: 'EC', name: 'Ecuador' },\n { code: 'EG', name: 'Egypt' },\n { code: 'SV', name: 'El Salvador' },\n { code: 'GQ', name: 'Equatorial Guinea' },\n { code: 'ER', name: 'Eritrea' },\n { code: 'EE', name: 'Estonia' },\n { code: 'SZ', name: 'Eswatini' },\n { code: 'ET', name: 'Ethiopia' },\n { code: 'FJ', name: 'Fiji' },\n { code: 'FI', name: 'Finland' },\n { code: 'FR', name: 'France' },\n { code: 'GA', name: 'Gabon' },\n { code: 'GM', name: 'Gambia' },\n { code: 'GE', name: 'Georgia' },\n { code: 'DE', name: 'Germany' },\n { code: 'GH', name: 'Ghana' },\n { code: 'GR', name: 'Greece' },\n { code: 'GD', name: 'Grenada' },\n { code: 'GT', name: 'Guatemala' },\n { code: 'GN', name: 'Guinea' },\n { code: 'GW', name: 'Guinea-Bissau' },\n { code: 'GY', name: 'Guyana' },\n { code: 'HT', name: 'Haiti' },\n { code: 'HN', name: 'Honduras' },\n { code: 'HU', name: 'Hungary' },\n { code: 'IS', name: 'Iceland' },\n { code: 'IN', name: 'India' },\n { code: 'ID', name: 'Indonesia' },\n { code: 'IR', name: 'Iran' },\n { code: 'IQ', name: 'Iraq' },\n { code: 'IE', name: 'Ireland' },\n { code: 'IL', name: 'Israel' },\n { code: 'IT', name: 'Italy' },\n { code: 'JM', name: 'Jamaica' },\n { code: 'JP', name: 'Japan' },\n { code: 'JO', name: 'Jordan' },\n { code: 'KZ', name: 'Kazakhstan' },\n { code: 'KE', name: 'Kenya' },\n { code: 'KI', name: 'Kiribati' },\n { code: 'KP', name: 'North Korea' },\n { code: 'KR', name: 'South Korea' },\n { code: 'KW', name: 'Kuwait' },\n { code: 'KG', name: 'Kyrgyzstan' },\n { code: 'LA', name: 'Laos' },\n { code: 'LV', name: 'Latvia' },\n { code: 'LB', name: 'Lebanon' },\n { code: 'LS', name: 'Lesotho' },\n { code: 'LR', name: 'Liberia' },\n { code: 'LY', name: 'Libya' },\n { code: 'LI', name: 'Liechtenstein' },\n { code: 'LT', name: 'Lithuania' },\n { code: 'LU', name: 'Luxembourg' },\n { code: 'MG', name: 'Madagascar' },\n { code: 'MW', name: 'Malawi' },\n { code: 'MY', name: 'Malaysia' },\n { code: 'MV', name: 'Maldives' },\n { code: 'ML', name: 'Mali' },\n { code: 'MT', name: 'Malta' },\n { code: 'MH', name: 'Marshall Islands' },\n { code: 'MR', name: 'Mauritania' },\n { code: 'MU', name: 'Mauritius' },\n { code: 'MX', name: 'Mexico' },\n { code: 'FM', name: 'Micronesia' },\n { code: 'MD', name: 'Moldova' },\n { code: 'MC', name: 'Monaco' },\n { code: 'MN', name: 'Mongolia' },\n { code: 'ME', name: 'Montenegro' },\n { code: 'MA', name: 'Morocco' },\n { code: 'MZ', name: 'Mozambique' },\n { code: 'MM', name: 'Myanmar' },\n { code: 'NA', name: 'Namibia' },\n { code: 'NR', name: 'Nauru' },\n { code: 'NP', name: 'Nepal' },\n { code: 'NL', name: 'Netherlands' },\n { code: 'NZ', name: 'New Zealand' },\n { code: 'NI', name: 'Nicaragua' },\n { code: 'NE', name: 'Niger' },\n { code: 'NG', name: 'Nigeria' },\n { code: 'MK', name: 'North Macedonia' },\n { code: 'NO', name: 'Norway' },\n { code: 'OM', name: 'Oman' },\n { code: 'PK', name: 'Pakistan' },\n { code: 'PW', name: 'Palau' },\n { code: 'PS', name: 'Palestine' },\n { code: 'PA', name: 'Panama' },\n { code: 'PG', name: 'Papua New Guinea' },\n { code: 'PY', name: 'Paraguay' },\n { code: 'PE', name: 'Peru' },\n { code: 'PH', name: 'Philippines' },\n { code: 'PL', name: 'Poland' },\n { code: 'PT', name: 'Portugal' },\n { code: 'QA', name: 'Qatar' },\n { code: 'RO', name: 'Romania' },\n { code: 'RU', name: 'Russia' },\n { code: 'RW', name: 'Rwanda' },\n { code: 'KN', name: 'Saint Kitts and Nevis' },\n { code: 'LC', name: 'Saint Lucia' },\n { code: 'VC', name: 'Saint Vincent and the Grenadines' },\n { code: 'WS', name: 'Samoa' },\n { code: 'SM', name: 'San Marino' },\n { code: 'ST', name: 'Sao Tome and Principe' },\n { code: 'SA', name: 'Saudi Arabia' },\n { code: 'SN', name: 'Senegal' },\n { code: 'RS', name: 'Serbia' },\n { code: 'SC', name: 'Seychelles' },\n { code: 'SL', name: 'Sierra Leone' },\n { code: 'SG', name: 'Singapore' },\n { code: 'SK', name: 'Slovakia' },\n { code: 'SI', name: 'Slovenia' },\n { code: 'SB', name: 'Solomon Islands' },\n { code: 'SO', name: 'Somalia' },\n { code: 'ZA', name: 'South Africa' },\n { code: 'SS', name: 'South Sudan' },\n { code: 'ES', name: 'Spain' },\n { code: 'LK', name: 'Sri Lanka' },\n { code: 'SD', name: 'Sudan' },\n { code: 'SR', name: 'Suriname' },\n { code: 'SE', name: 'Sweden' },\n { code: 'CH', name: 'Switzerland' },\n { code: 'SY', name: 'Syria' },\n { code: 'TW', name: 'Taiwan' },\n { code: 'TJ', name: 'Tajikistan' },\n { code: 'TZ', name: 'Tanzania' },\n { code: 'TH', name: 'Thailand' },\n { code: 'TL', name: 'Timor-Leste' },\n { code: 'TG', name: 'Togo' },\n { code: 'TO', name: 'Tonga' },\n { code: 'TT', name: 'Trinidad and Tobago' },\n { code: 'TN', name: 'Tunisia' },\n { code: 'TR', name: 'Turkey' },\n { code: 'TM', name: 'Turkmenistan' },\n { code: 'TV', name: 'Tuvalu' },\n { code: 'UG', name: 'Uganda' },\n { code: 'UA', name: 'Ukraine' },\n { code: 'AE', name: 'United Arab Emirates' },\n { code: 'GB', name: 'United Kingdom' },\n { code: 'US', name: 'United States' },\n { code: 'UY', name: 'Uruguay' },\n { code: 'UZ', name: 'Uzbekistan' },\n { code: 'VU', name: 'Vanuatu' },\n { code: 'VA', name: 'Vatican City' },\n { code: 'VE', name: 'Venezuela' },\n { code: 'VN', name: 'Vietnam' },\n { code: 'YE', name: 'Yemen' },\n { code: 'ZM', name: 'Zambia' },\n { code: 'ZW', name: 'Zimbabwe' },\n] as const;\n","/**\n * Employment-type taxonomy. Mirrors `id.sifa.defs#employmentType.knownValues`\n * from sifa-lexicons. Surfaces both a flat NSID→label map (for read-only\n * display) and a grouped structure (for editor dropdowns).\n */\n\nexport interface EmploymentTypeOption {\n value: string;\n label: string;\n}\n\nexport interface EmploymentTypeGroup {\n label: string;\n items: EmploymentTypeOption[];\n}\n\nexport const EMPLOYMENT_TYPE_GROUPS: EmploymentTypeGroup[] = [\n {\n label: 'Employee',\n items: [\n { value: 'id.sifa.defs#fullTime', label: 'Full-time' },\n { value: 'id.sifa.defs#partTime', label: 'Part-time' },\n { value: 'id.sifa.defs#temporary', label: 'Temporary' },\n { value: 'id.sifa.defs#seasonal', label: 'Seasonal' },\n ],\n },\n {\n label: 'Independent',\n items: [\n { value: 'id.sifa.defs#contract', label: 'Contract' },\n { value: 'id.sifa.defs#freelance', label: 'Freelance' },\n { value: 'id.sifa.defs#selfEmployed', label: 'Self-employed' },\n { value: 'id.sifa.defs#independentWork', label: 'Independent work' },\n ],\n },\n {\n label: 'Training & early-career',\n items: [\n { value: 'id.sifa.defs#internship', label: 'Internship' },\n { value: 'id.sifa.defs#apprenticeship', label: 'Apprenticeship' },\n { value: 'id.sifa.defs#fellowship', label: 'Fellowship' },\n { value: 'id.sifa.defs#trainee', label: 'Trainee' },\n ],\n },\n];\n\nexport const EMPLOYMENT_TYPE_LABELS: Record<string, string> = {\n ...Object.fromEntries(\n EMPLOYMENT_TYPE_GROUPS.flatMap((g) => g.items).map((o) => [o.value, o.label]),\n ),\n // `volunteer` is retained for legacy records but no longer offered in the\n // editor dropdown. Volunteering is a distinct thing (no payroll, no formal\n // role, no obligation) rather than a kind of employment, so it lives in the\n // dedicated `id.sifa.profile.volunteering` section, not on the employment-type\n // axis. Kept here so old positions still render a human label, not the raw NSID.\n 'id.sifa.defs#volunteer': 'Volunteer',\n};\n\n/** Resolve a label for an employment-type token. Falls back to the raw value. */\nexport function getEmploymentTypeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return EMPLOYMENT_TYPE_LABELS[value] ?? value;\n}\n\n/**\n * Employment-type group whose members may omit a company name: independent\n * workers (contract, freelance, self-employed, independent work) often have no\n * separately named or registered entity. Derived from the group rather than a\n * hand-maintained list so it stays in sync if the group's membership changes.\n */\nexport const COMPANY_OPTIONAL_EMPLOYMENT_TYPES: ReadonlySet<string> = new Set(\n EMPLOYMENT_TYPE_GROUPS.find((g) => g.label === 'Independent')?.items.map((i) => i.value) ?? [],\n);\n\n/**\n * Whether a company name is required for a position with the given employment\n * type. Company is optional for the Independent group; required otherwise,\n * including when the employment type is unspecified (the conservative default,\n * since most positions are at a named organization).\n */\nexport function isCompanyRequired(employmentType: string | undefined | null): boolean {\n if (!employmentType) return true;\n return !COMPANY_OPTIONAL_EMPLOYMENT_TYPES.has(employmentType);\n}\n","/** Two-level industry/domain taxonomy for profile classification. */\n\nexport interface IndustryOption {\n value: string;\n labelKey: string;\n domains: { value: string; labelKey: string }[];\n}\n\nexport const INDUSTRY_OPTIONS: IndustryOption[] = [\n {\n value: 'id.sifa.defs#industryTechnology',\n labelKey: 'industryTechnology',\n domains: [\n { value: 'id.sifa.defs#domainSoftwareEngineering', labelKey: 'domainSoftwareEngineering' },\n { value: 'id.sifa.defs#domainDataScience', labelKey: 'domainDataScience' },\n { value: 'id.sifa.defs#domainCybersecurity', labelKey: 'domainCybersecurity' },\n { value: 'id.sifa.defs#domainDevops', labelKey: 'domainDevops' },\n { value: 'id.sifa.defs#domainProductDesign', labelKey: 'domainProductDesign' },\n { value: 'id.sifa.defs#domainGameDev', labelKey: 'domainGameDev' },\n ],\n },\n {\n value: 'id.sifa.defs#industryFinance',\n labelKey: 'industryFinance',\n domains: [\n { value: 'id.sifa.defs#domainBanking', labelKey: 'domainBanking' },\n { value: 'id.sifa.defs#domainFintech', labelKey: 'domainFintech' },\n { value: 'id.sifa.defs#domainInsurance', labelKey: 'domainInsurance' },\n { value: 'id.sifa.defs#domainInvestmentMgmt', labelKey: 'domainInvestmentMgmt' },\n ],\n },\n {\n value: 'id.sifa.defs#industryHealthcare',\n labelKey: 'industryHealthcare',\n domains: [\n { value: 'id.sifa.defs#domainClinicalResearch', labelKey: 'domainClinicalResearch' },\n { value: 'id.sifa.defs#domainHealthtech', labelKey: 'domainHealthtech' },\n { value: 'id.sifa.defs#domainPharma', labelKey: 'domainPharma' },\n ],\n },\n {\n value: 'id.sifa.defs#industryEducation',\n labelKey: 'industryEducation',\n domains: [\n { value: 'id.sifa.defs#domainHigherEd', labelKey: 'domainHigherEd' },\n { value: 'id.sifa.defs#domainEdtech', labelKey: 'domainEdtech' },\n { value: 'id.sifa.defs#domainPrimarySecondary', labelKey: 'domainPrimarySecondary' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMedia',\n labelKey: 'industryMedia',\n domains: [\n { value: 'id.sifa.defs#domainJournalism', labelKey: 'domainJournalism' },\n { value: 'id.sifa.defs#domainFilmVideo', labelKey: 'domainFilmVideo' },\n { value: 'id.sifa.defs#domainGaming', labelKey: 'domainGaming' },\n { value: 'id.sifa.defs#domainAdvertising', labelKey: 'domainAdvertising' },\n ],\n },\n {\n value: 'id.sifa.defs#industryRetail',\n labelKey: 'industryRetail',\n domains: [\n { value: 'id.sifa.defs#domainEcommerce', labelKey: 'domainEcommerce' },\n { value: 'id.sifa.defs#domainSupplyChain', labelKey: 'domainSupplyChain' },\n ],\n },\n {\n value: 'id.sifa.defs#industryManufacturing',\n labelKey: 'industryManufacturing',\n domains: [\n { value: 'id.sifa.defs#domainAutomotive', labelKey: 'domainAutomotive' },\n { value: 'id.sifa.defs#domainAerospace', labelKey: 'domainAerospace' },\n { value: 'id.sifa.defs#domainHardware', labelKey: 'domainHardware' },\n ],\n },\n {\n value: 'id.sifa.defs#industryEnergy',\n labelKey: 'industryEnergy',\n domains: [\n { value: 'id.sifa.defs#domainRenewables', labelKey: 'domainRenewables' },\n { value: 'id.sifa.defs#domainOilGas', labelKey: 'domainOilGas' },\n { value: 'id.sifa.defs#domainClimateTech', labelKey: 'domainClimateTech' },\n ],\n },\n {\n value: 'id.sifa.defs#industryGovernment',\n labelKey: 'industryGovernment',\n domains: [\n { value: 'id.sifa.defs#domainPublicPolicy', labelKey: 'domainPublicPolicy' },\n { value: 'id.sifa.defs#domainDefense', labelKey: 'domainDefense' },\n ],\n },\n {\n value: 'id.sifa.defs#industryLegal',\n labelKey: 'industryLegal',\n domains: [\n { value: 'id.sifa.defs#domainIpLaw', labelKey: 'domainIpLaw' },\n { value: 'id.sifa.defs#domainCompliance', labelKey: 'domainCompliance' },\n ],\n },\n {\n value: 'id.sifa.defs#industryConsulting',\n labelKey: 'industryConsulting',\n domains: [\n { value: 'id.sifa.defs#domainManagementConsulting', labelKey: 'domainManagementConsulting' },\n { value: 'id.sifa.defs#domainDevrel', labelKey: 'domainDevrel' },\n { value: 'id.sifa.defs#domainHrRecruitment', labelKey: 'domainHrRecruitment' },\n ],\n },\n {\n value: 'id.sifa.defs#industryNonprofit',\n labelKey: 'industryNonprofit',\n domains: [\n { value: 'id.sifa.defs#domainHumanRights', labelKey: 'domainHumanRights' },\n { value: 'id.sifa.defs#domainOpenSource', labelKey: 'domainOpenSource' },\n ],\n },\n {\n value: 'id.sifa.defs#industryRealEstate',\n labelKey: 'industryRealEstate',\n domains: [{ value: 'id.sifa.defs#domainProptech', labelKey: 'domainProptech' }],\n },\n {\n value: 'id.sifa.defs#industryTransport',\n labelKey: 'industryTransport',\n domains: [\n { value: 'id.sifa.defs#domainAutonomousVehicles', labelKey: 'domainAutonomousVehicles' },\n { value: 'id.sifa.defs#domainLogistics', labelKey: 'domainLogistics' },\n ],\n },\n {\n value: 'id.sifa.defs#industryAgriculture',\n labelKey: 'industryAgriculture',\n domains: [\n { value: 'id.sifa.defs#domainAgritech', labelKey: 'domainAgritech' },\n { value: 'id.sifa.defs#domainFoodTech', labelKey: 'domainFoodTech' },\n ],\n },\n {\n value: 'id.sifa.defs#industryHospitality',\n labelKey: 'industryHospitality',\n domains: [\n { value: 'id.sifa.defs#domainHotels', labelKey: 'domainHotels' },\n { value: 'id.sifa.defs#domainTravelTourism', labelKey: 'domainTravelTourism' },\n { value: 'id.sifa.defs#domainFoodBeverage', labelKey: 'domainFoodBeverage' },\n ],\n },\n {\n value: 'id.sifa.defs#industryTelecom',\n labelKey: 'industryTelecom',\n domains: [\n { value: 'id.sifa.defs#domainNetworkInfra', labelKey: 'domainNetworkInfra' },\n { value: 'id.sifa.defs#domainMobileServices', labelKey: 'domainMobileServices' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMining',\n labelKey: 'industryMining',\n domains: [\n { value: 'id.sifa.defs#domainExtraction', labelKey: 'domainExtraction' },\n { value: 'id.sifa.defs#domainGeological', labelKey: 'domainGeological' },\n ],\n },\n {\n value: 'id.sifa.defs#industryFashion',\n labelKey: 'industryFashion',\n domains: [\n { value: 'id.sifa.defs#domainFashionDesign', labelKey: 'domainFashionDesign' },\n { value: 'id.sifa.defs#domainTextileManufacturing', labelKey: 'domainTextileManufacturing' },\n ],\n },\n {\n value: 'id.sifa.defs#industryMaritime',\n labelKey: 'industryMaritime',\n domains: [\n { value: 'id.sifa.defs#domainShipping', labelKey: 'domainShipping' },\n { value: 'id.sifa.defs#domainPortOperations', labelKey: 'domainPortOperations' },\n { value: 'id.sifa.defs#domainNavalArchitecture', labelKey: 'domainNavalArchitecture' },\n ],\n },\n {\n value: 'id.sifa.defs#industryOther',\n labelKey: 'industryOther',\n domains: [],\n },\n];\n\n/** Find the industry option for a given industry value. */\nexport function findIndustry(value: string | undefined | null): IndustryOption | undefined {\n if (!value) return undefined;\n return INDUSTRY_OPTIONS.find((i) => i.value === value);\n}\n\n/** Get the label key for an industry or domain token, falling back to the raw value. */\nexport function getIndustryLabelKey(value: string): string {\n for (const industry of INDUSTRY_OPTIONS) {\n if (industry.value === value) return industry.labelKey;\n for (const domain of industry.domains) {\n if (domain.value === value) return domain.labelKey;\n }\n }\n return value;\n}\n","/**\n * \"Open to\" taxonomy. Mirrors `id.sifa.defs#openToWorkStatus.knownValues` from\n * sifa-lexicons. Surfaces a single source of truth for the editor (where the\n * user picks values) and the IdentityCard (where badges are rendered).\n *\n * Shape matches `INDUSTRY_OPTIONS`: `{ value, labelKey }` so consumers can run\n * `labelKey` through their own i18n layer (e.g. next-intl `useTranslations`).\n */\n\nexport type OpenToGroup = 'work' | 'mentorship' | 'peer';\n\nexport interface OpenToOption {\n value: string;\n labelKey: string;\n token: string;\n group: OpenToGroup;\n}\n\nexport const OPEN_TO_OPTIONS: OpenToOption[] = [\n {\n value: 'id.sifa.defs#fullTimeRoles',\n labelKey: 'fullTimeRoles',\n token: 'fullTime',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#partTimeRoles',\n labelKey: 'partTimeRoles',\n token: 'partTime',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#contractRoles',\n labelKey: 'contractRoles',\n token: 'contract',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#commissions',\n labelKey: 'commissions',\n token: 'commissions',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#boardPositions',\n labelKey: 'boardPositions',\n token: 'board',\n group: 'work',\n },\n {\n value: 'id.sifa.defs#mentoringOthers',\n labelKey: 'mentoringOthers',\n token: 'mentor',\n group: 'mentorship',\n },\n {\n value: 'id.sifa.defs#beingMentored',\n labelKey: 'beingMentored',\n token: 'mentee',\n group: 'mentorship',\n },\n {\n value: 'id.sifa.defs#collaborations',\n labelKey: 'collaborations',\n token: 'collab',\n group: 'peer',\n },\n];\n\n/** Map short token (e.g. \"fullTime\") -> lex value (e.g. \"id.sifa.defs#fullTimeRoles\"). */\nexport const OPEN_TO_TOKEN_TO_VALUE: Record<string, string> = Object.fromEntries(\n OPEN_TO_OPTIONS.map((o) => [o.token, o.value]),\n);\n\n/** Map lex value -> short token. */\nexport const OPEN_TO_VALUE_TO_TOKEN: Record<string, string> = Object.fromEntries(\n OPEN_TO_OPTIONS.map((o) => [o.value, o.token]),\n);\n\n/** All valid tokens, useful for runtime validation. */\nexport const OPEN_TO_TOKENS: readonly string[] = OPEN_TO_OPTIONS.map((o) => o.token);\n\n/** Resolve a token to its lex value, returning `undefined` if unknown. */\nexport function openToTokenToValue(token: string | undefined | null): string | undefined {\n if (!token) return undefined;\n return OPEN_TO_TOKEN_TO_VALUE[token];\n}\n\n/** Resolve a lex value to its token, returning `undefined` if unknown. */\nexport function openToValueToToken(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return OPEN_TO_VALUE_TO_TOKEN[value];\n}\n\n/**\n * Legacy aliases — tokens the lexicon used to expose but doesn't anymore.\n * Records written before the lexicon migration may still carry them; resolve\n * them to the closest current `labelKey` for display.\n */\nconst OPEN_TO_LEGACY_ALIASES: Record<string, string> = {\n 'id.sifa.defs#mentoring': 'mentoringOthers',\n};\n\nconst OPEN_TO_LABEL_KEY_MAP: Record<string, string> = {\n ...Object.fromEntries(OPEN_TO_OPTIONS.map((o) => [o.value, o.labelKey])),\n ...OPEN_TO_LEGACY_ALIASES,\n};\n\n/**\n * Resolve a `labelKey` for an `openToWorkStatus` token. Returns `undefined`\n * for tokens not in the canonical set or the legacy alias map, so callers\n * can choose their own fallback (e.g. render the raw value).\n */\nexport function getOpenToLabelKey(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return OPEN_TO_LABEL_KEY_MAP[value];\n}\n\n/**\n * Legacy `openToWorkStatus` values mapped to their current canonical value.\n * Mirrors {@link OPEN_TO_LEGACY_ALIASES} but resolves to the full lex value\n * (not just the `labelKey`) so it can rewrite stored records.\n */\nexport const OPEN_TO_LEGACY_VALUE_ALIASES: Record<string, string> = {\n 'id.sifa.defs#mentoring': 'id.sifa.defs#mentoringOthers',\n};\n\n/**\n * Normalize a list of `openTo` values: resolve legacy aliases to their\n * canonical value, then dedup while preserving first-seen order. Unknown tokens\n * pass through untouched (forward-compat). Used by the editor (so a legacy token\n * maps onto a real option and migrates forward on save) and by display (so a\n * record carrying both the legacy and canonical token renders a single badge).\n */\nexport function normalizeOpenTo(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const value of values) {\n const canonical = OPEN_TO_LEGACY_VALUE_ALIASES[value] ?? value;\n if (seen.has(canonical)) continue;\n seen.add(canonical);\n out.push(canonical);\n }\n return out;\n}\n","/**\n * Workplace-type taxonomy. Mirrors `id.sifa.defs#workplaceType.knownValues`\n * from sifa-lexicons. `remote` is retained for legacy records but the scoped\n * variants (`remoteLocal`, `remoteRegion`, `remoteGlobal`) are preferred for\n * new records per the lexicon description.\n */\n\nexport interface WorkplaceTypeOption {\n value: string;\n label: string;\n}\n\nexport const WORKPLACE_TYPE_OPTIONS: WorkplaceTypeOption[] = [\n { value: 'id.sifa.defs#onSite', label: 'On-site' },\n { value: 'id.sifa.defs#hybrid', label: 'Hybrid' },\n { value: 'id.sifa.defs#remoteLocal', label: 'Remote (same country)' },\n { value: 'id.sifa.defs#remoteRegion', label: 'Remote (same region)' },\n { value: 'id.sifa.defs#remoteGlobal', label: 'Remote (anywhere)' },\n];\n\nexport const WORKPLACE_TYPE_LABELS: Record<string, string> = {\n ...Object.fromEntries(WORKPLACE_TYPE_OPTIONS.map((o) => [o.value, o.label])),\n 'id.sifa.defs#remote': 'Remote',\n};\n\n/** Resolve a label for a workplace-type token. Falls back to the raw value. */\nexport function getWorkplaceTypeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return WORKPLACE_TYPE_LABELS[value] ?? value;\n}\n\n/**\n * Legacy workplace tokens the lexicon retains for old records, mapped to their\n * current canonical token. `id.sifa.defs#remote` is \"Treated as remoteGlobal by\n * AppViews\" per the lexicon, so it resolves to the scoped `remoteGlobal`.\n */\nexport const WORKPLACE_TYPE_LEGACY_ALIASES: Record<string, string> = {\n 'id.sifa.defs#remote': 'id.sifa.defs#remoteGlobal',\n};\n\n/**\n * Normalize a list of workplace-type tokens: resolve legacy aliases to their\n * canonical token, then dedup while preserving first-seen order. Unknown tokens\n * pass through untouched (forward-compat). Used by the editor (so a legacy token\n * maps onto a real option and migrates forward on save) and by display (so a\n * record carrying both the legacy and canonical token renders a single badge).\n */\nexport function normalizeWorkplaceTypes(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const value of values) {\n const canonical = WORKPLACE_TYPE_LEGACY_ALIASES[value] ?? value;\n if (seen.has(canonical)) continue;\n seen.add(canonical);\n out.push(canonical);\n }\n return out;\n}\n","/**\n * Platform identifiers, labels, and URL helpers used in profile external accounts.\n *\n * This file is intentionally data-only -- icon mapping is platform-specific\n * (React DOM components on web, React Native components on mobile) and lives\n * in the consumer.\n */\n\nexport const PLATFORM_LABELS = {\n bluesky: 'Bluesky',\n github: 'GitHub',\n codeberg: 'Codeberg',\n gitlab: 'GitLab',\n forgejo: 'Forgejo',\n gitea: 'Gitea',\n linkedin: 'LinkedIn',\n youtube: 'YouTube',\n twitter: 'X (Twitter)',\n instagram: 'Instagram',\n substack: 'Substack',\n tangled: 'Tangled',\n dns: 'Domain',\n website: 'Website',\n rss: 'RSS',\n fediverse: 'Fediverse',\n orcid: 'ORCID',\n keyoxide: 'Keyoxide',\n} as const;\n\nexport type PlatformId = keyof typeof PLATFORM_LABELS;\n\n/** Prefix of the lexicon platform knownValue tokens (e.g. id.sifa.defs#platformLinkedin). */\nconst PLATFORM_TOKEN_PREFIX = 'id.sifa.defs#platform';\n\n/**\n * Normalize a platform value to the short code used throughout the app (the\n * editor, the API `VALID_PLATFORMS` enum, the DB, and {@link PLATFORM_LABELS}).\n *\n * External-account records may carry `platform` as the raw lexicon knownValue\n * token (`id.sifa.defs#platformLinkedin`) instead of the short code — written by\n * some third-party apps. This maps the token to its lowercase suffix\n * (`linkedin`) and passes short codes / unknown values through unchanged.\n */\n/**\n * Synonyms written by third-party tools and keytrace claims (whose `type` is\n * surfaced as the platform) for the same underlying network, mapped to the\n * canonical short code. Without this, a keytrace-verified Mastodon account\n * arrives as `activitypub`, an unknown platform that renders as a generic\n * website and is skipped by Fediverse ingestion.\n */\nconst PLATFORM_ALIASES: Record<string, PlatformId> = {\n activitypub: 'fediverse',\n mastodon: 'fediverse',\n};\n\nexport function normalizePlatformId(platform: string): string {\n const code = platform.startsWith(PLATFORM_TOKEN_PREFIX)\n ? platform.slice(PLATFORM_TOKEN_PREFIX.length).toLowerCase()\n : platform;\n return PLATFORM_ALIASES[code.toLowerCase()] ?? code;\n}\n\nexport function isKnownPlatform(platform: string): platform is PlatformId {\n return platform in PLATFORM_LABELS;\n}\n\nexport function getPlatformLabel(platform: string): string {\n const normalized = normalizePlatformId(platform);\n return isKnownPlatform(normalized) ? PLATFORM_LABELS[normalized] : PLATFORM_LABELS.website;\n}\n\n/** Platforms excluded from the \"Add Links\" dropdown (auto-derived or not accepted by API). */\nconst EXCLUDED_FROM_DROPDOWN = new Set<PlatformId>(['bluesky', 'dns', 'tangled']);\n\n/** Platforms available in the \"Add Links\" dropdown. */\nexport const PLATFORM_OPTIONS: ReadonlyArray<{ value: PlatformId; label: string }> = (\n Object.entries(PLATFORM_LABELS) as [PlatformId, string][]\n)\n .filter(([value]) => !EXCLUDED_FROM_DROPDOWN.has(value))\n .map(([value, label]) => ({ value, label }));\n\n/**\n * Build a favicon URL for a given site URL using Google's public favicon service.\n * Returns `null` if the URL cannot be parsed.\n */\nexport function getFaviconUrl(siteUrl: string): string | null {\n try {\n const { hostname } = new URL(siteUrl);\n return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(hostname)}&sz=32`;\n } catch {\n return null;\n }\n}\n","export const SKILL_CATEGORIES = [\n { value: 'technical', label: 'Technical' },\n { value: 'business', label: 'Business' },\n { value: 'creative', label: 'Creative' },\n { value: 'interpersonal', label: 'Interpersonal' },\n { value: 'industry', label: 'Industry' },\n { value: 'community', label: 'Community' },\n { value: 'security', label: 'Security' },\n] as const;\n\nexport type SkillCategory = (typeof SKILL_CATEGORIES)[number]['value'];\n\nexport const CATEGORY_ORDER: ReadonlyArray<SkillCategory> = SKILL_CATEGORIES.map((c) => c.value);\n\nexport const CATEGORY_LABELS: Record<SkillCategory | 'other', string> = {\n ...(Object.fromEntries(SKILL_CATEGORIES.map((c) => [c.value, c.label])) as Record<\n SkillCategory,\n string\n >),\n other: 'Other',\n};\n","import type { ProfileSkill } from '../types/index.js';\n\nimport { CATEGORY_ORDER } from './skill-categories.js';\n\nexport type MergedProfileSkill = ProfileSkill & {\n mergedRkeys: string[];\n positionRkeys?: string[];\n};\n\n/**\n * Collapses skills that resolve to the same name (case-insensitive, trimmed).\n *\n * LinkedIn import creates one skill record per (skill, position) pair, so a\n * profile can have several \"Ruby\" rows. We surface them as a single chip with\n * all underlying rkeys exposed via `mergedRkeys` so edit/delete can fan out.\n */\nexport function dedupeSkills(skills: ProfileSkill[]): MergedProfileSkill[] {\n const groups = new Map<string, MergedProfileSkill>();\n\n for (const skill of skills) {\n const key = skill.name.trim().toLowerCase();\n const existing = groups.get(key);\n const positions = (skill as ProfileSkill & { positionRkeys?: string[] }).positionRkeys ?? [];\n\n if (!existing) {\n groups.set(key, {\n ...skill,\n mergedRkeys: [skill.rkey],\n positionRkeys: [...positions],\n });\n continue;\n }\n\n existing.mergedRkeys.push(skill.rkey);\n if (!existing.category && skill.category) existing.category = skill.category;\n if ((skill.endorsementCount ?? 0) > (existing.endorsementCount ?? 0)) {\n existing.endorsementCount = skill.endorsementCount;\n }\n if (skill.endorsed) existing.endorsed = true;\n if (skill.activityBacked) existing.activityBacked = true;\n const merged = new Set([...(existing.positionRkeys ?? []), ...positions]);\n existing.positionRkeys = Array.from(merged);\n }\n\n return Array.from(groups.values());\n}\n\n/**\n * Groups skills by category in CATEGORY_ORDER, with unknown/empty categories\n * collected under \"other\". Within each group: sorted by endorsementCount desc,\n * then alphabetical by name. Empty groups are omitted.\n */\nexport function groupSkillsByCategory<T extends ProfileSkill>(skills: T[]): [string, T[]][] {\n const grouped = new Map<string, T[]>();\n\n for (const skill of skills) {\n const normalised = skill.category?.toLowerCase().trim() ?? '';\n const key = (CATEGORY_ORDER as readonly string[]).includes(normalised) ? normalised : 'other';\n const bucket = grouped.get(key) ?? [];\n bucket.push(skill);\n grouped.set(key, bucket);\n }\n\n for (const [, groupSkills] of grouped) {\n groupSkills.sort((a, b) => {\n const countDiff = (b.endorsementCount ?? 0) - (a.endorsementCount ?? 0);\n if (countDiff !== 0) return countDiff;\n return a.name.localeCompare(b.name);\n });\n }\n\n const ordered: [string, T[]][] = [];\n for (const cat of CATEGORY_ORDER) {\n const group = grouped.get(cat);\n if (group?.length) ordered.push([cat, group]);\n }\n const otherGroup = grouped.get('other');\n if (otherGroup?.length) ordered.push(['other', otherGroup]);\n\n return ordered;\n}\n","/**\n * App-category taxonomy for AT Protocol apps tracked by Sifa.\n *\n * Categories group apps by what kind of activity they produce (Posts, Photos,\n * Code, ...). They drive the pill-size icon shown in `<AppPill>` and the\n * fallback glyph used in activity-card headers when no app-specific logo\n * exists.\n *\n * This file is intentionally data-only -- icon mapping is renderer-specific\n * (React DOM Phosphor components on web, React Native components on mobile)\n * and lives in the consumer. The `phosphorIcon` field is the Phosphor icon\n * NAME, not a component reference.\n *\n * Categories are an internal grouping; we do not surface this taxonomy in\n * public-facing copy.\n */\n\nexport const APP_CATEGORIES = {\n Articles: { phosphorIcon: 'Article' },\n Chat: { phosphorIcon: 'ChatsCircle' },\n Code: { phosphorIcon: 'Code' },\n Domains: { phosphorIcon: 'Globe' },\n Endorsements: { phosphorIcon: 'HandHeart' },\n Events: { phosphorIcon: 'CalendarBlank' },\n Links: { phosphorIcon: 'LinkSimple' },\n Lists: { phosphorIcon: 'ListBullets' },\n Music: { phosphorIcon: 'MusicNote' },\n Pages: { phosphorIcon: 'Browser' },\n Pastes: { phosphorIcon: 'Clipboard' },\n Photos: { phosphorIcon: 'Camera' },\n Places: { phosphorIcon: 'MapPin' },\n Posts: { phosphorIcon: 'ChatCircle' },\n 'Q&A': { phosphorIcon: 'Question' },\n Recipes: { phosphorIcon: 'CookingPot' },\n Research: { phosphorIcon: 'Path' },\n Reviews: { phosphorIcon: 'Star' },\n Slides: { phosphorIcon: 'Presentation' },\n Social: { phosphorIcon: 'UsersThree' },\n Verification: { phosphorIcon: 'Key' },\n Video: { phosphorIcon: 'VideoCamera' },\n} as const;\n\nexport type AppCategoryId = keyof typeof APP_CATEGORIES;\n\nexport const APP_CATEGORY_IDS = Object.keys(APP_CATEGORIES) as AppCategoryId[];\n\nexport function isAppCategory(value: string): value is AppCategoryId {\n return Object.prototype.hasOwnProperty.call(APP_CATEGORIES, value);\n}\n\nexport function getAppCategoryIcon(category: AppCategoryId): string {\n return APP_CATEGORIES[category].phosphorIcon;\n}\n","/**\n * Maps every AT Protocol app Sifa tracks to its `AppCategoryId`. Single source\n * of truth for what category an app belongs to; sifa-api and sifa-web both\n * import from here.\n *\n * Add a new app: pick the category whose generic glyph best represents the\n * activity. If no existing category fits, add a new one to APP_CATEGORIES\n * rather than introducing a per-app override.\n */\n\nimport type { AppCategoryId } from './app-categories.js';\n\nexport const APP_CATEGORY_MAP = {\n // Backend-scanned (sifa-api APP_REGISTRY)\n bluesky: 'Posts',\n tangled: 'Code',\n github: 'Code',\n smokesignal: 'Events',\n flashes: 'Photos',\n grain: 'Photos',\n whitewind: 'Articles',\n frontpage: 'Links',\n pastesphere: 'Pastes',\n standard: 'Articles',\n aetheros: 'Pages',\n roomy: 'Social',\n keytrace: 'Verification',\n popfeed: 'Reviews',\n streamplace: 'Video',\n semble: 'Research',\n youandme: 'Social',\n leaflet: 'Articles',\n colibri: 'Social',\n collectivesocial: 'Lists',\n bookhive: 'Reviews',\n beaconbits: 'Places',\n passports: 'Places',\n asq: 'Q&A',\n spark: 'Posts',\n nooki: 'Social',\n atstore: 'Reviews',\n plyr: 'Music',\n anisota: 'Posts',\n atfund: 'Endorsements',\n crate: 'Articles',\n atmorsvp: 'Events',\n opensocial: 'Social',\n // Kevara speaker-directory listing — a professional speaking-availability\n // declaration (talk topics, formats like keynote/panel/conference-talk).\n // Grouped under Events as the closest fit (speaking engagements).\n kevara: 'Events',\n // Marque domain registrar — a domain registration record is a dated\n // identity/ownership action, surfaced as a \"registered a domain\" event.\n marque: 'Domains',\n // ATCR (io.atcr) — distributed OCI container registry. The portfolio entry\n // is io.atcr.repo.page (a published repository with a markdown README);\n // manifests and tags are low-level artifacts excluded backend-side.\n atcr: 'Code',\n // Batch onboard — apps surfaced on high-volume profiles. Each gives its\n // collections a named pill + category icon instead of a raw NSID.\n mcp: 'Code', // app.mcp.server — published MCP servers (name/tools/language)\n userinput: 'Social', // app.userinput — roadmap discussions + replies\n minomobi: 'Music', // com.minomobi.music.composition — authored music\n voxport: 'Video', // com.voxport.podcast.series — podcast series\n badges: 'Verification', // community.lexicon.badge.award — signed earned credentials\n atvouch: 'Endorsements', // dev.atvouch.graph.vouch — trust vouches\n watsm: 'Code', // io.calabro.watsm.program — published WASM programs\n plonk: 'Pastes', // li.plonk.paste — text pastes\n alternativeproto: 'Links', // net.alternativeproto.submission — app-directory listings\n papili: 'Links', // one.papili.post — link posts\n vit: 'Code', // org.v-it.skill — published agent skills\n lifepo: 'Social', // st.lifepo.lifeEvent — life-event timeline\n streamthought: 'Posts', // stream.thought.blip — microblog thoughts\n waow: 'Photos', // tech.waow.* — doodl drawings (dominant), polls, slides\n lichen: 'Pages', // wiki.lichen — wiki notes + wikis\n // Onboard from aramzs.xyz profile audit — new named pills.\n aetherdocs: 'Slides', // os.aether.docs.presentation — authored slide decks\n kich: 'Recipes', // io.kich.recipe.recipe — authored recipes\n margin: 'Research', // at.margin.{note,annotation} — web-annotation notes with a body\n // Onboard from moll.dev profile audit.\n recipe: 'Recipes', // exchange.recipe.recipe — authored recipes on recipe.exchange\n\n // Web-only (rendered in pills/cards via sifa-web atproto-apps.ts;\n // no backend scan collection yet)\n linkat: 'Links',\n kipclip: 'Links',\n statusphere: 'Social',\n} as const satisfies Record<string, AppCategoryId>;\n\nexport type KnownAppId = keyof typeof APP_CATEGORY_MAP;\n\nexport function isKnownAppId(appId: string): appId is KnownAppId {\n return Object.prototype.hasOwnProperty.call(APP_CATEGORY_MAP, appId);\n}\n\nexport function categoryForApp(appId: string): AppCategoryId | undefined {\n return isKnownAppId(appId) ? APP_CATEGORY_MAP[appId] : undefined;\n}\n","{\n \"$schema\": \"https://sifa.id/schemas/activity-tiers/v1.json\",\n \"version\": \"1.0.0\",\n \"updated\": \"2026-05-28\",\n \"tiers\": {\n \"creation\": {\n \"label\": \"Made\",\n \"description\": \"Substantive records the actor authored: posts, articles, repos, galleries, livestreams, RSVPs, CV entries. Surfaced on the public profile and in the network timeline.\",\n \"shownOnPublicProfile\": true\n },\n \"action\": {\n \"label\": \"Did\",\n \"description\": \"Engagement records (likes, reposts, follows, votes, stars, reactions). Visible to the actor on the 'What is public about me' page and on the originating app, but not surfaced on the Sifa public profile.\",\n \"shownOnPublicProfile\": false\n },\n \"filtered\": {\n \"label\": null,\n \"description\": \"Configuration, infrastructure, moderation, game state, ephemeral consumption signals (bookmarks, highlights), and other records Sifa does not display anywhere. The records remain public on the actor's PDS regardless.\",\n \"shownOnPublicProfile\": false\n }\n },\n \"lexicons\": {\n \"app.bsky.feed.post\": {\n \"tier\": \"creation\",\n \"app\": \"bluesky\",\n \"notes\": \"Ambiguous: many posts are casual, but the lexicon also carries long-form posts and threads. Treated as creation; empty quote-posts (no text + record embed) are filtered at the consumer layer, not here.\"\n },\n \"app.bsky.feed.like\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.feed.repost\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.feed.generator\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Feed generator definition record, not personal activity.\"\n },\n \"app.bsky.graph.follow\": { \"tier\": \"action\", \"app\": \"bluesky\" },\n \"app.bsky.graph.block\": { \"tier\": \"filtered\", \"app\": \"bluesky\", \"notes\": \"Moderation record.\" },\n \"app.bsky.graph.mute\": { \"tier\": \"filtered\", \"app\": \"bluesky\", \"notes\": \"Moderation record.\" },\n \"app.bsky.graph.listblock\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Moderation record.\"\n },\n \"app.bsky.graph.listitem\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"List membership; rendered via the parent list, not as standalone activity.\"\n },\n \"app.bsky.graph.list\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"User-curated list metadata; not surfaced as profile activity.\"\n },\n \"app.bsky.graph.starterpack\": { \"tier\": \"filtered\", \"app\": \"bluesky\" },\n \"app.bsky.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"sh.tangled.repo\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.repo.issue\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.repo.pull\": { \"tier\": \"creation\", \"app\": \"tangled\" },\n \"sh.tangled.feed.star\": { \"tier\": \"action\", \"app\": \"tangled\" },\n \"sh.tangled.graph.follow\": { \"tier\": \"action\", \"app\": \"tangled\" },\n \"sh.tangled.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"tangled\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"community.lexicon.calendar.rsvp\": {\n \"tier\": \"creation\",\n \"app\": \"smokesignal\",\n \"notes\": \"Ambiguous: RSVPs are reactions to events, but they are public commitments and the only Smoke Signal record Sifa scans today. Classified as creation.\"\n },\n \"events.smokesignal.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"smokesignal\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"blue.flashes.feed.post\": { \"tier\": \"creation\", \"app\": \"flashes\" },\n\n \"social.grain.gallery\": { \"tier\": \"creation\", \"app\": \"grain\" },\n \"social.grain.gallery.item\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Item-within-gallery; rendered via parent gallery.\"\n },\n \"social.grain.photo\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Raw photo asset; surfaced via the gallery that references it.\"\n },\n \"social.grain.photo.exif\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"EXIF metadata for a photo.\"\n },\n \"social.grain.story\": {\n \"tier\": \"filtered\",\n \"app\": \"grain\",\n \"notes\": \"Ephemeral story format.\"\n },\n\n \"com.whtwnd.blog.entry\": { \"tier\": \"creation\", \"app\": \"whitewind\" },\n\n \"fyi.unravel.frontpage.post\": { \"tier\": \"creation\", \"app\": \"frontpage\" },\n \"fyi.unravel.frontpage.vote\": { \"tier\": \"action\", \"app\": \"frontpage\" },\n\n \"social.psky.feed.post\": { \"tier\": \"creation\", \"app\": \"picosky\" },\n\n \"link.pastesphere.snippet\": { \"tier\": \"creation\", \"app\": \"pastesphere\" },\n\n \"site.standard.document\": { \"tier\": \"creation\", \"app\": \"standard\" },\n\n \"computer.aetheros.page\": { \"tier\": \"creation\", \"app\": \"aetheros\" },\n\n \"space.roomy.space.personal\": { \"tier\": \"creation\", \"app\": \"roomy\" },\n\n \"dev.keytrace.claim\": { \"tier\": \"creation\", \"app\": \"keytrace\" },\n\n \"social.popfeed.feed.review\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.post\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.note\": { \"tier\": \"creation\", \"app\": \"popfeed\" },\n \"social.popfeed.feed.like\": { \"tier\": \"action\", \"app\": \"popfeed\" },\n \"social.popfeed.challenge.participation\": {\n \"tier\": \"filtered\",\n \"app\": \"popfeed\",\n \"notes\": \"Challenge participation tracking.\"\n },\n \"social.popfeed.actor.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"popfeed\",\n \"notes\": \"Profile metadata record.\"\n },\n\n \"place.stream.livestream\": { \"tier\": \"creation\", \"app\": \"streamplace\" },\n \"place.stream.broadcast.origin\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Broadcast origin/infrastructure record.\"\n },\n \"place.stream.key\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Stream key — sensitive infrastructure record.\"\n },\n \"place.stream.metadata.configuration\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Stream configuration metadata.\"\n },\n \"place.stream.chat.message\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Ephemeral chat message.\"\n },\n \"place.stream.chat.profile\": {\n \"tier\": \"filtered\",\n \"app\": \"streamplace\",\n \"notes\": \"Chat profile metadata.\"\n },\n\n \"app.sidetrail.trail\": { \"tier\": \"creation\", \"app\": \"semble\" },\n \"app.sidetrail.walk\": { \"tier\": \"creation\", \"app\": \"semble\" },\n\n \"at.youandme.connection\": { \"tier\": \"creation\", \"app\": \"youandme\" },\n\n \"pub.leaflet.comment\": { \"tier\": \"creation\", \"app\": \"leaflet\" },\n \"pub.leaflet.interactions.recommend\": { \"tier\": \"action\", \"app\": \"leaflet\" },\n \"pub.leaflet.authFullPermissions\": {\n \"tier\": \"filtered\",\n \"app\": \"leaflet\",\n \"notes\": \"OAuth permission record.\"\n },\n\n \"social.colibri.membership\": { \"tier\": \"creation\", \"app\": \"colibri\" },\n \"social.colibri.message\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Chat message — high-volume conversational signal, not portfolio.\"\n },\n \"social.colibri.reaction\": { \"tier\": \"filtered\", \"app\": \"colibri\", \"notes\": \"Chat reaction.\" },\n \"social.colibri.channel\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Channel definition.\"\n },\n \"social.colibri.community\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Community definition.\"\n },\n \"social.colibri.approval\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Moderation approval record.\"\n },\n \"social.colibri.category\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Category metadata.\"\n },\n \"social.colibri.channel.read\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Read-state marker.\"\n },\n \"social.colibri.actor.data\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Actor metadata.\"\n },\n \"social.colibri.richtext.facet\": {\n \"tier\": \"filtered\",\n \"app\": \"colibri\",\n \"notes\": \"Richtext facet sub-record.\"\n },\n\n \"app.collectivesocial.feed.list\": {\n \"tier\": \"creation\",\n \"app\": \"collectivesocial\",\n \"notes\": \"Auto-created default Inbox lists are filtered at the consumer layer via isDefault=true predicate.\"\n },\n\n \"net.alternativeproto.vote\": {\n \"tier\": \"action\",\n \"notes\": \"Vote record on a third-party protocol.\"\n },\n \"network.cosmik.collection\": {\n \"tier\": \"filtered\",\n \"notes\": \"Stale registry id — Cosmik formerly in app registry.\"\n },\n \"network.cosmik.collectionLink\": { \"tier\": \"filtered\" },\n \"network.cosmik.connection\": { \"tier\": \"filtered\" },\n \"network.cosmik.follow\": { \"tier\": \"filtered\" },\n \"network.cosmik.card\": { \"tier\": \"filtered\", \"notes\": \"Link-in-bio card; consumption signal.\" },\n\n \"social.pinksky.app.preference\": {\n \"tier\": \"filtered\",\n \"app\": \"bluesky\",\n \"notes\": \"Pinkleap (Bluesky client) app preferences.\"\n },\n\n \"at.margin.bookmark\": {\n \"tier\": \"filtered\",\n \"notes\": \"Bookmark — consumption signal, not creation.\"\n },\n \"at.margin.highlight\": {\n \"tier\": \"filtered\",\n \"notes\": \"Highlight — consumption signal, not creation.\"\n },\n \"community.lexicon.bookmarks.bookmark\": {\n \"tier\": \"filtered\",\n \"notes\": \"Bookmark — consumption signal.\"\n },\n \"blue.linkat.board\": { \"tier\": \"filtered\", \"notes\": \"Link-in-bio board; consumption signal.\" },\n\n \"dev.skyboard.board\": { \"tier\": \"filtered\", \"notes\": \"Skyboard task-board metadata.\" },\n \"dev.skyboard.op\": { \"tier\": \"filtered\", \"notes\": \"Skyboard operation log.\" },\n \"dev.skyboard.task\": { \"tier\": \"filtered\", \"notes\": \"Skyboard task record.\" },\n\n \"net.anisota.player.state\": { \"tier\": \"filtered\", \"notes\": \"Anisota game player state.\" },\n \"xyz.statusphere.status\": {\n \"tier\": \"filtered\",\n \"notes\": \"Statusphere emoji status — leisure signal.\"\n },\n\n \"id.sifa.profile.self\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Sifa professional profile root.\"\n },\n \"id.sifa.profile.position\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.education\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.skill\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.certification\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.project\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.volunteering\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.publication\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.course\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.honor\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.language\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.externalAccount\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.location\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.presentation\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.profile.presentationDelivery\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.endorsement\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Endorsement authored by the actor about another profile.\"\n },\n \"id.sifa.endorsement.confirmation\": {\n \"tier\": \"action\",\n \"app\": \"sifa\",\n \"notes\": \"Confirmation/acceptance of an endorsement received.\"\n },\n \"id.sifa.graph.follow\": { \"tier\": \"action\", \"app\": \"sifa\" },\n \"id.sifa.graph.connection\": {\n \"tier\": \"creation\",\n \"app\": \"sifa\",\n \"notes\": \"Mutual professional connection record.\"\n },\n \"id.sifa.project.self\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.project.member\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.project.membership\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.meeting\": { \"tier\": \"creation\", \"app\": \"sifa\" },\n \"id.sifa.authProfile\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authProfileAccess\": {\n \"tier\": \"filtered\",\n \"app\": \"sifa\",\n \"notes\": \"OAuth profile-access record.\"\n },\n \"id.sifa.authProject\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authConnection\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n \"id.sifa.authMeet\": { \"tier\": \"filtered\", \"app\": \"sifa\", \"notes\": \"OAuth scope record.\" },\n\n \"forum.barazo.post\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.community.member\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.reputation.event\": { \"tier\": \"creation\", \"app\": \"barazo\" },\n \"forum.barazo.reaction\": { \"tier\": \"action\", \"app\": \"barazo\" },\n \"forum.barazo.reply\": {\n \"tier\": \"action\",\n \"app\": \"barazo\",\n \"notes\": \"Short conversational reply — engagement signal.\"\n },\n \"forum.barazo.flag\": { \"tier\": \"filtered\", \"app\": \"barazo\", \"notes\": \"Moderation flag.\" }\n }\n}\n","import { z } from 'zod';\n\nimport rawTaxonomy from './activity-tiers.json' with { type: 'json' };\n\nexport type ActivityTier = 'creation' | 'action' | 'filtered';\n\nexport interface TierMeta {\n label: string | null;\n description: string;\n shownOnPublicProfile: boolean;\n}\n\nexport interface LexiconEntry {\n tier: ActivityTier;\n app?: string;\n notes?: string;\n}\n\nexport interface ActivityTaxonomy {\n version: string;\n updated: string;\n tiers: Record<ActivityTier, TierMeta>;\n lexicons: Record<string, LexiconEntry>;\n}\n\nconst tierMetaSchema = z.object({\n label: z.string().nullable(),\n description: z.string(),\n shownOnPublicProfile: z.boolean(),\n});\n\nconst lexiconEntrySchema = z.object({\n tier: z.enum(['creation', 'action', 'filtered']),\n app: z.string().optional(),\n notes: z.string().optional(),\n});\n\nconst taxonomySchema = z.object({\n version: z.string(),\n updated: z.string(),\n tiers: z.object({\n creation: tierMetaSchema,\n action: tierMetaSchema,\n filtered: tierMetaSchema,\n }),\n lexicons: z.record(z.string(), lexiconEntrySchema),\n});\n\nconst parsed: ActivityTaxonomy = taxonomySchema.parse(rawTaxonomy);\n\nexport const ACTIVITY_TIERS: Readonly<ActivityTaxonomy> = Object.freeze(parsed);\n\n/**\n * Returns the activity tier for a given AT Protocol NSID.\n * Returns 'filtered' for unknown/unclassified NSIDs (safe default — won't\n * leak unknown records to public profile surfaces).\n */\nexport function getActivityTier(nsid: string): ActivityTier {\n if (!nsid) return 'filtered';\n const entry = ACTIVITY_TIERS.lexicons[nsid];\n return entry ? entry.tier : 'filtered';\n}\n\n/**\n * Returns the full lexicon entry (tier + app + notes), or null if unknown.\n */\nexport function getLexiconEntry(nsid: string): LexiconEntry | null {\n if (!nsid) return null;\n const entry = ACTIVITY_TIERS.lexicons[nsid];\n return entry ?? null;\n}\n\n/**\n * Returns tier metadata (label, description, public visibility).\n */\nexport function getTierMeta(tier: ActivityTier): TierMeta {\n return ACTIVITY_TIERS.tiers[tier];\n}\n\n/**\n * Returns the taxonomy version + updated date for diagnostics and\n * version-skew detection between SDK consumers and the canonical taxonomy.\n */\nexport function getActivityTaxonomyVersion(): { version: string; updated: string } {\n return { version: ACTIVITY_TIERS.version, updated: ACTIVITY_TIERS.updated };\n}\n","/**\n * Presentation-role taxonomy. Mirrors `id.sifa.defs#presentationRole.knownValues`\n * from sifa-lexicons. The role describes how the person took part in a single\n * delivery (it can differ between deliveries of the same presentation).\n */\n\nexport interface PresentationRoleOption {\n value: string;\n label: string;\n}\n\nexport const PRESENTATION_ROLE_OPTIONS: PresentationRoleOption[] = [\n { value: 'id.sifa.defs#presenter', label: 'Presenter' },\n { value: 'id.sifa.defs#panelist', label: 'Panelist' },\n { value: 'id.sifa.defs#keynote', label: 'Keynote' },\n { value: 'id.sifa.defs#workshop', label: 'Workshop' },\n { value: 'id.sifa.defs#host', label: 'Host' },\n];\n\nexport const PRESENTATION_ROLE_LABELS: Record<string, string> = Object.fromEntries(\n PRESENTATION_ROLE_OPTIONS.map((o) => [o.value, o.label]),\n);\n\n/** Resolve a label for a presentation-role token. Falls back to the raw value. */\nexport function getPresentationRoleLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return PRESENTATION_ROLE_LABELS[value] ?? value;\n}\n","/**\n * Presentation link-type taxonomy. Mirrors\n * `id.sifa.defs#presentationLinkType.knownValues` from sifa-lexicons. Used to\n * pick an icon and a default label for a presentation or delivery link.\n */\n\nexport interface PresentationLinkTypeOption {\n value: string;\n label: string;\n}\n\nexport const PRESENTATION_LINK_TYPE_OPTIONS: PresentationLinkTypeOption[] = [\n { value: 'id.sifa.defs#linkSlides', label: 'Slides' },\n { value: 'id.sifa.defs#linkRecording', label: 'Recording' },\n { value: 'id.sifa.defs#linkEvent', label: 'Event page' },\n { value: 'id.sifa.defs#linkRegistration', label: 'Registration' },\n { value: 'id.sifa.defs#linkWriteup', label: 'Write-up' },\n { value: 'id.sifa.defs#linkOther', label: 'Link' },\n];\n\nexport const PRESENTATION_LINK_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n PRESENTATION_LINK_TYPE_OPTIONS.map((o) => [o.value, o.label]),\n);\n\n/** Resolve a label for a presentation link-type token. Falls back to the raw value. */\nexport function getPresentationLinkTypeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return PRESENTATION_LINK_TYPE_LABELS[value] ?? value;\n}\n","/**\n * Display labels for `community.lexicon.calendar.event` mode and status tokens.\n * A presentation delivery stores the full upstream token (so it stays faithful\n * to the source event); these maps turn the token into a human label.\n */\n\nexport const CALENDAR_EVENT_MODE_LABELS: Record<string, string> = {\n 'community.lexicon.calendar.event#inperson': 'In person',\n 'community.lexicon.calendar.event#virtual': 'Virtual',\n 'community.lexicon.calendar.event#hybrid': 'Hybrid',\n};\n\n/** Resolve a label for a calendar-event mode token. Falls back to the raw value. */\nexport function getCalendarEventModeLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return CALENDAR_EVENT_MODE_LABELS[value] ?? value;\n}\n\nexport const CALENDAR_EVENT_STATUS_LABELS: Record<string, string> = {\n 'community.lexicon.calendar.event#scheduled': 'Scheduled',\n 'community.lexicon.calendar.event#cancelled': 'Cancelled',\n 'community.lexicon.calendar.event#postponed': 'Postponed',\n 'community.lexicon.calendar.event#rescheduled': 'Rescheduled',\n 'community.lexicon.calendar.event#planned': 'Planned',\n};\n\n/** Resolve a label for a calendar-event status token. Falls back to the raw value. */\nexport function getCalendarEventStatusLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return CALENDAR_EVENT_STATUS_LABELS[value] ?? value;\n}\n","/**\n * Involvement-kind taxonomy. Mirrors `id.sifa.defs#involvementKind.knownValues`\n * from sifa-lexicons. `label` is the picker/select label; `heading` is the\n * profile section heading a record of this kind renders under (charity records,\n * including mapped legacy `volunteering`, render under \"Volunteering\").\n */\n\nexport interface InvolvementKindOption {\n value: string;\n label: string;\n heading: string;\n}\n\nexport const INVOLVEMENT_KIND_OPTIONS: InvolvementKindOption[] = [\n { value: 'id.sifa.defs#involvementOpenSource', label: 'Open source', heading: 'Open Source' },\n { value: 'id.sifa.defs#involvementCommunity', label: 'Community', heading: 'Community' },\n { value: 'id.sifa.defs#involvementCharity', label: 'Volunteering', heading: 'Volunteering' },\n { value: 'id.sifa.defs#involvementCivic', label: 'Civic', heading: 'Civic' },\n { value: 'id.sifa.defs#involvementOther', label: 'Other', heading: 'Other' },\n];\n\nexport const INVOLVEMENT_KIND_LABELS: Record<string, string> = Object.fromEntries(\n INVOLVEMENT_KIND_OPTIONS.map((o) => [o.value, o.label]),\n);\n\nexport const INVOLVEMENT_KIND_HEADINGS: Record<string, string> = Object.fromEntries(\n INVOLVEMENT_KIND_OPTIONS.map((o) => [o.value, o.heading]),\n);\n\n/** Resolve the select label for an involvement-kind token. Falls back to the raw value. */\nexport function getInvolvementKindLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return INVOLVEMENT_KIND_LABELS[value] ?? value;\n}\n\n/**\n * Resolve the display-section heading for an involvement-kind token. Unknown\n * kinds (including a future token an older client hasn't learned) fall under\n * \"Other\" so a record is never dropped from the profile.\n */\nexport function getInvolvementKindHeading(value: string | undefined | null): string {\n if (!value) return 'Other';\n return INVOLVEMENT_KIND_HEADINGS[value] ?? 'Other';\n}\n","/**\n * Artifact-link-kind taxonomy. Mirrors the bare-string `knownValues` of\n * `id.sifa.defs#artifactLink.kind` from sifa-lexicons. Open set: any string is\n * valid; these are the recognized kinds used to pick an icon and a default label.\n */\n\nexport interface ArtifactLinkKindOption {\n value: string;\n label: string;\n}\n\nexport const ARTIFACT_LINK_KIND_OPTIONS: ArtifactLinkKindOption[] = [\n { value: 'pull-request', label: 'Pull request' },\n { value: 'issue', label: 'Issue' },\n { value: 'commit', label: 'Commit' },\n { value: 'review', label: 'Review' },\n { value: 'release', label: 'Release' },\n { value: 'talk', label: 'Talk' },\n { value: 'video', label: 'Video' },\n { value: 'slides', label: 'Slides' },\n { value: 'article', label: 'Article' },\n { value: 'thread', label: 'Thread' },\n { value: 'dataset', label: 'Dataset' },\n { value: 'edit', label: 'Edit' },\n { value: 'other', label: 'Link' },\n];\n\nexport const ARTIFACT_LINK_KIND_LABELS: Record<string, string> = Object.fromEntries(\n ARTIFACT_LINK_KIND_OPTIONS.map((o) => [o.value, o.label]),\n);\n\n/** Resolve a label for an artifact-link-kind value. Falls back to the raw value. */\nexport function getArtifactLinkKindLabel(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n return ARTIFACT_LINK_KIND_LABELS[value] ?? value;\n}\n","/**\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","// Connector words kept lowercase in a title unless they lead the name. Includes\n// a few common non-English ones (Dutch/German/French/Spanish) since the company\n// data is international.\nconst SMALL_WORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'the',\n 'of',\n 'for',\n 'to',\n 'in',\n 'on',\n 'at',\n 'by',\n 'or',\n 'nor',\n 'but',\n 'as',\n 'vs',\n 'via',\n 'with',\n 'de',\n 'del',\n 'van',\n 'von',\n 'der',\n 'den',\n 'het',\n 'la',\n 'le',\n 'y',\n]);\n\n/**\n * True when `value` contains at least one letter outside the ASCII range\n * (accented Latin, Cyrillic, Greek, CJK, Turkish dotted/dotless i, etc).\n *\n * Iterating by code point (not `.length`) matters for astral-plane\n * characters (e.g. some CJK), which are represented as surrogate pairs.\n */\nexport function hasNonAsciiLetter(value: string): boolean {\n for (const char of value) {\n const codePoint = char.codePointAt(0) ?? 0;\n if (codePoint > 0x7f && /\\p{L}/u.test(char)) return true;\n }\n return false;\n}\n\nfunction capitalizeWord(word: string): string {\n // Uppercase the first letter/digit, leaving any leading punctuation\n // (quotes, parens) and the rest of the word untouched.\n return word.replace(\n /^([^\\p{L}\\p{N}]*)(\\p{L})/u,\n (_m, lead: string, ch: string) => lead + ch.toUpperCase(),\n );\n}\n\n/**\n * Best-effort title-case for a company display name.\n *\n * Company names from the PDL crawl are stored all-lowercase (\"spryker\",\n * \"spryker systems gmbh\"), which reads poorly in the UI. This capitalizes them\n * for display. Names that already carry any uppercase (ROR / Wikidata, e.g.\n * \"University of Testing\" or \"IBM\") are assumed correctly cased and returned\n * unchanged, so a proper name is never mangled (\"University Of Testing\").\n *\n * It is intentionally not a canonicalizer: acronyms it can't know about stay\n * word-cased (\"gmbh\" -> \"Gmbh\"). The user's own custom display name is the\n * escape hatch when the heuristic is wrong.\n *\n * Scoped to ASCII-Latin case-bearing strings (decision D8): any name\n * containing a non-ASCII letter (accented Latin, Cyrillic, Greek, CJK,\n * Turkish dotted/dotless i, etc) is returned unchanged. Locale-dependent\n * casing rules (Turkish i/İ vs ı/I is the canonical trap) make naive\n * `toUpperCase`/`toLowerCase` unsafe outside ASCII, and this formatter has\n * no reliable way to pick the right locale for an arbitrary company name.\n *\n * Known limitation: this does not (and cannot) distinguish an intentional\n * all-lowercase ASCII wordmark (\"adidas\", \"thyssenkrupp\") from a\n * PDL-lowercased name that should be title-cased (\"spryker\" -> \"Spryker\").\n * Both are pure ASCII, so both still get title-cased. See sifa-workspace#235.\n */\nexport function formatCompanyName(name: string): string {\n const trimmed = name.trim();\n if (!trimmed || hasNonAsciiLetter(trimmed) || trimmed !== trimmed.toLowerCase()) return trimmed;\n\n let seenWord = false;\n // Split on whitespace but keep the separators so original spacing survives.\n return trimmed\n .split(/(\\s+)/)\n .map((token) => {\n if (token.length === 0 || /^\\s+$/.test(token)) return token;\n const isFirst = !seenWord;\n seenWord = true;\n if (!isFirst && SMALL_WORDS.has(token)) return token;\n return capitalizeWord(token);\n })\n .join('');\n}\n","import { hasNonAsciiLetter } from './company-name.js';\n\n/**\n * Canonical casing for common legal-form designators, keyed by the token with\n * its dots stripped and lowercased (`n.v.` and `nv` both key to `nv`). The value\n * is the canonical LETTER sequence only -- dots are re-applied from the input, so\n * `n.v.` -> `N.V.` and `nv` -> `NV` from the single `nv` entry.\n *\n * Deliberately conservative. Designators whose canonical casing genuinely\n * depends on the dot style (Italian `srl`/`S.r.l.`, `spa`/`S.p.A.`) are OMITTED\n * rather than guessed -- see the module doc on `normalizeLegalForm`. Multi-word\n * forms (`Sp. z o.o.`, `Pty Ltd`) are out of scope for this single-token pass.\n */\nconst CANONICAL_LEGAL_FORMS: Readonly<Record<string, string>> = {\n llc: 'LLC',\n inc: 'Inc',\n ltd: 'Ltd',\n ltda: 'Ltda',\n corp: 'Corp',\n co: 'Co',\n plc: 'PLC',\n llp: 'LLP',\n lp: 'LP',\n gmbh: 'GmbH',\n ag: 'AG',\n ab: 'AB',\n as: 'AS',\n aps: 'ApS',\n oy: 'Oy',\n oyj: 'Oyj',\n nv: 'NV',\n bv: 'BV',\n sa: 'SA',\n sas: 'SAS',\n sarl: 'SARL',\n kk: 'KK',\n sl: 'SL',\n pty: 'Pty',\n};\n\n/**\n * Re-apply `canonical`'s casing onto `token`, letter by letter, keeping every\n * non-letter character (the dots) exactly where the input had them. `token` is\n * guaranteed ASCII (the caller bailed on non-ASCII names) and its letter count\n * equals `canonical.length`, so the index never runs past the end.\n */\nfunction recase(token: string, canonical: string): string {\n let li = 0;\n let out = '';\n for (const ch of token) {\n if (/[A-Za-z]/.test(ch)) {\n out += canonical.charAt(li);\n li += 1;\n } else {\n out += ch;\n }\n }\n return out;\n}\n\n/** Normalize one candidate token, or return it unchanged if it isn't a designator. */\nfunction normalizeToken(token: string): string {\n // Strip dots only; a clean designator token is then a pure ASCII-letter run.\n // A hyphen, comma, paren, or digit means it isn't a bare designator -> skip.\n const letters = token.replace(/\\./g, '');\n if (!/^[A-Za-z]+$/.test(letters)) return token;\n\n const key = letters.toLowerCase();\n const canonical = CANONICAL_LEGAL_FORMS[key];\n // Require a string value, not merely truthy: a bare `map[key]` lookup resolves\n // inherited Object.prototype members, so a token like \"Constructor\" (key\n // `constructor`) or \"__proto__\" returns a function/object that is truthy but\n // not a string, and `recase` would then throw on `.charAt`. This also narrows\n // away the `undefined` from a missing key.\n if (typeof canonical !== 'string') return token;\n\n return recase(token, canonical);\n}\n\n/**\n * Normalize the letter-case of a legal-form designator (GmbH, LLC, N.V., B.V.,\n * S.A., ...) appearing as the trailing whole-word token of a company\n * name. Only that one token is touched; the company name itself is never\n * recased, since brand-wordmark casing is not deterministic (see\n * sifa-workspace#235, deliberately distinct from this pass).\n *\n * The input's dot and spacing style is preserved verbatim -- dotted vs undotted\n * (`N.V.` vs `NV`) is a style choice, so the function never adds, removes, or\n * reorders dots. It only maps `gmbh`/`Gmbh`/`GMBH` -> `GmbH`, `nv` -> `NV`,\n * `n.v.` -> `N.V.`, and so on.\n *\n * Scoped to ASCII-Latin (decision D8, matching `formatCompanyName`): any name\n * containing a non-ASCII letter is returned unchanged, because locale-dependent\n * casing (Turkish i/İ) makes naive upper/lower unsafe. Idempotent: normalizing\n * an already-correct name is a no-op.\n */\nexport function normalizeLegalForm(name: string): string {\n if (!name || hasNonAsciiLetter(name)) return name;\n\n // Split into words and whitespace runs, keeping the separators so the exact\n // original spacing (including leading/trailing) survives the round-trip.\n const parts = name.split(/(\\s+)/);\n const wordIndices: number[] = [];\n for (let i = 0; i < parts.length; i += 1) {\n const part = parts[i];\n if (part !== undefined && part.length > 0 && !/^\\s+$/.test(part)) wordIndices.push(i);\n }\n if (wordIndices.length === 0) return name;\n\n const lastIdx = wordIndices[wordIndices.length - 1];\n if (lastIdx === undefined) return name;\n // Only the TRAILING token is a candidate. Legal-form designators almost always\n // trail the company name (Acme GmbH, Halma PLC); a LEADING designator token is\n // far more likely part of the brand (\"INC Research\", \"AG Innovations\"), so\n // recasing it would corrupt the name. Restricting to the trailing token avoids\n // that whole class of false positives.\n const original = parts[lastIdx];\n if (original === undefined) return name;\n const rewritten = normalizeToken(original);\n if (rewritten === original) return name;\n parts[lastIdx] = rewritten;\n return parts.join('');\n}\n","// Combining diacritical marks (U+0300-U+036F) produced by NFD decomposition.\n// Stripping these after decomposing is the standard way to fold \"é\" -> \"e\"\n// without a per-character lookup table.\nconst COMBINING_MARKS = /[\\u0300-\\u036f]/g;\n\n/**\n * Build a stable dedup/prefix key for a company name (decision D8).\n *\n * NFC-normalizes, case-folds, and strips Latin diacritics so that visually\n * or logically equivalent spellings collapse to one key: \"Nestlé\", \"Nestle\",\n * and \"NESTLE\" all produce the same value. Non-Latin scripts (Cyrillic, CJK,\n * etc) have no Latin diacritics to strip, so they pass through case-folded\n * and NFC-normalized only.\n *\n * This is a pure SDK helper for the in-memory/dedup key. Persisting it as a\n * dedicated column on the sifa-api side is tracked separately\n * (sifa-workspace#229) and out of scope here.\n */\nexport function normalizeCompanyKey(name: string): string {\n const trimmed = name.trim();\n if (!trimmed) return '';\n\n const caseFolded = trimmed.normalize('NFC').toLowerCase();\n return caseFolded.normalize('NFD').replace(COMBINING_MARKS, '').normalize('NFC');\n}\n","/**\n * Format a date string as a relative time (e.g. \"5m ago\", \"3d ago\").\n * Returns an empty string for invalid or future dates.\n */\nexport function formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n if (isNaN(date.getTime())) return '';\n\n const now = Date.now();\n const diffMs = now - date.getTime();\n if (diffMs < 0) return '';\n\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n\n const months = Math.floor(days / 30);\n if (months < 12) return `${months}mo ago`;\n\n const years = Math.floor(months / 12);\n return `${years}y ago`;\n}\n","import type { PresentationDuration } from '../schemas/profile-presentation.js';\n\n/**\n * Format a presentation duration for display. A fixed length renders as\n * \"30 min\"; a range renders as \"20-30 min\". Returns undefined when there is no\n * duration. A range whose bounds are equal, or whose max is missing, renders as\n * a single value.\n */\nexport function formatPresentationDuration(\n duration: PresentationDuration | undefined | null,\n): string | undefined {\n if (!duration) return undefined;\n const { minMinutes, maxMinutes } = duration;\n if (maxMinutes != null && maxMinutes !== minMinutes) {\n return `${minMinutes}-${maxMinutes} min`;\n }\n return `${minMinutes} min`;\n}\n","/**\n * Server-safe timeline date formatters shared by every profile surface.\n */\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n/** Format \"2007-01\" as \"Jan 2007\", pass through year-only strings. */\nexport function formatTimelineDate(dateStr: string): string {\n if (dateStr.length === 4) return dateStr;\n const [year, month] = dateStr.split('-');\n if (!month) return year ?? dateStr;\n const idx = parseInt(month, 10) - 1;\n return `${MONTHS[idx]} ${year}`;\n}\n\n/**\n * Format a date range for display. Handles missing dates, equal start/end,\n * and ongoing entries (showPresent defaults to true).\n */\nexport function formatDateRange(start?: string, end?: string, showPresent = true): string {\n if (!start && !end) return '';\n if (!start) return end ? formatTimelineDate(end) : '';\n const formattedStart = formatTimelineDate(start);\n if (!end) return showPresent ? `${formattedStart} - Present` : formattedStart;\n const formattedEnd = formatTimelineDate(end);\n if (formattedStart === formattedEnd) return formattedStart;\n return `${formattedStart} - ${formattedEnd}`;\n}\n","import type { ProfilePresentationDelivery } from '../types/index.js';\n\nconst CANCELLED_STATUS = 'community.lexicon.calendar.event#cancelled';\nconst KEYNOTE_ROLE = 'id.sifa.defs#keynote';\n\n/** A compact roll-up of a presentation's deliveries for the collapsed view. */\nexport interface PresentationDeliverySummary {\n /** Times the talk was actually delivered (cancelled occasions excluded). */\n count: number;\n /** Most recent year among counted deliveries that carry a date. */\n recentYear?: number;\n /** How many counted deliveries were keynotes. */\n keynoteCount: number;\n /** Up to `venueLimit` distinct event names, most-recent first. */\n venues: string[];\n /** Distinct counted venues beyond the ones listed in `venues`. */\n moreVenues: number;\n}\n\n/**\n * Summarize a talk's delivery history into the signals the profile shows in the\n * collapsed view: how many times it was given, the most recent year, how many\n * were keynotes, and a small sample of the most recent distinct venues.\n *\n * Cancelled occasions are excluded from every figure: a talk that was booked\n * then cancelled was not actually delivered, and counting it would inflate the\n * \"given Nx\" signal.\n */\nexport function summarizePresentationDeliveries(\n deliveries: ProfilePresentationDelivery[] | undefined,\n options: { venueLimit?: number } = {},\n): PresentationDeliverySummary {\n const venueLimit = options.venueLimit ?? 3;\n const counted = (deliveries ?? []).filter((delivery) => delivery.status !== CANCELLED_STATUS);\n const sorted = [...counted].sort((a, b) => (b.date ?? '').localeCompare(a.date ?? ''));\n\n let recentYear: number | undefined;\n for (const delivery of counted) {\n if (!delivery.date) continue;\n const year = Number(delivery.date.slice(0, 4));\n if (!Number.isNaN(year) && (recentYear === undefined || year > recentYear)) {\n recentYear = year;\n }\n }\n\n const seen = new Set<string>();\n const distinctVenues: string[] = [];\n for (const delivery of sorted) {\n const name = delivery.eventName?.trim();\n if (name && !seen.has(name)) {\n seen.add(name);\n distinctVenues.push(name);\n }\n }\n const venues = distinctVenues.slice(0, venueLimit);\n\n return {\n count: counted.length,\n recentYear,\n keynoteCount: counted.filter((delivery) => delivery.role === KEYNOTE_ROLE).length,\n venues,\n moreVenues: distinctVenues.length - venues.length,\n };\n}\n","/**\n * Sort profile section items from newest to oldest.\n *\n * Rules:\n * - Items with no end date (ongoing/current) sort to the top.\n * - Primary sort: end date descending (newest first).\n * - Secondary sort: start date descending (newest first).\n * - Items with no dates sort to the bottom.\n *\n * Date strings are ISO-ish (\"2024\", \"2024-03\", \"2024-03-15\") and\n * lexicographic comparison works correctly for them.\n */\n\ninterface DateRange {\n startDate?: string;\n endDate?: string;\n current?: boolean;\n}\n\ntype DateExtractor<T> = (item: T) => DateRange;\n\nconst FAR_FUTURE = '9999-12-31';\nconst FAR_PAST = '0000-01-01';\n\nexport function sortByDateDesc<T>(items: T[], extract: DateExtractor<T>): T[] {\n return [...items].sort((a, b) => {\n const da = extract(a);\n const db = extract(b);\n\n const endA = da.current ? FAR_FUTURE : (da.endDate ?? '');\n const endB = db.current ? FAR_FUTURE : (db.endDate ?? '');\n\n // Items with any date beat items with no dates at all\n const hasDateA = endA || da.startDate;\n const hasDateB = endB || db.startDate;\n if (hasDateA && !hasDateB) return -1;\n if (!hasDateA && hasDateB) return 1;\n\n // Primary: end date descending\n if (endA !== endB) return endB.localeCompare(endA);\n\n // Secondary: start date descending\n const startA = da.startDate ?? FAR_PAST;\n const startB = db.startDate ?? FAR_PAST;\n return startB.localeCompare(startA);\n });\n}\n\n/**\n * Convenience extractor for items that use `startDate` / `endDate` fields directly.\n * Used by volunteering, projects, and other sections that still use startDate/endDate.\n */\nexport function dateRangeExtractor<\n T extends { startDate?: string; endDate?: string; current?: boolean },\n>(item: T): DateRange {\n return { startDate: item.startDate, endDate: item.endDate, current: item.current };\n}\n\n/**\n * Extractor for lexicon-aligned items that use `startedAt` / `endedAt` fields.\n * Used by positions and education (current derived from !endedAt).\n */\nexport function lexiconDateExtractor<T extends { startedAt?: string; endedAt?: string }>(\n item: T,\n): DateRange {\n return { startDate: item.startedAt, endDate: item.endedAt, current: !item.endedAt };\n}\n\n/**\n * Convenience extractor for items with a single `date` field.\n */\nexport function singleDateExtractor<T extends { date?: string }>(item: T): DateRange {\n return { endDate: item.date };\n}\n\n/**\n * Extractor for certifications which use `issueDate` / `expiryDate`.\n */\nexport function certDateExtractor<T extends { issueDate?: string; expiryDate?: string }>(\n item: T,\n): DateRange {\n return { startDate: item.issueDate, endDate: item.expiryDate ?? item.issueDate };\n}\n","/**\n * Sanitize raw user input into a valid AT Protocol identifier (handle or DID).\n *\n * Handles common mistakes:\n * - Pasting a full Bluesky profile URL\n * - Pasting a raw HTTPS URL to a PDS domain\n * - Using an at:// URI\n * - Prefixing with @\n * - Entering a bare username without .bsky.social\n */\nexport function sanitizeHandleInput(raw: string): string {\n let identifier = raw\n .trim()\n .replace(/^https?:\\/\\/bsky\\.app\\/profile\\//i, '')\n .replace(/^at:\\/\\//i, '')\n .replace(/^@/, '')\n .replace(/^https?:\\/\\//i, '');\n if (!identifier.startsWith('did:')) {\n identifier = identifier.split('/')[0] ?? identifier;\n }\n identifier = identifier.replace(/\\.$/, '');\n if (!identifier.startsWith('did:')) {\n identifier = identifier.toLowerCase();\n }\n\n // Auto-append .bsky.social for bare usernames (no dots, not a DID)\n if (identifier && !identifier.startsWith('did:') && !identifier.includes('.')) {\n identifier = `${identifier}.bsky.social`;\n }\n\n return identifier;\n}\n","import type { LocationValue } from '../types/index.js';\n\n/**\n * Format a LocationValue for display.\n *\n * Prefers `locality` (the community.lexicon.location.address field) and\n * falls back to the legacy `city` slot so values produced before the\n * sifa-api alias migration still render correctly during the additive\n * transition window.\n */\nexport function formatLocation(loc: LocationValue | null | undefined): string {\n if (!loc) return '';\n const locality = loc.locality ?? loc.city;\n const parts = [locality, loc.region, loc.country].filter(Boolean);\n if (loc.postalCode && !locality) {\n return `${loc.postalCode}, ${loc.country}`;\n }\n return parts.join(', ');\n}\n\n/** Parse a display string back into a LocationValue (best-effort for legacy data) */\nexport function parseLocationString(str: string): LocationValue | null {\n if (!str.trim()) return null;\n const parts = str\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length >= 3) {\n return {\n city: parts[0],\n region: parts[1],\n country: parts[parts.length - 1]!,\n };\n }\n if (parts.length === 2) {\n return {\n city: parts[0],\n country: parts[1]!,\n };\n }\n return { country: parts[0]! };\n}\n\n/** Convert ISO 3166-1 alpha-2 country code to flag emoji */\nexport function countryCodeToFlag(code: string | undefined): string {\n if (!code || code.length !== 2) return '';\n const upper = code.toUpperCase();\n const a = upper.codePointAt(0);\n const b = upper.codePointAt(1);\n if (a === undefined || b === undefined) return '';\n return String.fromCodePoint(a - 0x41 + 0x1f1e6, b - 0x41 + 0x1f1e6);\n}\n","import type { PdsProviderInfo } from '../types/index.js';\n\nexport interface PdsProvider {\n name: string;\n profileUrl: string;\n host?: string;\n}\n\nconst BSKY_PROFILE_BASE = 'https://bsky.app/profile/';\n\nconst PDS_PROVIDERS: { suffix: string; name: string }[] = [\n { suffix: '.bsky.social', name: 'bluesky' },\n { suffix: '.blacksky.app', name: 'blacksky' },\n { suffix: '.eurosky.social', name: 'eurosky' },\n { suffix: '.northsky.social', name: 'northsky' },\n];\n\nconst KNOWN_PROVIDER_NAMES = new Set(PDS_PROVIDERS.map((p) => p.name));\n\nconst ICON_ONLY_PROVIDERS = new Set(['selfhosted-social', 'selfhosted']);\n\nexport function pdsProviderFromApi(\n apiProvider: PdsProviderInfo | null | undefined,\n handle: string,\n): PdsProvider | null {\n if (!apiProvider) return null;\n if (ICON_ONLY_PROVIDERS.has(apiProvider.name)) {\n return { name: apiProvider.name, profileUrl: '', host: apiProvider.host };\n }\n if (!KNOWN_PROVIDER_NAMES.has(apiProvider.name)) return null;\n return {\n name: apiProvider.name,\n profileUrl: `${BSKY_PROFILE_BASE}${handle}`,\n host: apiProvider.host,\n };\n}\n\nexport function getHandleStem(handle: string): string {\n const lower = handle.toLowerCase();\n for (const provider of PDS_PROVIDERS) {\n if (lower.endsWith(provider.suffix) && lower.length > provider.suffix.length) {\n return handle.slice(0, -provider.suffix.length);\n }\n }\n return handle;\n}\n\nexport function getDisplayLabel(displayName: string | undefined, handle: string): string {\n if (displayName) return displayName;\n return getHandleStem(handle);\n}\n\n/**\n * Combine optional structured name fields (`id.sifa.profile.self.givenName`,\n * `familyName`) into a single string in Schema.org `Person` order — given\n * before family. Returns `undefined` when both are absent so callers can\n * fall back to `displayName`. Whitespace-only inputs are treated as absent.\n * Does not impose cultural ordering: users whose preferred presentation\n * differs (e.g. Eastern name order) should set `displayName` accordingly,\n * which this helper deliberately does not consult.\n */\nexport function formatStructuredName(\n givenName: string | undefined,\n familyName: string | undefined,\n): string | undefined {\n const given = givenName?.trim();\n const family = familyName?.trim();\n if (given && family) return `${given} ${family}`;\n return given || family || undefined;\n}\n\nconst PDS_DISPLAY_NAMES: Record<string, string> = {\n bluesky: 'Bluesky',\n blacksky: 'BlackSky',\n eurosky: 'EuroSky',\n northsky: 'NorthSky',\n 'selfhosted-social': 'Self-hosted',\n selfhosted: 'Self-hosted',\n};\n\nexport function getPdsDisplayName(providerName: string): string {\n return PDS_DISPLAY_NAMES[providerName] ?? providerName;\n}\n\nexport function detectPdsProvider(handle: string): PdsProvider | null {\n const lower = handle.toLowerCase();\n for (const provider of PDS_PROVIDERS) {\n if (lower.endsWith(provider.suffix)) {\n return {\n name: provider.name,\n profileUrl: `${BSKY_PROFILE_BASE}${handle}`,\n };\n }\n }\n return null;\n}\n","/**\n * Resolve a slide / video URL to an embed descriptor. Pure and offline.\n *\n * Three outcomes:\n * - `iframe`: the URL carries everything an embed needs, so the iframe `src` is\n * known offline (YouTube, Vimeo, Google Slides, Loom, Canva).\n * - `oembed`: the URL is a known embeddable provider whose iframe `src` is NOT\n * in the URL and needs a server-side oEmbed lookup (SlideShare, SpeakerDeck\n * public deck URLs). The caller resolves the src via its own oEmbed step.\n * - `link`: not embeddable; render a plain link.\n */\n\n/**\n * A resolved embed: an iframe whose src is known offline, an `oembed` provider\n * whose src needs a server lookup (carries the original page URL), or a plain\n * link.\n */\nexport type EmbedResult =\n | { kind: 'iframe'; provider: string; src: string; aspectRatio: '16:9' | '4:3' }\n | { kind: 'oembed'; provider: string; aspectRatio: '16:9' | '4:3'; pageUrl: string }\n | { kind: 'link' };\n\nconst LINK: EmbedResult = { kind: 'link' };\n\n/** YouTube video IDs: 11 chars in practice, but accept the documented charset. */\nconst YOUTUBE_ID = /^[A-Za-z0-9_-]{6,}$/;\n\n/**\n * Extract a YouTube video id from any recognized YouTube URL (`youtu.be/ID`,\n * `youtube.com/watch?v=ID`, `/embed/ID`, `/shorts/ID`), or null. Pure/offline.\n */\nexport function youtubeVideoId(url: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n if (parsed.protocol !== 'https:') return null;\n const host = bareHost(parsed.hostname);\n const segments = parsed.pathname.split('/').filter(Boolean);\n let id: string | null = null;\n if (host === 'youtu.be') id = segments[0] ?? null;\n else if (host === 'youtube.com' || host === 'm.youtube.com') {\n if (parsed.pathname === '/watch') id = parsed.searchParams.get('v');\n else if (segments[0] === 'embed' || segments[0] === 'shorts') id = segments[1] ?? null;\n }\n return id && YOUTUBE_ID.test(id) ? id : null;\n}\n\n/**\n * The public thumbnail URL for a YouTube video id (`i.ytimg.com`). Derivable\n * offline. NOTE: this host is Google — never load it directly in a privacy\n * context; fetch and re-serve it from your own origin.\n */\nexport function youtubeThumbnailUrl(videoId: string): string {\n return `https://i.ytimg.com/vi/${videoId}/hqdefault.jpg`;\n}\n\n/** Strip a leading `www.` so host matching is scheme/subdomain tolerant. */\nfunction bareHost(hostname: string): string {\n return hostname.toLowerCase().replace(/^www\\./, '');\n}\n\n/**\n * Recognize an embeddable URL and return its iframe descriptor, else a link.\n * Only https URLs are accepted.\n */\nexport function resolveEmbed(url: string): EmbedResult {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return LINK;\n }\n if (parsed.protocol !== 'https:') return LINK;\n\n const host = bareHost(parsed.hostname);\n const segments = parsed.pathname.split('/').filter(Boolean);\n\n // --- YouTube -> privacy-enhanced nocookie embed ---\n if (host === 'youtu.be' || host === 'youtube.com' || host === 'm.youtube.com') {\n const id = youtubeVideoId(url);\n return id ? youtubeEmbed(id) : LINK;\n }\n\n // --- Vimeo ---\n if (host === 'vimeo.com') {\n const id = segments[0];\n if (id && /^\\d+$/.test(id)) {\n return {\n kind: 'iframe',\n provider: 'vimeo',\n src: `https://player.vimeo.com/video/${id}`,\n aspectRatio: '16:9',\n };\n }\n return LINK;\n }\n if (host === 'player.vimeo.com') {\n if (segments[0] === 'video' && segments[1] && /^\\d+$/.test(segments[1])) {\n return {\n kind: 'iframe',\n provider: 'vimeo',\n src: `https://player.vimeo.com/video/${segments[1]}`,\n aspectRatio: '16:9',\n };\n }\n return LINK;\n }\n\n // --- SpeakerDeck ---\n // An already-resolved `speakerdeck.com/player/HEXID` embed URL is embeddable\n // offline. A public `speakerdeck.com/USER/SLUG` deck URL needs a server oEmbed\n // lookup for the data-id, so it is `oembed`, not a dead link.\n if (host === 'speakerdeck.com') {\n if (segments[0] === 'player' && segments[1]) {\n return { kind: 'iframe', provider: 'speakerdeck', src: parsed.href, aspectRatio: '4:3' };\n }\n if (segments.length >= 2) {\n return { kind: 'oembed', provider: 'speakerdeck', aspectRatio: '4:3', pageUrl: parsed.href };\n }\n return LINK;\n }\n\n // --- SlideShare ---\n // An already-resolved `slideshow/embed_code/...` URL is embeddable offline. A\n // public deck URL needs a server oEmbed lookup for the embed_code id, so it is\n // `oembed`.\n if (host === 'slideshare.net') {\n if (segments[0] === 'slideshow' && segments[1] === 'embed_code') {\n return { kind: 'iframe', provider: 'slideshare', src: parsed.href, aspectRatio: '4:3' };\n }\n if (segments.length >= 2) {\n return { kind: 'oembed', provider: 'slideshare', aspectRatio: '4:3', pageUrl: parsed.href };\n }\n return LINK;\n }\n\n // --- Google Slides ---\n if (host === 'docs.google.com') {\n if (segments[0] === 'presentation' && segments[1] === 'd' && segments[2]) {\n return {\n kind: 'iframe',\n provider: 'googleslides',\n src: `https://docs.google.com/presentation/d/${segments[2]}/embed`,\n aspectRatio: '16:9',\n };\n }\n return LINK;\n }\n\n // --- Loom ---\n if (host === 'loom.com') {\n if (segments[0] === 'share' && segments[1]) {\n return {\n kind: 'iframe',\n provider: 'loom',\n src: `https://www.loom.com/embed/${segments[1]}`,\n aspectRatio: '16:9',\n };\n }\n return LINK;\n }\n\n // --- Canva ---\n if (host === 'canva.com') {\n if (segments[0] === 'design' && segments[1] && segments[2] === 'view') {\n return {\n kind: 'iframe',\n provider: 'canva',\n src: `https://www.canva.com/design/${segments[1]}/view?embed`,\n aspectRatio: '16:9',\n };\n }\n return LINK;\n }\n\n return LINK;\n}\n\nfunction youtubeEmbed(id: string): EmbedResult {\n return {\n kind: 'iframe',\n provider: 'youtube',\n src: `https://www.youtube-nocookie.com/embed/${id}`,\n aspectRatio: '16:9',\n };\n}\n","/**\n * Slug helpers for talk-page URLs. Pure and offline: a talk page lives at a\n * path like `/{slug}-{rkey}`, where the slug is a human-readable, SEO-friendly\n * rendering of the title and the rkey is the record's stable identifier.\n * Because TIDs never contain a `-`, the rkey can always be recovered as the\n * substring after the final `-`.\n */\n\n/** Maximum slug length before the trailing rkey is appended. */\nconst MAX_SLUG_LENGTH = 60;\n\n/** Combining diacritical marks left behind by NFKD decomposition (U+0300–U+036F). */\nconst COMBINING_MARKS = /[̀-ͯ]/g;\n\n/**\n * Render a title as a URL slug: lowercased, diacritics stripped, runs of\n * non-alphanumerics collapsed to a single `-`, trimmed, and capped at 60 chars.\n * Returns `''` for an empty or whitespace-only title.\n */\nexport function slugifyTitle(title: string): string {\n const slug = title\n .normalize('NFKD')\n // Strip combining marks left by NFKD decomposition (é -> e).\n .replace(COMBINING_MARKS, '')\n .toLowerCase()\n // Collapse any run of non-alphanumerics into a single hyphen.\n .replace(/[^a-z0-9]+/g, '-')\n // Collapse repeated hyphens.\n .replace(/-+/g, '-')\n // Trim leading/trailing hyphens.\n .replace(/^-+|-+$/g, '');\n // Cap length, then trim a trailing hyphen the cut may have exposed.\n return slug.slice(0, MAX_SLUG_LENGTH).replace(/-+$/g, '');\n}\n\n/**\n * Build the talk-page path segment `${slug}-${rkey}`, or just `rkey` when the\n * title produces an empty slug.\n */\nexport function buildTalkSlug(title: string, rkey: string): string {\n const slug = slugifyTitle(title);\n return slug ? `${slug}-${rkey}` : rkey;\n}\n\n/**\n * Recover the rkey from a talk-page segment: the substring after the final `-`\n * (TIDs contain no `-`). Returns the whole segment when there is no `-`.\n */\nexport function parseTalkRkey(segment: string): string {\n const idx = segment.lastIndexOf('-');\n return idx === -1 ? segment : segment.slice(idx + 1);\n}\n","const COMBINING_MARK = /\\p{M}/u;\nconst BIDI_CONTROLS = /[--]/gu;\n\n/**\n * Limit runs of Unicode combining marks (`\\p{M}`) to at most `maxPerBase`\n * marks following any single base character. Defuses \"Zalgo\" text where\n * dozens of stacked combining marks render outside the line box and bleed\n * into neighbouring UI.\n *\n * `maxPerBase` defaults to 4 — high enough to preserve legitimate stacks\n * in Thai, Arabic, Vietnamese, and IPA, low enough to neutralise the\n * vertical-overflow attack vector.\n */\nexport function limitCombiningMarks(value: string, maxPerBase = 4): string {\n if (!value || !COMBINING_MARK.test(value)) return value;\n\n let out = '';\n let combiningRun = 0;\n for (const char of value) {\n if (/\\p{M}/u.test(char)) {\n if (combiningRun < maxPerBase) {\n out += char;\n combiningRun += 1;\n }\n } else {\n out += char;\n combiningRun = 0;\n }\n }\n return out;\n}\n\n/**\n * Sanitise untrusted display text from PDS records before rendering in UI:\n * - strips bidi formatting controls (LRM/RLM/LRE/RLE/PDF/LRO/RLO/LRI/RLI/FSI/PDI)\n * that can hijack reading order or crash `next/og` (see Satori LRM+emoji bug)\n * - limits stacked combining marks (Zalgo defence)\n *\n * Preserves ZWJ (U+200D) so emoji sequences keep rendering.\n */\nexport function sanitizeDisplayText(value: string, maxCombiningPerBase = 4): string {\n if (!value) return value;\n return limitCombiningMarks(value.replace(BIDI_CONTROLS, ''), maxCombiningPerBase);\n}\n","const ELLIPSIS = '\\u2026';\n\n/**\n * Truncate a string to at most `maxLen` grapheme clusters, appending an\n * ellipsis when the string was shortened. Grapheme-aware so it never splits\n * emoji sequences (ZWJ, regional indicators, combining marks, surrogate pairs).\n */\nexport function truncateGraphemes(value: string, maxLen: number): string {\n if (maxLen <= 0) return '';\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n const graphemes = Array.from(segmenter.segment(value), (s) => s.segment);\n if (graphemes.length <= maxLen) return value;\n if (maxLen === 1) return ELLIPSIS;\n return graphemes.slice(0, maxLen - 1).join('') + ELLIPSIS;\n}\n","/**\n * Format a date as a relative time string (e.g. \"2 minutes ago\", \"3 days ago\").\n */\nexport function formatDistanceToNow(date: Date): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\n if (seconds < 60) return 'just now';\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n\n const months = Math.floor(days / 30);\n return `${months}mo ago`;\n}\n","/**\n * WCAG 2.2 contrast ratio utilities for validating publication theme colors.\n * Implements the relative luminance and contrast ratio formulas from\n * https://www.w3.org/TR/WCAG22/#dfn-relative-luminance\n */\n\nexport interface RgbColor {\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Return true when the value is an RgbColor with all channels as integers in [0, 255].\n * Use this before passing untrusted data to the luminance / contrast functions.\n */\nexport function isValidRgbColor(value: unknown): value is RgbColor {\n if (value == null || typeof value !== 'object') return false;\n const { r, g, b } = value as Record<string, unknown>;\n return (\n typeof r === 'number' &&\n typeof g === 'number' &&\n typeof b === 'number' &&\n Number.isFinite(r) &&\n Number.isFinite(g) &&\n Number.isFinite(b) &&\n r >= 0 &&\n r <= 255 &&\n g >= 0 &&\n g <= 255 &&\n b >= 0 &&\n b <= 255\n );\n}\n\n/**\n * Serialize an RgbColor to a CSS `rgb(...)` string.\n * Channels are floored to integers to prevent sub-pixel drift.\n */\nexport function rgbToString(color: RgbColor): string {\n return `rgb(${Math.floor(color.r)}, ${Math.floor(color.g)}, ${Math.floor(color.b)})`;\n}\n\n/**\n * Calculate relative luminance of an sRGB color per WCAG 2.2.\n * Input channels must be numbers in [0, 255].\n */\nexport function relativeLuminance(color: RgbColor): number {\n const [rs, gs, bs] = [color.r / 255, color.g / 255, color.b / 255];\n\n const r = rs <= 0.04045 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const g = gs <= 0.04045 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const b = bs <= 0.04045 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Calculate WCAG 2.2 contrast ratio between two colors.\n * Returns a value between 1 (identical) and 21 (black/white).\n */\nexport function contrastRatio(color1: RgbColor, color2: RgbColor): number {\n const l1 = relativeLuminance(color1);\n const l2 = relativeLuminance(color2);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * Check if two colors meet WCAG 2.2 AA contrast requirement (4.5:1 for normal text).\n */\nexport function meetsContrastAA(foreground: RgbColor, background: RgbColor): boolean {\n return contrastRatio(foreground, background) >= 4.5;\n}\n","import type {\n ProfilePresentationRecord,\n ProfilePresentationDeliveryRecord,\n PresentationLink,\n PresentationDuration,\n} from '../schemas/index.js';\n\n/**\n * CSV parsers for the Talks & sessions import (two templates joined by a\n * presentation_key). The value parsers and row mappers are reusable and pure;\n * the actual PDS writing (create a presentation, then write its deliveries with\n * a presentationRef to it) is orchestrated by the consumer, which has the\n * created record's AT-URI.\n */\n\n/** A CSV row as a header-keyed map. Missing cells may be undefined or empty. */\nexport type CsvRow = Record<string, string | undefined>;\n\nfunction clean(value: string | undefined): string {\n return (value ?? '').trim();\n}\n\n/**\n * Parse a free-text duration into minutes: a single value (\"30 min\", \"30\n * minutes\", \"30\") or a range (\"20-30 min\", \"20 to 30 minutes\", \"20-30\").\n * Returns undefined when no usable number is present. A second number is used\n * as the upper bound only when it is greater than or equal to the first.\n */\nexport function parsePresentationDuration(\n input: string | undefined,\n): PresentationDuration | undefined {\n const numbers = (clean(input).match(/\\d+/g) ?? [])\n .map((n) => Number.parseInt(n, 10))\n .filter((n) => Number.isInteger(n) && n > 0);\n // `.at()` is typed `number | undefined`, which both tsc (under\n // noUncheckedIndexedAccess) and eslint agree on, so the guards are clean.\n const min = numbers.at(0);\n if (min === undefined) return undefined;\n const max = numbers.at(1);\n return max !== undefined && max >= min\n ? { minMinutes: min, maxMinutes: max }\n : { minMinutes: min };\n}\n\n/** Build a duration from explicit min/max minute columns. */\nexport function durationFromMinutes(\n minRaw: string | undefined,\n maxRaw: string | undefined,\n): PresentationDuration | undefined {\n const min = Number.parseInt(clean(minRaw), 10);\n if (!Number.isInteger(min) || min < 1) return undefined;\n const max = Number.parseInt(clean(maxRaw), 10);\n return Number.isInteger(max) && max >= min\n ? { minMinutes: min, maxMinutes: max }\n : { minMinutes: min };\n}\n\n/** Split a delimited list into trimmed, non-empty values. Default delimiter \";\". */\nexport function parseIntendedAudiences(input: string | undefined, delimiter = ';'): string[] {\n return clean(input)\n .split(delimiter)\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/**\n * Strip HTML to plain text and decode the common entities, for descriptions\n * exported as HTML (e.g. Webflow). The AppView re-sanitizes on write; this is\n * only to produce readable text.\n */\nexport function stripHtmlToText(input: string | undefined): string {\n const text = clean(input)\n .replace(/<\\s*br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/\\s*(p|div|li|h[1-6])\\s*>/gi, '\\n')\n .replace(/<[^>]*>/g, '')\n .replace(/ /gi, ' ')\n .replace(/&/gi, '&')\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .replace(/"/gi, '\"')\n .replace(/�*39;|'/gi, \"'\");\n return text\n .replace(/[ \\t]+/g, ' ')\n .replace(/ *\\n */g, '\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nconst ROLE_TOKENS: Record<string, string> = {\n presenter: 'id.sifa.defs#presenter',\n speaker: 'id.sifa.defs#presenter',\n panelist: 'id.sifa.defs#panelist',\n keynote: 'id.sifa.defs#keynote',\n workshop: 'id.sifa.defs#workshop',\n host: 'id.sifa.defs#host',\n};\n\n/**\n * Map a friendly role value to its token. An existing token passes through.\n * Free-text or compound values (e.g. \"Organizer & co-host/moderator\") are\n * mapped to the nearest token by keyword. An organizer-only value has no\n * speaking token, so it, and any other unrecognized value, is dropped rather\n * than stored raw -- matching normalizePresentationMode's drop-unknown\n * behavior, so a fixed role dropdown never has to render arbitrary strings.\n */\nexport function normalizePresentationRole(value: string | undefined): string | undefined {\n const v = clean(value).toLowerCase();\n if (!v) return undefined;\n if (v.startsWith('id.sifa.defs#')) return v;\n const exact = ROLE_TOKENS[v];\n if (exact) return exact;\n if (v.includes('keynote')) return ROLE_TOKENS.keynote;\n if (v.includes('workshop') || v.includes('masterclass') || v.includes('training'))\n return ROLE_TOKENS.workshop;\n if (v.includes('panel')) return ROLE_TOKENS.panelist;\n if (v.includes('host') || v.includes('moderat') || v.includes('emcee') || v.includes('chair'))\n return ROLE_TOKENS.host;\n if (v.includes('speaker') || v.includes('present') || v.includes('talk'))\n return ROLE_TOKENS.presenter;\n return undefined;\n}\n\nconst MODE_FRAGMENTS: Record<string, string> = {\n inperson: '#inperson',\n 'in person': '#inperson',\n 'in-person': '#inperson',\n virtual: '#virtual',\n online: '#virtual',\n remote: '#virtual',\n hybrid: '#hybrid',\n};\n\n/** Map a friendly mode value to the community calendar token; drops an unknown value. */\nexport function normalizePresentationMode(value: string | undefined): string | undefined {\n const v = clean(value).toLowerCase();\n if (!v) return undefined;\n if (v.startsWith('community.lexicon.calendar.event#')) return v;\n const fragment = MODE_FRAGMENTS[v];\n return fragment ? `community.lexicon.calendar.event${fragment}` : undefined;\n}\n\nfunction link(uri: string | undefined, type: string): PresentationLink | undefined {\n const u = clean(uri);\n return u ? { uri: u, type } : undefined;\n}\n\nexport interface ParsedPresentation {\n /** presentation_key used to link delivery rows to this presentation. */\n key?: string;\n record: Omit<ProfilePresentationRecord, 'createdAt'>;\n}\n\n/** Map a row of the presentations template to a presentation record (minus createdAt). */\nexport function presentationCsvRowToRecord(row: CsvRow): ParsedPresentation {\n const description = stripHtmlToText(row.description);\n const duration =\n parsePresentationDuration(row.duration) ??\n durationFromMinutes(row.duration_min_minutes, row.duration_max_minutes);\n const intendedAudiences = parseIntendedAudiences(row.intended_audiences);\n const links = [\n link(row.slides_url, 'id.sifa.defs#linkSlides'),\n link(row.recording_url, 'id.sifa.defs#linkRecording'),\n link(row.writeup_url, 'id.sifa.defs#linkWriteup'),\n ].filter((l): l is PresentationLink => l !== undefined);\n\n const record: Omit<ProfilePresentationRecord, 'createdAt'> = { title: clean(row.title) };\n if (description) record.description = description;\n if (duration) record.duration = duration;\n if (intendedAudiences.length) record.intendedAudiences = intendedAudiences;\n if (links.length) record.links = links;\n\n return { key: clean(row.presentation_key) || undefined, record };\n}\n\nexport interface ParsedDelivery {\n /** presentation_key to resolve into a presentationRef once the presentation exists. */\n presentationKey?: string;\n record: Omit<ProfilePresentationDeliveryRecord, 'createdAt' | 'presentationRef'>;\n}\n\n/** Map a row of the deliveries template to a delivery record (minus createdAt and presentationRef). */\nexport function presentationDeliveryCsvRowToRecord(row: CsvRow): ParsedDelivery {\n const links = [\n link(row.event_url, 'id.sifa.defs#linkEvent'),\n link(row.recording_url, 'id.sifa.defs#linkRecording'),\n ].filter((l): l is PresentationLink => l !== undefined);\n\n const record: Omit<ProfilePresentationDeliveryRecord, 'createdAt' | 'presentationRef'> = {};\n const title = clean(row.title);\n const eventName = clean(row.event_name);\n const date = clean(row.date);\n const location = clean(row.location);\n const role = normalizePresentationRole(row.role);\n const mode = normalizePresentationMode(row.mode);\n if (title) record.title = title;\n if (role) record.role = role;\n if (eventName) record.eventName = eventName;\n if (date) record.date = date;\n if (location) record.location = location;\n if (mode) record.mode = mode;\n if (links.length) record.links = links;\n\n return { presentationKey: clean(row.presentation_key) || undefined, record };\n}\n","/**\n * URL patterns per app, mirroring the sifa-web registry.\n *\n * These describe how to build a clickable URL for an activity card given\n * the author's handle/did and the record rkey. The patterns are templates\n * with `{handle}`, `{did}`, and `{rkey}` placeholders; each variable is\n * URI-encoded when interpolated.\n *\n * Tier semantics:\n * - `urlPattern`: per-item URL (a specific post/event/repo). Preferred.\n * - `profileUrlPattern`: per-user profile URL on the app. Fallback.\n *\n * Apps without either pattern are not clickable.\n */\nexport interface AppUrlPatterns {\n urlPattern?: string;\n profileUrlPattern?: string;\n}\n\nexport const APP_URL_PATTERNS: Readonly<Record<string, AppUrlPatterns>> = Object.freeze({\n bluesky: {\n urlPattern: 'https://bsky.app/profile/{handle}/post/{rkey}',\n profileUrlPattern: 'https://bsky.app/profile/{handle}',\n },\n tangled: {\n profileUrlPattern: 'https://tangled.sh/{handle}',\n },\n smokesignal: {\n urlPattern: 'https://smokesignal.events/{did}/{rkey}',\n profileUrlPattern: 'https://smokesignal.events/{did}',\n },\n whitewind: {\n urlPattern: 'https://whtwnd.com/{handle}/{rkey}',\n profileUrlPattern: 'https://whtwnd.com/{handle}',\n },\n frontpage: {\n urlPattern: 'https://frontpage.fyi/post/{did}/{rkey}',\n profileUrlPattern: 'https://frontpage.fyi/profile/{did}',\n },\n linkat: {\n profileUrlPattern: 'https://linkat.blue/{handle}',\n },\n pastesphere: {\n urlPattern: 'https://pastesphere.link/user/{handle}/snippet/{rkey}',\n profileUrlPattern: 'https://pastesphere.link/user/{handle}',\n },\n kipclip: {\n profileUrlPattern: 'https://kipclip.com/{handle}',\n },\n keytrace: {\n profileUrlPattern: 'https://keytrace.dev/@{handle}',\n },\n sifa: {\n profileUrlPattern: 'https://sifa.id/p/{handle}',\n },\n popfeed: {\n urlPattern: 'https://popfeed.social/profile/{handle}',\n profileUrlPattern: 'https://popfeed.social/profile/{handle}',\n },\n streamplace: {\n profileUrlPattern: 'https://stream.place/{handle}',\n },\n semble: {\n profileUrlPattern: 'https://semble.so/profile/{handle}',\n },\n grain: {\n urlPattern: 'https://grain.social/profile/{did}/gallery/{rkey}',\n profileUrlPattern: 'https://grain.social/profile/{did}',\n },\n youandme: { profileUrlPattern: 'https://youandme.at' },\n // anisota: upgraded with per-record URL pattern below.\n margin: { profileUrlPattern: 'https://margin.at' },\n beaconbits: { profileUrlPattern: 'https://beaconbits.app' },\n bookhive: { profileUrlPattern: 'https://bookhive.buzz/profile/{handle}' },\n colibri: { profileUrlPattern: 'https://colibri.social' },\n collectivesocial: { profileUrlPattern: 'https://app.collectivesocial.app' },\n github: {},\n asq: {\n // Questions live at /q/{did}/{rkey}. Answer cards build their own URL\n // from the parsed subject.uri (which points to the question), so the\n // pattern below is invoked only for question records.\n urlPattern: 'https://asq.fyi/q/{did}/{rkey}',\n profileUrlPattern: 'https://asq.fyi',\n },\n passports: {\n // Per-record URLs don't exist on passports.social — its SvelteKit routes\n // stop at /profile/{handle}/{passport_slug}. Profile-level fallback only.\n profileUrlPattern: 'https://passports.social/profile/{handle}',\n },\n leaflet: {\n // Per-document URLs are short and rkey-only: https://leaflet.pub/{rkey}.\n // Each publication has its own base_path subdomain (e.g. zzstoatzz.leaflet.pub)\n // but the canonical short URL renders the same document. There is no\n // per-user profile route on leaflet.pub, so the profile fallback points\n // at the marketing site.\n urlPattern: 'https://leaflet.pub/{rkey}',\n profileUrlPattern: 'https://leaflet.pub',\n },\n spark: {\n // Verified live: GET /post/{did}/{rkey} returns 200.\n urlPattern: 'https://sprk.so/post/{did}/{rkey}',\n profileUrlPattern: 'https://sprk.so/profile/{handle}',\n },\n anisota: {\n urlPattern: 'https://anisota.net/post/{did}/{rkey}',\n profileUrlPattern: 'https://anisota.net/profile/{handle}',\n },\n nooki: {\n // Per-post URLs use slug-based routing (e.g. /post/{slug}), not rkey —\n // can't be constructed from a record. Profile fallback only.\n profileUrlPattern: 'https://nooki.me/user/{handle}',\n },\n atstore: {\n // atstore.fyi has no user-profile pages (the legacy `/@{handle}` pattern\n // resolved to a 404), and no per-review deep link exists. The per-product\n // page (https://atstore.fyi/products/{slug}) is the most specific URL\n // available — resolveCardUrl builds it from record.listingMeta.slug,\n // which sifa-api enriches by resolving the review's `subject` to the\n // referenced listing.detail record.\n profileUrlPattern: 'https://atstore.fyi',\n },\n plyr: {\n // SPA — per-record URLs require JS routing. plyr.fm doesn't expose a\n // public per-handle profile page server-side either; falls back to root.\n profileUrlPattern: 'https://plyr.fm',\n },\n atfund: {\n // at.fund is auth-gated — `/give/{did}` 307s to `/` when not signed in,\n // and there's no public per-endorsement permalink. Profile fallback only,\n // pointing at the main /give listing.\n profileUrlPattern: 'https://www.at.fund/give',\n },\n crate: {\n // Crate (app.crate.social) is an authoring dashboard with no public\n // per-record viewer or per-handle profile page — records are designed to\n // render on the maker's own site. `content` cards link out via\n // record.canonicalUrl (handled in resolveCardUrl); `note` records have no\n // public URL and render non-clickable. So no app-level pattern applies.\n },\n atmorsvp: {\n // atmo.rsvp events live at /p/{did}/e/{rkey}. The per-item pattern is used\n // for the event record itself; checkin records build their URL from the\n // referenced event uri in resolveCardUrl (mirrors smokesignal rsvp).\n urlPattern: 'https://atmo.rsvp/p/{did}/e/{rkey}',\n profileUrlPattern: 'https://atmo.rsvp/p/{did}',\n },\n opensocial: {\n // Open Social (opensocial.community) is community-management infrastructure\n // with no public per-membership permalink. Profile fallback only.\n profileUrlPattern: 'https://opensocial.community',\n },\n kevara: {\n // Kevara (professional network) has no live public web surface yet — its\n // domain doesn't resolve and there's no per-record viewer. Recognized so\n // the speaker-directory card renders with the right pill, but non-clickable.\n },\n atcr: {\n // ATCR repositories live at /r/{handle}/{repository}, where the rkey of an\n // io.atcr.repo.page record is the repository name. Verified live: GET\n // /r/{handle}/{rkey} and /u/{handle} both return 200.\n urlPattern: 'https://atcr.io/r/{handle}/{rkey}',\n profileUrlPattern: 'https://atcr.io/u/{handle}',\n },\n kich: {\n // Kich recipe viewer. Verified: GET /recipes/{rkey} returns 200 (the SPA\n // renders the recipe by rkey); /recipe/{rkey} 404s. No public per-handle\n // profile page, so the profile fallback points at the app root.\n urlPattern: 'https://kich.io/recipes/{rkey}',\n profileUrlPattern: 'https://kich.io',\n },\n recipe: {\n // recipe.exchange viewer. Verified: GET /recipes/{rkey} returns 200 (rkey\n // alone; no did needed) and /profiles/{handle} returns 200 for the author\n // page. /recipe/{rkey} 404s.\n urlPattern: 'https://recipe.exchange/recipes/{rkey}',\n profileUrlPattern: 'https://recipe.exchange/profiles/{handle}',\n },\n aetherdocs: {\n // Aether OS is a browser OS — presentations open inside it and there's no\n // public per-record viewer. The card embeds the deck from the record; the\n // outbound link points at the author's Aether OS space (mirrors aetheros).\n profileUrlPattern: 'https://aetheros.computer/{handle}',\n },\n});\n\n/**\n * Map collection NSID prefixes to app ids. Order matters: longer / more\n * specific prefixes must come before broader ones.\n */\nexport const COLLECTION_TO_APP: ReadonlyArray<readonly [prefix: string, appId: string]> = [\n ['app.bsky.', 'bluesky'],\n ['sh.tangled.', 'tangled'],\n ['events.smokesignal.', 'smokesignal'],\n ['community.lexicon.calendar.', 'smokesignal'],\n ['community.lexicon.bookmarks.', 'kipclip'],\n ['com.kipclip.', 'kipclip'],\n ['blue.flashes.', 'flashes'],\n ['social.grain.', 'grain'],\n ['com.whtwnd.', 'whitewind'],\n ['fyi.unravel.frontpage.', 'frontpage'],\n ['social.psky.', 'picosky'],\n ['blue.linkat.', 'linkat'],\n ['link.pastesphere.', 'pastesphere'],\n ['site.standard.', 'standard'],\n ['computer.aetheros.', 'aetheros'],\n ['space.roomy.', 'roomy'],\n ['dev.keytrace.', 'keytrace'],\n ['social.popfeed.', 'popfeed'],\n ['app.popsky.', 'popfeed'],\n ['place.stream.', 'streamplace'],\n ['app.sidetrail.', 'semble'],\n ['network.cosmik.', 'cosmik'],\n ['id.sifa.', 'sifa'],\n ['forum.barazo.', 'barazo'],\n ['xyz.statusphere.', 'statusphere'],\n ['at.youandme.', 'youandme'],\n ['net.anisota.', 'anisota'],\n ['at.margin.', 'margin'],\n ['app.beaconbits.', 'beaconbits'],\n ['buzz.bookhive.', 'bookhive'],\n ['social.colibri.', 'colibri'],\n ['social.passports.', 'passports'],\n ['fyi.asq.', 'asq'],\n ['pub.leaflet.', 'leaflet'],\n ['so.sprk.', 'spark'],\n ['community.nooki.', 'nooki'],\n ['fyi.atstore.', 'atstore'],\n ['fm.plyr.', 'plyr'],\n ['fund.at.', 'atfund'],\n ['social.crate.', 'crate'],\n ['quest.atmo.', 'atmorsvp'],\n ['community.opensocial.', 'opensocial'],\n ['is.kevara.', 'kevara'],\n ['io.atcr.', 'atcr'],\n // Batch onboard — named pills for apps that were leaking as raw NSIDs.\n ['app.mcp.', 'mcp'],\n ['app.userinput.', 'userinput'],\n ['com.minomobi.', 'minomobi'],\n ['com.voxport.', 'voxport'],\n ['community.lexicon.badge.', 'badges'],\n ['dev.atvouch.', 'atvouch'],\n ['io.calabro.watsm.', 'watsm'],\n ['li.plonk.', 'plonk'],\n ['net.alternativeproto.', 'alternativeproto'],\n ['one.papili.', 'papili'],\n ['org.v-it.', 'vit'],\n ['st.lifepo.', 'lifepo'],\n ['stream.thought.', 'streamthought'],\n ['tech.waow.', 'waow'],\n ['wiki.lichen.', 'lichen'],\n // Onboard from aramzs.xyz profile audit.\n ['os.aether.', 'aetherdocs'],\n ['io.kich.recipe.recipe', 'kich'],\n // Onboard from moll.dev profile audit.\n ['exchange.recipe.recipe', 'recipe'],\n];\n","import { APP_URL_PATTERNS, COLLECTION_TO_APP } from './app-url-patterns.js';\n\n/**\n * An activity item as consumed by the Sifa activity-card components and\n * the sifa-api external-URL health scanner. The shape mirrors the props\n * the cards already use, so the resolver returns the same URL the UI\n * renders.\n */\nexport interface ActivityItemForUrl {\n /** Collection NSID, e.g. \"sh.tangled.graph.repo\". */\n collection: string;\n /** The raw record from the PDS / API. */\n record: Record<string, unknown>;\n /** Full at-uri of the record (used by collections that derive URL from uri). */\n uri: string;\n /** Record key. */\n rkey: string;\n /** DID of the author of the record. */\n authorDid: string;\n /** Optional handle (cards prefer handle in URL paths when available). */\n authorHandle?: string;\n}\n\n/**\n * Map a collection NSID to its app id, mirroring the sifa-web prefix map.\n *\n * Falls back to the first two NSID segments (e.g. \"org.hyperboards\") when\n * the prefix is not registered, matching the existing card behaviour.\n */\nexport function getAppIdForCollection(collection: string): string {\n for (const [prefix, appId] of COLLECTION_TO_APP) {\n if (collection.startsWith(prefix)) return appId;\n }\n const parts = collection.split('.');\n if (parts.length >= 2) return `${parts[0]}.${parts[1]}`;\n return collection;\n}\n\n/**\n * How the activity-card health scanner should verify a card is still live.\n *\n * - `record`: the URL is a first-party permalink that renders THIS record\n * (e.g. a Bluesky post at bsky.app, a tangled repo, a smokesignal event).\n * The authoritative liveness check is \"does the record still exist on its\n * PDS\" — `com.atproto.repo.getRecord` on the item's own at-uri — NOT an\n * HTTP probe of the rendering app. Rendering apps (bsky.app, tangled.sh)\n * frequently answer HEAD with 404/405 while serving GET fine, which\n * false-positives every permalink as broken.\n * - `url`: the URL is a foreign or derived target — a bookmarked page, an\n * external publisher, a *different* record's page, or a profile page.\n * Its reachability is independent of this record, so probe the URL.\n * - `none`: the card has no clickable URL; nothing to check.\n */\nexport type CardHealthStrategy = 'record' | 'url' | 'none';\n\nexport interface CardHealth {\n /** The clickable URL the card renders. Null when non-clickable. */\n url: string | null;\n /** How the scanner should verify liveness. See {@link CardHealthStrategy}. */\n strategy: CardHealthStrategy;\n}\n\n/** Build a `url`-strategy result (foreign/derived/profile target). */\nfunction urlHealth(url: string | null): CardHealth {\n return url ? { url, strategy: 'url' } : { url: null, strategy: 'none' };\n}\n\n/** Build a `record`-strategy result (self-permalink of this record). */\nfunction recordHealth(url: string | null): CardHealth {\n return url ? { url, strategy: 'record' } : { url: null, strategy: 'none' };\n}\n\nfunction interpolate(pattern: string, vars: Record<string, string | undefined>): string | null {\n let result = pattern;\n for (const [key, value] of Object.entries(vars)) {\n if (result.includes(`{${key}}`)) {\n if (!value) return null;\n result = result.replaceAll(`{${key}}`, encodeURIComponent(value));\n }\n }\n return result;\n}\n\n/**\n * Whether the per-item `urlPattern` for `appId` is appropriate for `collection`.\n *\n * For bluesky, the per-item URL pattern only matches `app.bsky.feed.post` —\n * other `app.bsky.*` collections (`actor.status`, `graph.cancellation`, etc.)\n * use rkeys that would 404 at `bsky.app/profile/{handle}/post/{rkey}`. Fall\n * back to the profile URL for those. See sifa-web#1070 / sifa-web#1073.\n *\n * When `collection` is undefined we err on the safe side for bluesky and\n * prefer the profile URL.\n */\nfunction shouldUseItemPattern(appId: string, collection: string | undefined): boolean {\n if (appId === 'bluesky') {\n return collection === 'app.bsky.feed.post';\n }\n return true;\n}\n\n/**\n * Resolve a pattern-based URL, reporting which tier produced it:\n * - `item`: a per-item permalink (renders this specific record) -> record-checkable.\n * - `profile`: the app's profile page (not this record) -> url-checkable.\n * - `null`: no pattern applied.\n */\nfunction patternHealth(\n appId: string,\n vars: { handle?: string; did?: string; rkey?: string },\n collection?: string,\n): CardHealth {\n const patterns = APP_URL_PATTERNS[appId];\n if (!patterns) return { url: null, strategy: 'none' };\n\n if (patterns.urlPattern && shouldUseItemPattern(appId, collection)) {\n const url = interpolate(patterns.urlPattern, vars);\n if (url) return recordHealth(url);\n }\n if (patterns.profileUrlPattern) {\n const url = interpolate(patterns.profileUrlPattern, vars);\n if (url) return urlHealth(url);\n }\n return { url: null, strategy: 'none' };\n}\n\n/**\n * Valid tangled repo slug: alphanumeric, dot, dash, underscore. No whitespace,\n * slashes, or URL-encodable special characters. Multi-segment aggregate `name`\n * values produce 404 URLs, so callers fall back to the profile URL when\n * invalid. See sifa-web#1071 / sifa-web#1072.\n */\nconst TANGLED_REPO_SLUG = /^[a-zA-Z0-9._-]+$/;\n\nfunction stringOrNull(value: unknown): string | null {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\n// at://did:plc:xxx/community.lexicon.calendar.event/rkey\n// -> { did: \"did:plc:xxx\", rkey: \"rkey\" }\nfunction parseAtUri(atUri: string): { did: string; rkey: string } | null {\n const match = atUri.match(/^at:\\/\\/(did:[^/]+)\\/[^/]+\\/(.+)$/);\n if (!match || !match[1] || !match[2]) return null;\n return { did: match[1], rkey: match[2] };\n}\n\n/**\n * Resolve the canonical clickable URL for an activity item **and** how its\n * liveness should be checked — the single source of truth shared by:\n * - sifa-web activity cards (which render `.url`), and\n * - the sifa-api link-health scanner (which switches on `.strategy`: probe the\n * record's PDS for `record`-strategy cards, probe the URL for `url`).\n *\n * See {@link CardHealthStrategy} for why self-permalinks (bsky posts, etc.)\n * must be verified by record existence rather than an HTTP probe of the app.\n *\n * Resolution order:\n * 1. Per-collection bespoke logic (tangled, kipclip, margin, smokesignal\n * rsvp, standard documents). These mirror the inline logic in the\n * individual card components.\n * 2. Generic `record.url` field (used by hyperboards and similar).\n * 3. Pattern-based per-item / profile URL from the registry.\n */\nexport function resolveCardHealth(item: ActivityItemForUrl): CardHealth {\n const { collection, record, uri, rkey, authorDid, authorHandle } = item;\n const appId = getAppIdForCollection(collection);\n\n // --- Per-collection bespoke logic (mirrors the card components) ---\n\n // Tangled: prefer per-repo URL `https://tangled.sh/{handle}/{slug}`. The slug\n // is `record.name` (legacy format) or — when `name` is absent — the record's\n // rkey (newer repos use the slug as the rkey). The rkey fallback is scoped to\n // `sh.tangled.repo`; other tangled collections (e.g. feed.star) use TID rkeys\n // that are not repo slugs. Only when the slug is valid — multi-segment\n // aggregate names (whitespace, slashes, special chars) would 404. See\n // sifa-web#1071. The repo record itself is the card's subject, so it is\n // verified by the record's existence.\n if (collection.startsWith('sh.tangled.')) {\n const repoName = stringOrNull(record.name) ?? (collection === 'sh.tangled.repo' ? rkey : null);\n if (repoName && authorHandle && TANGLED_REPO_SLUG.test(repoName)) {\n return recordHealth(`https://tangled.sh/${authorHandle}/${repoName}`);\n }\n return patternHealth('tangled', { handle: authorHandle, did: authorDid, rkey }, collection);\n }\n\n // Kipclip / community.lexicon.bookmarks: the bookmark subject IS the URL —\n // a foreign page whose reachability is independent of the bookmark record.\n if (\n collection.startsWith('com.kipclip.') ||\n collection.startsWith('community.lexicon.bookmarks.')\n ) {\n const subject = stringOrNull(record.subject);\n if (subject) return urlHealth(subject);\n return patternHealth('kipclip', { handle: authorHandle, did: authorDid, rkey });\n }\n\n // Margin bookmark: card returns null entirely without record.source\n if (collection === 'at.margin.bookmark') {\n return urlHealth(stringOrNull(record.source));\n }\n\n // Margin note / annotation: both are W3C web annotations whose `target.source`\n // is the annotated page URL. Link to that source; fall back to the margin app.\n if (collection === 'at.margin.annotation' || collection === 'at.margin.note') {\n const target = record.target;\n if (target != null && typeof target === 'object') {\n const source = stringOrNull((target as Record<string, unknown>).source);\n if (source) return urlHealth(source);\n }\n return urlHealth(APP_URL_PATTERNS.margin?.profileUrlPattern ?? null);\n }\n\n // Smokesignal RSVP: parse the linked event uri. The URL points at a\n // *different* record (the event), so probe the URL, not this RSVP record.\n if (collection === 'community.lexicon.calendar.rsvp') {\n const subject = record.subject;\n if (subject != null && typeof subject === 'object') {\n const subjectUri = stringOrNull((subject as Record<string, unknown>).uri);\n if (subjectUri) {\n const parsed = parseAtUri(subjectUri);\n if (parsed) {\n return urlHealth(`https://smokesignal.events/${parsed.did}/${parsed.rkey}`);\n }\n }\n }\n return { url: null, strategy: 'none' };\n }\n\n // Smokesignal event itself: use item's own uri -> self-permalink.\n if (collection === 'community.lexicon.calendar.event') {\n const parsed = parseAtUri(uri);\n if (parsed) {\n return recordHealth(`https://smokesignal.events/${parsed.did}/${parsed.rkey}`);\n }\n return { url: null, strategy: 'none' };\n }\n\n // atmo.rsvp event itself: use item's own uri -> self-permalink.\n if (collection === 'quest.atmo.event') {\n const parsed = parseAtUri(uri);\n if (parsed) {\n return recordHealth(`https://atmo.rsvp/p/${parsed.did}/e/${parsed.rkey}`);\n }\n return { url: null, strategy: 'none' };\n }\n\n // atmo.rsvp checkin: parse the linked event uri (record.event) and link to\n // that event's page (mirrors smokesignal rsvp). The URL points at a\n // *different* record (the event), so probe the URL. The checkin's own rkey is\n // not addressable, so without a valid event reference it's non-clickable.\n if (collection === 'quest.atmo.checkin') {\n const eventUri = stringOrNull(record.event);\n if (eventUri) {\n const parsed = parseAtUri(eventUri);\n if (parsed) {\n return urlHealth(`https://atmo.rsvp/p/${parsed.did}/e/${parsed.rkey}`);\n }\n }\n return { url: null, strategy: 'none' };\n }\n\n // atstore reviews: no per-review URL exists on atstore.fyi, and user profile\n // pages don't exist either. Deep-link to the reviewed product instead.\n // The slug comes from record.listingMeta (enriched by sifa-api from the\n // review's `subject` at-uri → fyi.atstore.listing.detail record). The product\n // page is a *different* subject, so probe the URL.\n if (collection === 'fyi.atstore.listing.review') {\n const listingMeta = record.listingMeta;\n if (listingMeta != null && typeof listingMeta === 'object') {\n const slug = stringOrNull((listingMeta as Record<string, unknown>).slug);\n if (slug) return urlHealth(`https://atstore.fyi/products/${encodeURIComponent(slug)}`);\n }\n return urlHealth(APP_URL_PATTERNS.atstore?.profileUrlPattern ?? null);\n }\n\n // Crate content: link to the canonical published location the maker\n // recorded (a YouTube/podcast/personal-site URL) — a foreign page. Crate is\n // an authoring dashboard with no public per-record viewer, so `note`\n // records — which carry no canonicalUrl — render non-clickable (null).\n if (collection === 'social.crate.content') {\n return urlHealth(stringOrNull(record.canonicalUrl));\n }\n if (collection === 'social.crate.note') {\n return { url: null, strategy: 'none' };\n }\n\n // Standard documents: siteUrl + path (or just siteUrl) — an external site.\n if (collection.startsWith('site.standard.')) {\n const siteUrl = stringOrNull(record.siteUrl);\n const path = stringOrNull(record.path);\n if (siteUrl && path) return urlHealth(`${siteUrl}${path}`);\n if (siteUrl) return urlHealth(siteUrl);\n // Fall through to generic record.url / patterns\n }\n\n // Kich recipe: always link to the Kich recipe page. record.url is the\n // *source* the recipe was imported from (a YouTube video, a blog), which the\n // card shows as secondary attribution — not the primary link. Must run before\n // the generic record.url fallback below, which would otherwise hijack it. The\n // recipe page is a first-party permalink for this record.\n if (collection === 'io.kich.recipe.recipe') {\n return patternHealth('kich', { handle: authorHandle, did: authorDid, rkey }, collection);\n }\n\n // recipe.exchange: same shape as Kich — the record's attribution.url points\n // at the original source (a blog/video), not the app. Always link to the\n // recipe.exchange page. Must run before the generic fallback below.\n if (collection === 'exchange.recipe.recipe') {\n return patternHealth('recipe', { handle: authorHandle, did: authorDid, rkey }, collection);\n }\n\n // --- Generic fallbacks ---\n\n // record.url is a common ad-hoc per-item URL (hyperboards, etc.). It is an\n // arbitrary foreign URL, so probe it directly.\n const recordUrl = stringOrNull(record.url);\n if (recordUrl) return urlHealth(recordUrl);\n\n // Pattern-based fallback. Pass `collection` so app-specific guards (bluesky\n // restricting /post/{rkey} to app.bsky.feed.post) can apply. The tier\n // (per-item vs profile) decides record- vs url-strategy.\n return patternHealth(appId, { handle: authorHandle, did: authorDid, rkey }, collection);\n}\n\n/**\n * Resolve the canonical clickable URL for an activity item — the same URL\n * the activity-card UI in sifa-web renders. Thin wrapper over\n * {@link resolveCardHealth}; returns `null` when no link is appropriate.\n */\nexport function resolveCardUrl(item: ActivityItemForUrl): string | null {\n return resolveCardHealth(item).url;\n}\n","/**\n * Per-collection visibility rules for activity items.\n *\n * These rules express \"this record has nothing meaningful to render as a card\"\n * — e.g. a BookHive shelf-add with no review/stars, or a BeaconBits pin with\n * no shout. They are a UX/card concern, distinct from the api-side blocklists\n * in sifa-api/atproto-app-registry that exclude whole collections (likes,\n * follows, games) or filter spammy record shapes (empty quote posts).\n *\n * Used in two places:\n * - sifa-api's activity feed pagination, so a page-of-N returns N visible\n * items rather than silently-dropped placeholders.\n * - sifa-web's activity-feed component (and as defense-in-depth in the card\n * components themselves), so the client never relies on a stale api.\n *\n * Adding a new rule = one PR to this file. Unknown collections default to\n * visible, so the rule set is purely additive — adding a rule can only ever\n * hide more, never expose what was hidden before.\n */\n\ntype VisibilityPredicate = (record: Record<string, unknown>) => boolean;\n\nfunction isNonEmptyString(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction bookhiveHasOpinion(record: Record<string, unknown>): boolean {\n const review = typeof record.review === 'string' ? record.review.trim() : '';\n const stars = typeof record.stars === 'number' ? record.stars : 0;\n return review.length > 0 || stars > 0;\n}\n\nfunction beaconbitsHasContent(record: Record<string, unknown>): boolean {\n return isNonEmptyString(record.shout) || record.post != null;\n}\n\nfunction marginBookmarkHasSource(record: Record<string, unknown>): boolean {\n return isNonEmptyString(record.source);\n}\n\nfunction marginAnnotationHasBody(record: Record<string, unknown>): boolean {\n const body = record.body;\n if (typeof body === 'string') return body.trim().length > 0;\n if (body != null && typeof body === 'object') {\n const value = (body as Record<string, unknown>).value;\n return typeof value === 'string' && value.trim().length > 0;\n }\n return false;\n}\n\nexport const ACTIVITY_VISIBILITY_RULES: Readonly<Record<string, VisibilityPredicate>> =\n Object.freeze({\n 'buzz.bookhive.book': bookhiveHasOpinion,\n 'app.beaconbits.beacon': beaconbitsHasContent,\n 'at.margin.bookmark': marginBookmarkHasSource,\n 'at.margin.annotation': marginAnnotationHasBody,\n });\n\n/**\n * Return true if the activity item should render a card in the timeline.\n * Records that fail the rule for their collection are dropped silently —\n * they exist in the user's PDS but carry no card-worthy content.\n *\n * Unknown collections (no registered rule) default to visible.\n */\nexport function isVisibleActivityItem(collection: string, record: unknown): boolean {\n if (record === null || typeof record !== 'object') return false;\n const rule = ACTIVITY_VISIBILITY_RULES[collection];\n if (!rule) return true;\n return rule(record as Record<string, unknown>);\n}\n","/**\n * Adult-content gating for Bluesky activity items.\n *\n * Bluesky's official moderation labeler attaches content labels to\n * `app.bsky.feed.defs#postView.labels`. The four sex-and-violence labels\n * below are the ones we hide by default on Sifa: media is replaced with an\n * `<AdultContentWarning>` placeholder card in sifa-web. Authenticated\n * viewers can reveal per-card; anonymous viewers cannot.\n *\n * The list mirrors Bluesky's own globalLabelStrings; if the official set\n * grows (e.g. a new `extreme-violence` label), update this constant.\n *\n * Why a constant + predicate live in the SDK: the same logic needs to run\n * in sifa-web today and sifa-app tomorrow, and the API only forwards the\n * raw labels — the hide decision is a client concern.\n */\n\nexport const ADULT_CONTENT_LABELS = ['porn', 'sexual', 'nudity', 'graphic-media'] as const;\n\nexport type AdultContentLabel = (typeof ADULT_CONTENT_LABELS)[number];\n\n/**\n * A single label entry as emitted by `app.bsky.feed.defs#postView.labels`.\n * Matches `com.atproto.label.defs#label` (the on-wire shape after the AppView\n * resolves a `postView`). `neg: true` marks a retraction.\n */\nexport interface ActivityLabel {\n val: string;\n src: string;\n uri: string;\n cts?: string;\n neg?: boolean;\n}\n\n/**\n * Return true if the item carries at least one adult-content label that is\n * not negated. Items without a `labels` field (every non-Bluesky source,\n * legacy responses) are treated as safe.\n */\nexport function hasAdultContent(item: { labels?: ActivityLabel[] }): boolean {\n const labels = item.labels;\n if (!labels || labels.length === 0) return false;\n return labels.some(\n (label) => !label.neg && (ADULT_CONTENT_LABELS as readonly string[]).includes(label.val),\n );\n}\n","/**\n * Publisher registry — single source of truth for apps that publish documents\n * through the shared `site.standard.*` namespace (Leaflet, Pckt, Offprint, …).\n *\n * Why this exists:\n * A document published via Leaflet, Pckt, Offprint, etc. lives canonically as a\n * `site.standard.document` record. The publisher is metadata, identifiable from\n * the publication's hostname. The activity-card, the publication merger in\n * sifa-api, and the external-URL health scanner all need the same hostname →\n * publisher mapping. Keeping it in one place stops the registry from drifting.\n *\n * What lives here:\n * - `id` — stable appId, also keys sifa-web's branding (logo, color)\n * - `name` — display name\n * - `hostSuffixes` — hostnames that identify a publication URL as this publisher\n * - `homeUrl` — last-resort URL when no per-document URL is available\n *\n * What does NOT live here:\n * - Logo components, color tokens, React chrome — those belong in sifa-web\n * keyed by `id`.\n * - Per-document URL construction — Standard documents are always\n * `${publication.url}${document.path}`. The publisher doesn't change that.\n */\n\nexport interface Publisher {\n /**\n * Stable identifier. Used as the `appId` across Sifa so that sifa-web's\n * `getAppMeta(id)` lookup yields the right logo and color, and so that\n * activity-stat rows tag correctly.\n */\n id: string;\n\n /** Display name shown in pills and headers. */\n name: string;\n\n /**\n * Hostnames that identify a publication URL as belonging to this publisher.\n * Matches the publication URL's hostname when it equals the suffix\n * (e.g. `leaflet.pub`) OR ends with it as a dotted suffix\n * (e.g. `notesbyarielm.leaflet.pub`).\n *\n * Allow multiple entries to future-proof against rebrands or aliases.\n */\n hostSuffixes: readonly string[];\n\n /** Public homepage of the publisher, used as a profile-level fallback URL. */\n homeUrl: string;\n}\n\n/**\n * Neutral fallback used when no branded publisher matches.\n *\n * Synthetic publishers returned by `getPublisherFromSiteUrl` use this `id` but\n * carry the document's own hostname in `name`, so cards can still show e.g.\n * \"feeds.byarielm.fyi\" as the publisher label.\n */\nexport const STANDARD_PUBLISHER_ID = 'standard' as const;\n\nexport const PUBLISHERS: readonly Publisher[] = Object.freeze([\n {\n id: 'leaflet',\n name: 'Leaflet',\n hostSuffixes: ['leaflet.pub'],\n homeUrl: 'https://leaflet.pub',\n },\n {\n id: 'pckt',\n name: 'pckt',\n hostSuffixes: ['pckt.blog'],\n homeUrl: 'https://pckt.blog',\n },\n {\n id: 'offprint',\n name: 'Offprint',\n hostSuffixes: ['offprint.app'],\n homeUrl: 'https://offprint.app',\n },\n {\n id: 'whitewind',\n name: 'WhiteWind',\n hostSuffixes: ['whtwnd.com'],\n homeUrl: 'https://whtwnd.com',\n },\n {\n id: 'unthread',\n name: 'Unthread',\n hostSuffixes: ['unthread.at'],\n homeUrl: 'https://unthread.at',\n },\n {\n id: 'blento',\n name: 'Blento',\n hostSuffixes: ['blento.io'],\n homeUrl: 'https://blento.io',\n },\n]);\n\nconst PUBLISHERS_BY_ID: ReadonlyMap<string, Publisher> = new Map(PUBLISHERS.map((p) => [p.id, p]));\n\n/** Lookup a registered publisher by id. Returns `undefined` for unknown ids. */\nexport function getPublisherById(id: string): Publisher | undefined {\n return PUBLISHERS_BY_ID.get(id);\n}\n\n/**\n * Match a hostname against the registry. Returns the registered publisher when\n * the hostname equals or is a dotted-subdomain of any of its `hostSuffixes`.\n * Returns `undefined` when no match is found (caller decides on the fallback).\n */\nexport function getPublisherByHost(hostname: string): Publisher | undefined {\n const host = hostname.toLowerCase();\n for (const publisher of PUBLISHERS) {\n for (const suffix of publisher.hostSuffixes) {\n if (host === suffix || host.endsWith(`.${suffix}`)) {\n return publisher;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Resolve the publisher for a publication's site URL.\n *\n * - On a branded host: returns the registered `Publisher` verbatim.\n * - On any other valid URL: returns a synthetic neutral publisher with\n * `id: 'standard'`, `name: <hostname>`, `hostSuffixes: []`, and the URL\n * as `homeUrl`. Cards can therefore always render a meaningful pill label.\n * - On an unparseable string: returns the same neutral shape with the raw\n * input as `name` and `homeUrl` (defensive — should never happen for data\n * coming from a valid `site.standard.publication`).\n */\nexport function getPublisherFromSiteUrl(siteUrl: string): Publisher {\n let hostname: string;\n let homeUrl: string;\n try {\n const parsed = new URL(siteUrl);\n hostname = parsed.hostname;\n homeUrl = `${parsed.protocol}//${parsed.hostname}`;\n } catch {\n return {\n id: STANDARD_PUBLISHER_ID,\n name: siteUrl,\n hostSuffixes: [],\n homeUrl: siteUrl,\n };\n }\n\n const matched = getPublisherByHost(hostname);\n if (matched) return matched;\n\n return {\n id: STANDARD_PUBLISHER_ID,\n name: hostname,\n hostSuffixes: [],\n homeUrl,\n };\n}\n","{\n \"$schema\": \"https://sifa.id/schemas/activity-verbs/v1.json\",\n \"version\": \"1.1.0\",\n \"updated\": \"2026-07-19\",\n \"defaultVerb\": \"created\",\n \"verbs\": {\n \"app.bsky.feed.post\": \"posted\",\n \"blue.flashes.feed.post\": \"posted\",\n \"social.psky.feed.post\": \"posted\",\n \"social.popfeed.feed.post\": \"posted\",\n \"social.popfeed.feed.note\": \"posted\",\n \"social.popfeed.feed.review\": \"reviewed\",\n \"buzz.bookhive.book\": \"reviewed\",\n \"fyi.unravel.frontpage.post\": \"posted\",\n \"forum.barazo.post\": \"posted\",\n \"app.bsky.feed.repost\": \"reposted\",\n \"com.whtwnd.blog.entry\": \"published\",\n \"site.standard.document\": \"published\",\n \"computer.aetheros.page\": \"published\",\n \"link.pastesphere.snippet\": \"published\",\n \"pub.leaflet.comment\": \"published\",\n \"id.sifa.profile.presentation\": \"presented\",\n \"id.sifa.profile.presentationDelivery\": \"presented\",\n \"id.sifa.endorsement\": \"endorsed\",\n \"sh.tangled.repo\": \"shipped\",\n \"sh.tangled.repo.issue\": \"shipped\",\n \"sh.tangled.repo.pull\": \"shipped\",\n \"app.sidetrail.trail\": \"shipped\",\n \"app.sidetrail.walk\": \"shipped\",\n \"social.colibri.membership\": \"joined\",\n \"id.sifa.project.membership\": \"joined\",\n \"id.sifa.project.member\": \"joined\",\n \"community.lexicon.calendar.rsvp\": \"joined\",\n \"at.youandme.connection\": \"joined\",\n \"id.sifa.graph.connection\": \"joined\"\n }\n}\n","import { z } from 'zod';\n\nimport rawVerbs from './verbs.json' with { type: 'json' };\n\n/**\n * The human action a stream item represents — a layer on top of `collection`\n * + `tier`. Groups semantically across apps (\"published\" spans WhiteWind and\n * standard-site; \"posted\" spans Bluesky and Picosky) so a day-grouped feed\n * reads like sentences.\n */\nexport const STREAM_VERBS = [\n 'posted',\n 'reposted',\n 'published',\n 'presented',\n 'endorsed',\n 'joined',\n 'shipped',\n 'reviewed',\n 'created',\n] as const;\n\nexport type StreamVerb = (typeof STREAM_VERBS)[number];\n\n/** Zod enum for a {@link StreamVerb}, shared with the view-model schema. */\nexport const streamVerbSchema = z.enum(STREAM_VERBS);\n\nexport interface ActivityVerbMap {\n version: string;\n updated: string;\n /** Verb returned for any collection not present in `verbs`. */\n defaultVerb: StreamVerb;\n /** Verb keyed by lexicon NSID. */\n verbs: Record<string, StreamVerb>;\n}\n\nconst verbMapSchema = z.object({\n version: z.string(),\n updated: z.string(),\n defaultVerb: streamVerbSchema,\n verbs: z.record(z.string(), streamVerbSchema),\n});\n\nconst parsed: ActivityVerbMap = verbMapSchema.parse(rawVerbs);\n\n/**\n * The verb map, keyed by lexicon NSID. Versioned independently from\n * `activity-tiers.json` so tier and verb evolve on their own cadence.\n */\nexport const ACTIVITY_VERBS: Readonly<ActivityVerbMap> = Object.freeze(parsed);\n\n/**\n * Returns the {@link StreamVerb} for an AT Protocol collection NSID. Unknown\n * or empty collections fall back to the map's `defaultVerb` (`created`).\n */\nexport function verbForCollection(collection: string): StreamVerb {\n if (!collection) return ACTIVITY_VERBS.defaultVerb;\n return ACTIVITY_VERBS.verbs[collection] ?? ACTIVITY_VERBS.defaultVerb;\n}\n\n/** Verb-map version + updated date, for diagnostics and version-skew checks. */\nexport function getActivityVerbsVersion(): { version: string; updated: string } {\n return { version: ACTIVITY_VERBS.version, updated: ACTIVITY_VERBS.updated };\n}\n","import { z } from 'zod';\n\nimport type {\n StreamAddress,\n StreamAuthor,\n StreamCardBody,\n StreamCardSubject,\n StreamCardVM,\n StreamExternalLink,\n StreamGeo,\n StreamMedia,\n StreamRichSegment,\n StreamSource,\n StreamTheme,\n} from './stream-card-vm.js';\nimport { streamVerbSchema } from './verbs.js';\n\n/** RGB channel: finite number in [0, 255] (mirrors `isValidRgbColor`). */\nconst rgbChannelSchema = z.number().min(0).max(255);\nconst rgbColorSchema = z.object({\n r: rgbChannelSchema,\n g: rgbChannelSchema,\n b: rgbChannelSchema,\n});\n\nconst aspectRatioSchema = z.object({\n width: z.number(),\n height: z.number(),\n});\n\nexport const streamSourceSchema: z.ZodType<StreamSource> = z.object({\n appId: z.string(),\n label: z.string(),\n color: z.string(),\n});\n\nexport const streamAuthorSchema: z.ZodType<StreamAuthor> = z.object({\n did: z.string().optional(),\n handle: z.string().optional(),\n displayName: z.string().optional(),\n avatar: z.string().optional(),\n});\n\nexport const streamThemeSchema: z.ZodType<StreamTheme> = z.object({\n background: rgbColorSchema,\n foreground: rgbColorSchema,\n accent: rgbColorSchema,\n});\n\nconst streamMediaResolvedSchema = z.object({\n url: z.string(),\n alt: z.string(),\n aspectRatio: aspectRatioSchema.optional(),\n mimeType: z.string().optional(),\n});\n\nconst streamMediaBlobSchema = z.object({\n did: z.string(),\n cid: z.string(),\n alt: z.string(),\n aspectRatio: aspectRatioSchema.optional(),\n mimeType: z.string().optional(),\n});\n\nexport const streamMediaSchema: z.ZodType<StreamMedia> = z.union([\n streamMediaResolvedSchema,\n streamMediaBlobSchema,\n]);\n\nexport const streamExternalLinkSchema: z.ZodType<StreamExternalLink> = z.object({\n url: z.string(),\n title: z.string().optional(),\n thumb: z.string().optional(),\n});\n\nexport const streamGeoSchema: z.ZodType<StreamGeo> = z.object({\n latitude: z.number(),\n longitude: z.number(),\n});\n\nexport const streamAddressSchema: z.ZodType<StreamAddress> = z.object({\n name: z.string().optional(),\n street: z.string().optional(),\n locality: z.string().optional(),\n region: z.string().optional(),\n country: z.string().optional(),\n postalCode: z.string().optional(),\n});\n\nexport const streamRichSegmentSchema: z.ZodType<StreamRichSegment> = z.object({\n text: z.string(),\n link: z.string().optional(),\n mention: z.string().optional(),\n tag: z.string().optional(),\n});\n\nexport const streamCardBodySchema: z.ZodType<StreamCardBody> = z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('text'),\n text: z.string(),\n richSegments: z.array(streamRichSegmentSchema).optional(),\n tags: z.array(z.string()).optional(),\n }),\n z.object({\n kind: z.literal('media'),\n text: z.string().optional(),\n tags: z.array(z.string()).optional(),\n }),\n z.object({\n kind: z.literal('link'),\n text: z.string().optional(),\n tags: z.array(z.string()).optional(),\n }),\n z.object({\n kind: z.literal('track'),\n text: z.string().optional(),\n trackTitle: z.string().optional(),\n artist: z.string().optional(),\n }),\n z.object({\n kind: z.literal('generic'),\n text: z.string().optional(),\n tags: z.array(z.string()).optional(),\n }),\n z.object({\n kind: z.literal('github-pr'),\n repoOwner: z.string(),\n repoName: z.string(),\n prNumber: z.number(),\n title: z.string(),\n url: z.string().optional(),\n language: z.string().optional(),\n additions: z.number(),\n deletions: z.number(),\n mergedAt: z.string().optional(),\n }),\n z.object({\n kind: z.literal('book'),\n title: z.string(),\n authors: z.array(z.string()),\n stars: z.number().optional(),\n status: z.string().optional(),\n review: z.string().optional(),\n }),\n z.object({\n kind: z.literal('media-review'),\n reviewKind: z.enum(['review', 'post', 'note', 'other']),\n title: z.string().optional(),\n mediaType: z.string().optional(),\n rating: z.number().optional(),\n mainCredit: z.string().optional(),\n reviewText: z.string().optional(),\n isRevisit: z.boolean(),\n }),\n z.object({\n kind: z.literal('event-rsvp'),\n rsvpStatus: z.enum(['going', 'interested', 'notgoing', 'unknown']),\n eventName: z.string().optional(),\n startsAt: z.string().optional(),\n endsAt: z.string().optional(),\n mode: z.enum(['inperson', 'virtual', 'hybrid']).optional(),\n locationName: z.string().optional(),\n locationLocality: z.string().optional(),\n locationCountry: z.string().optional(),\n }),\n z.object({\n kind: z.literal('verification'),\n platform: z.string(),\n verified: z.boolean(),\n subjectLabel: z.string().optional(),\n handle: z.string().optional(),\n profileUrl: z.string().optional(),\n }),\n z.object({\n kind: z.literal('membership'),\n communityName: z.string().optional(),\n description: z.string().optional(),\n communityUri: z.string().optional(),\n }),\n z.object({\n kind: z.literal('location'),\n venueName: z.string().optional(),\n shout: z.string().optional(),\n address: streamAddressSchema.optional(),\n geo: streamGeoSchema.optional(),\n }),\n z.object({\n kind: z.literal('travel'),\n origin: z.string().optional(),\n destination: z.string().optional(),\n transportation: z.string().optional(),\n carrier: z.string().optional(),\n carrierCode: z.string().optional(),\n startDate: z.string().optional(),\n endDate: z.string().optional(),\n }),\n z.object({\n kind: z.literal('standard-site'),\n title: z.string().optional(),\n description: z.string().optional(),\n siteUrl: z.string().optional(),\n path: z.string().optional(),\n publisherName: z.string().optional(),\n icon: z.string().optional(),\n coverImageUrl: z.string().optional(),\n readingTime: z.number().optional(),\n publishedAt: z.string().optional(),\n }),\n]);\n\n/**\n * A stream item's repost / reply / quote target. The `post` variant nests a\n * full {@link streamCardVMSchema} (deferred via `z.lazy` for recursion).\n */\nexport const streamCardSubjectSchema: z.ZodType<StreamCardSubject> = z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('post'),\n post: z.lazy(() => streamCardVMSchema),\n }),\n z.object({\n kind: z.literal('person'),\n did: z.string(),\n handle: z.string().optional(),\n displayName: z.string().optional(),\n avatar: z.string().optional(),\n }),\n z.object({\n kind: z.literal('record'),\n uri: z.string(),\n title: z.string().optional(),\n }),\n]);\n\n/** Zod schema for a {@link StreamCardVM}. Recursive through `subject.post`. */\nexport const streamCardVMSchema: z.ZodType<StreamCardVM> = z.lazy(() =>\n z.object({\n uri: z.string(),\n cid: z.string(),\n verb: streamVerbSchema,\n source: streamSourceSchema,\n author: streamAuthorSchema.optional(),\n tier: z.enum(['creation', 'action', 'filtered']),\n timestamp: z.string(),\n title: z.string(),\n sourceUrl: z.string().optional(),\n body: streamCardBodySchema.optional(),\n media: z.array(streamMediaSchema).optional(),\n externalLink: streamExternalLinkSchema.optional(),\n theme: streamThemeSchema.optional(),\n subject: z.lazy(() => streamCardSubjectSchema).optional(),\n }),\n);\n","import { z } from 'zod';\n\n/**\n * Grapheme-aware refinement matching the AT Protocol lexicon `maxGraphemes`\n * constraint. JS strings are sequences of UTF-16 code units, but lexicon\n * `maxGraphemes` counts user-perceived characters (grapheme clusters), so\n * emoji sequences, regional indicators, ZWJ joins, and combining marks all\n * count as one unit each. We use `Intl.Segmenter` to enforce this correctly.\n */\nexport function maxGraphemes(max: number) {\n return (value: string): boolean => {\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n let count = 0;\n for (const _ of segmenter.segment(value)) {\n count++;\n if (count > max) return false;\n }\n return true;\n };\n}\n\n/** Decentralized identifier, AT Protocol `format: did`. */\nexport const didSchema = z.string().regex(/^did:[a-z]+:[a-zA-Z0-9._:%-]+$/, 'Invalid DID');\n\n/** RFC 3339 datetime with timezone offset, AT Protocol `format: datetime`. */\nexport const datetimeSchema = z.string().datetime({ offset: true });\n\n/**\n * Freeform calendar date for user-facing profile dates (start/end, issued,\n * completed, awarded, published, etc.). Accepts a bare year, year-month,\n * year-month-day, or a full datetime (so a legacy record's RFC-3339 date maps\n * through on backfill without loss). NOT strict `datetime` -- users typically\n * remember only month/year, and LinkedIn-importer writes carry partial dates,\n * so the lexicons document these as freeform `YYYY-MM` / `YYYY-MM-DD`. Record\n * metadata like `createdAt` stays on `datetimeSchema`.\n */\nexport const partialDateSchema = z\n .string()\n .regex(/^\\d{4}(-\\d{2}(-\\d{2}(T.+)?)?)?$/, 'Expected YYYY, YYYY-MM, YYYY-MM-DD, or a datetime');\n\n/** Generic AT-URI, AT Protocol `format: at-uri`. */\nexport const atUriSchema = z.string().regex(/^at:\\/\\/[^\\s]+$/, 'Invalid AT-URI');\n\n/** Content identifier, AT Protocol `format: cid`. Loose validation -- accepts CIDv0 and CIDv1. */\nexport const cidSchema = z\n .string()\n .regex(/^(Qm[1-9A-HJ-NP-Za-km-z]{44}|b[A-Za-z0-9+/=]+)$/, 'Invalid CID');\n\n/** BCP 47 language tag, AT Protocol `format: language`. */\nexport const languageTagSchema = z\n .string()\n .regex(/^[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*$/, 'Invalid BCP 47 language tag');\n\n/** Generic URI, AT Protocol `format: uri`. */\nexport const uriSchema = z.string().url();\n\n/**\n * StrongRef shape from `com.atproto.repo.strongRef` -- pins a record by both\n * AT-URI (identity) and CID (version).\n */\nexport const strongRefSchema = z.object({\n uri: atUriSchema,\n cid: cidSchema,\n});\n\n/**\n * Reference to a record by AT-URI, with an optional CID. Mirrors\n * `id.sifa.defs#externalRecordRef`. Unlike a strongRef the CID is optional:\n * consumers resolve the AT-URI live so the reference tracks edits to the\n * target, and the CID is a best-effort integrity hint only.\n */\nexport const externalRecordRefSchema = z.object({\n uri: atUriSchema,\n cid: cidSchema.optional(),\n});\n\n/**\n * Self-labels shape from `com.atproto.label.defs#selfLabels`. Modelled\n * permissively because clients rarely construct this directly; the AppView\n * handles label validation.\n */\nexport const selfLabelsSchema = z.object({\n $type: z.literal('com.atproto.label.defs#selfLabels').optional(),\n values: z.array(z.object({ val: z.string() })),\n});\n","/**\n * Publisher allowlist for the Standard.site rich embed.\n *\n * Mirrors `bluesky-social/social-app`\n * `src/components/Post/Embed/StandardSiteEmbed/publishers.ts`. The only\n * gate this provides is which publishers get the highlighted\n * \"Subscribe on {Publisher}\" CTA with a publisher icon vs the plain\n * \"View publication\" fallback — any Standard.site embed renders\n * regardless of allowlist membership.\n *\n * Sync policy: review additions against the upstream bsky list weekly;\n * Singi Labs reviews before merge.\n */\n\nexport interface Publisher {\n /** Lowercase host. Subdomains are matched via `hostMatches`. */\n host: string;\n /** Human-facing publisher name shown in CTA copy. */\n name: string;\n /**\n * Stable identifier used by clients to look up brand icons. The SDK\n * does not ship icon assets — sifa-web maintains them keyed by this\n * id so React Native vs web rendering can diverge.\n */\n iconKey: 'leaflet' | 'pckt' | 'offprint';\n}\n\nexport const STANDARD_SITE_PUBLISHERS: readonly Publisher[] = Object.freeze([\n { host: 'leaflet.pub', name: 'Leaflet', iconKey: 'leaflet' },\n { host: 'pckt.blog', name: 'pckt', iconKey: 'pckt' },\n { host: 'offprint.app', name: 'Offprint', iconKey: 'offprint' },\n]);\n\n/**\n * Returns true when `host` exactly matches `target` or is a subdomain of\n * it. Hosts are expected to be lowercase already.\n */\nexport function hostMatches(host: string, target: string): boolean {\n return host === target || host.endsWith('.' + target);\n}\n\nfunction hostFromUri(uri: string | undefined | null): string | null {\n if (!uri) return null;\n try {\n return new URL(uri).host.toLowerCase();\n } catch {\n return null;\n }\n}\n\n/**\n * Match a publisher by host. Returns the publisher when `host` is on the\n * allowlist (exact or subdomain match), null otherwise. Host should be\n * lowercase.\n */\nexport function matchPublisherByHost(host: string | null | undefined): Publisher | null {\n if (!host) return null;\n const lower = host.toLowerCase();\n return STANDARD_SITE_PUBLISHERS.find((p) => hostMatches(lower, p.host)) ?? null;\n}\n\n/**\n * Match a publisher by URI. Convenience wrapper around\n * `matchPublisherByHost` for callers that have a publication URL handy.\n */\nexport function matchPublisherByUri(uri: string | undefined | null): Publisher | null {\n return matchPublisherByHost(hostFromUri(uri));\n}\n","import { resolveCardUrl } from '../cards/resolve-card-url.js';\nimport { isVisibleActivityItem } from '../cards/visibility.js';\nimport { isValidRgbColor } from '../format/wcag-contrast.js';\nimport { matchPublisherByUri } from '../publishing/index.js';\nimport { getActivityTier } from '../taxonomy/activity-tiers.js';\nimport type { ActivityItem } from './activity-item.js';\nimport type {\n StreamAddress,\n StreamAuthor,\n StreamCardBody,\n StreamCardSubject,\n StreamCardVM,\n StreamExternalLink,\n StreamGeo,\n StreamMedia,\n StreamRichSegment,\n StreamSource,\n StreamTheme,\n} from './stream-card-vm.js';\nimport { verbForCollection, type StreamVerb } from './verbs.js';\n\n/** Neutral fallback token — matches sifa-api's synthetic app-registry entry. */\nconst DEFAULT_SOURCE_COLOR = 'slate';\n\n/**\n * Options for {@link toStreamCardVM}. Kept out of the record so the transform\n * stays pure (no I/O): the app registry is runtime data, so callers inject a\n * color resolver built from the registry they already fetched.\n */\nexport interface ToStreamCardVMOptions {\n /**\n * Resolve an app's design-token color NAME (not a hex literal) from its\n * appId. Falls back to `slate` when unresolved.\n */\n resolveSourceColor?: (appId: string) => string | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Small pure helpers\n// ---------------------------------------------------------------------------\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' ? (value as Record<string, unknown>) : null;\n}\n\nfunction asNonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\n/** at://did:plc:xxx/collection/rkey → the authoring DID. */\nfunction didFromUri(uri: string): string | undefined {\n const match = uri.match(/^at:\\/\\/(did:[^/]+)\\//);\n return match?.[1];\n}\n\n/** Extract the CID from an AT Protocol blob ref (`ref.$link` or a bare string). */\nfunction blobCid(blob: unknown): string | undefined {\n const rec = asRecord(blob);\n if (!rec) return undefined;\n const ref = rec.ref;\n if (typeof ref === 'string') return ref;\n const link = asRecord(ref)?.['$link'];\n return typeof link === 'string' ? link : undefined;\n}\n\nfunction aspectRatio(value: unknown): { width: number; height: number } | undefined {\n const rec = asRecord(value);\n const width = rec?.width;\n const height = rec?.height;\n if (typeof width === 'number' && typeof height === 'number') return { width, height };\n return undefined;\n}\n\nfunction asFiniteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\n/**\n * Extract a blob CID tolerating both a proper blob (`ref.$link`) and the\n * denormalized `{ cid }` shape some apps (BookHive, Colibri) store.\n */\nfunction looseBlobCid(value: unknown): string | undefined {\n const viaRef = blobCid(value);\n if (viaRef) return viaRef;\n const cid = asRecord(value)?.cid;\n return typeof cid === 'string' && cid.length > 0 ? cid : undefined;\n}\n\n/** A single blob-ref media item from a blob value, or undefined when absent. */\nfunction blobMedia(value: unknown, did: string, alt: string): StreamMedia | undefined {\n const cid = looseBlobCid(value);\n if (!cid) return undefined;\n const media: StreamMedia = { did, cid, alt };\n const ratio = aspectRatio(asRecord(value)?.aspectRatio);\n if (ratio) media.aspectRatio = ratio;\n const mimeType = asNonEmptyString(asRecord(value)?.mimeType);\n if (mimeType) media.mimeType = mimeType;\n return media;\n}\n\n/** The `#suffix` of an NSID-with-hash value (`x#going` → `#going`), else ''. */\nfunction hashSuffix(value: string): string {\n const i = value.lastIndexOf('#');\n return i >= 0 ? value.slice(i) : '';\n}\n\nconst WORDS_PER_MINUTE = 200;\n\n/** Estimated reading time in minutes from body text (matches sifa-web). */\nfunction estimateReadingTime(text: string | undefined): number | undefined {\n if (!text) return undefined;\n const words = text.trim().split(/\\s+/).filter(Boolean).length;\n if (words === 0) return undefined;\n return Math.max(1, Math.round(words / WORDS_PER_MINUTE));\n}\n\n/** Parse a beacon `location` into numeric geo. Lat/long may be string or number. */\nfunction beaconGeo(value: unknown): StreamGeo | undefined {\n const rec = asRecord(value);\n if (!rec) return undefined;\n const { latitude, longitude } = rec;\n const okType = (v: unknown): v is string | number =>\n typeof v === 'string' || typeof v === 'number';\n if (!okType(latitude) || !okType(longitude)) return undefined;\n const lat = Number(latitude);\n const lng = Number(longitude);\n if (!Number.isFinite(lat) || !Number.isFinite(lng)) return undefined;\n return { latitude: lat, longitude: lng };\n}\n\n/** Parse a beacon `addressDetails` into a structured address, or undefined. */\nfunction beaconAddress(value: unknown): StreamAddress | undefined {\n const rec = asRecord(value);\n if (!rec) return undefined;\n const address: StreamAddress = {};\n const name = asNonEmptyString(rec.name);\n if (name) address.name = name;\n const street = asNonEmptyString(rec.street);\n if (street) address.street = street;\n const locality = asNonEmptyString(rec.locality);\n if (locality) address.locality = locality;\n const region = asNonEmptyString(rec.region);\n if (region) address.region = region;\n const country = asNonEmptyString(rec.country);\n if (country) address.country = country;\n const postalCode = asNonEmptyString(rec.postalCode);\n if (postalCode) address.postalCode = postalCode;\n return Object.keys(address).length > 0 ? address : undefined;\n}\n\n/** Split BookHive's tab-separated authors into a trimmed, non-empty list. */\nfunction parseAuthors(value: unknown): string[] {\n if (typeof value !== 'string') return [];\n return value\n .split('\\t')\n .map((a) => a.trim())\n .filter((a) => a.length > 0);\n}\n\n// ---------------------------------------------------------------------------\n// Chrome\n// ---------------------------------------------------------------------------\n\nfunction buildSource(item: ActivityItem, options: ToStreamCardVMOptions): StreamSource {\n return {\n appId: item.appId,\n label: item.appName,\n color: options.resolveSourceColor?.(item.appId) ?? DEFAULT_SOURCE_COLOR,\n };\n}\n\n/**\n * The author identity for a card, from the AppView-injected handle / display\n * name / avatar and the DID parsed from the record uri. Returns undefined when\n * nothing is known (e.g. a Fediverse post whose uri is an http permalink, not\n * an at-uri, and carries no injected author fields), so the field stays absent\n * rather than an empty object.\n */\nfunction buildAuthor(item: ActivityItem): StreamAuthor | undefined {\n const did = didFromUri(item.uri);\n const handle = asNonEmptyString(item.authorHandle);\n const displayName = asNonEmptyString(item.authorDisplayName);\n const avatar = asNonEmptyString(item.authorAvatar);\n if (!did && !handle && !displayName && !avatar) return undefined;\n const author: StreamAuthor = {};\n if (did) author.did = did;\n if (handle) author.handle = handle;\n if (displayName) author.displayName = displayName;\n if (avatar) author.avatar = avatar;\n return author;\n}\n\n// Post-type verbs drop the app name (the source pill already shows it, so\n// \"Posted on Bluesky network\" reads as redundant); verbs where the platform\n// adds meaning keep \"on {App}\".\nconst TITLE_BY_VERB: Record<StreamVerb, (label: string) => string> = {\n posted: () => 'Posted',\n reposted: () => 'Reposted',\n published: (label) => `Published on ${label}`,\n presented: () => 'Gave a presentation',\n endorsed: () => 'Wrote an endorsement',\n joined: (label) => `Joined ${label}`,\n shipped: (label) => `Shipped on ${label}`,\n reviewed: (label) => `Reviewed on ${label}`,\n created: (label) => `Shared on ${label}`,\n};\n\nfunction buildTitle(verb: StreamVerb, label: string): string {\n return TITLE_BY_VERB[verb](label);\n}\n\n/**\n * The canonical http(s) permalink to this record on its source app, or\n * undefined. Delegates to the shared, pure {@link resolveCardUrl} using the\n * author DID parsed from the uri and the author handle — the AppView-injected\n * {@link ActivityItem.authorHandle}, falling back to a handle the record itself\n * carries. With a handle, handle-keyed apps (Bluesky, Popfeed, Tangled, ...)\n * resolve; did/uri/record.url-addressable apps (Smokesignal events, GitHub PRs,\n * Standard.site docs, ...) resolve from the uri alone. Only non-null http(s)\n * URLs are returned.\n */\nfunction resolveSourceUrl(item: ActivityItem, record: Record<string, unknown>): string | undefined {\n const authorDid = didFromUri(item.uri);\n if (!authorDid) return undefined;\n const authorHandle = asNonEmptyString(item.authorHandle) ?? asNonEmptyString(record.handle);\n const url = resolveCardUrl({\n collection: item.collection,\n record,\n uri: item.uri,\n rkey: item.rkey,\n authorDid,\n ...(authorHandle ? { authorHandle } : {}),\n });\n return url && /^https?:\\/\\//i.test(url) ? url : undefined;\n}\n\n/** Per-record RGB theme (publication / standard-site cards). Validated. */\nfunction readTheme(record: Record<string, unknown> | null): StreamTheme | undefined {\n const theme = asRecord(record?.publicationTheme ?? record?.theme);\n if (!theme) return undefined;\n const { background, foreground, accent } = theme;\n if (isValidRgbColor(background) && isValidRgbColor(foreground) && isValidRgbColor(accent)) {\n return { background, foreground, accent };\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Bluesky post body\n// ---------------------------------------------------------------------------\n\nfunction bskyImages(embed: Record<string, unknown>, did: string): StreamMedia[] {\n const images = embed.images;\n if (!Array.isArray(images)) return [];\n const out: StreamMedia[] = [];\n for (const raw of images) {\n const img = asRecord(raw);\n if (!img) continue;\n const cid = blobCid(img.image);\n if (!cid) continue;\n const media: StreamMedia = { did, cid, alt: asNonEmptyString(img.alt) ?? '' };\n const ratio = aspectRatio(img.aspectRatio);\n if (ratio) media.aspectRatio = ratio;\n const mimeType = asNonEmptyString(asRecord(img.image)?.mimeType);\n if (mimeType) media.mimeType = mimeType;\n out.push(media);\n }\n return out;\n}\n\nfunction bskyExternal(embed: Record<string, unknown>): StreamExternalLink | undefined {\n const external = asRecord(embed.external);\n if (!external) return undefined;\n const url = asNonEmptyString(external.uri);\n if (!url) return undefined;\n const link: StreamExternalLink = { url };\n const title = asNonEmptyString(external.title);\n if (title) link.title = title;\n // The raw record's `external.thumb` is a blob, not a URL. Resolving it would\n // require building a CDN URL, which is a surface concern — leave `thumb`\n // unset for now (M2 widens externalLink to carry blob refs if needed).\n return link;\n}\n\ninterface BskyEmbedContent {\n media?: StreamMedia[];\n externalLink?: StreamExternalLink;\n}\n\nfunction bskyEmbedContent(record: Record<string, unknown>, did: string): BskyEmbedContent {\n const embed = asRecord(record.embed);\n if (!embed) return {};\n\n // recordWithMedia wraps the media (images/external) alongside a quoted record.\n const type = asNonEmptyString(embed['$type']);\n const target = type === 'app.bsky.embed.recordWithMedia' ? asRecord(embed.media) : embed;\n if (!target) return {};\n\n if (Array.isArray(target.images)) {\n const media = bskyImages(target, did);\n return media.length > 0 ? { media } : {};\n }\n if (target.external != null) {\n const externalLink = bskyExternal(target);\n return externalLink ? { externalLink } : {};\n }\n return {};\n}\n\nfunction applyBskyPost(\n vm: StreamCardVM,\n item: ActivityItem,\n record: Record<string, unknown> | null,\n): StreamCardVM {\n if (!record) {\n vm.body = { kind: 'generic' };\n return vm;\n }\n\n const did = didFromUri(item.uri);\n const text = asNonEmptyString(record.text);\n const { media, externalLink } = did ? bskyEmbedContent(record, did) : {};\n if (media) vm.media = media;\n if (externalLink) vm.externalLink = externalLink;\n\n let body: StreamCardBody;\n if (text) body = { kind: 'text', text };\n else if (vm.media) body = { kind: 'media' };\n else if (vm.externalLink) body = { kind: 'link' };\n else body = { kind: 'generic' };\n vm.body = body;\n return vm;\n}\n\n// ---------------------------------------------------------------------------\n// App-specific body variants\n// ---------------------------------------------------------------------------\n\n/** Fall back to a generic body when the record is missing/invalid. */\nfunction withGeneric(vm: StreamCardVM): StreamCardVM {\n vm.body = { kind: 'generic' };\n return vm;\n}\n\n/**\n * Ingested Fediverse post (`fediverse.post`). Its `url` is the post's own\n * permalink, so it becomes the card's `sourceUrl` (the renderer makes the whole\n * card clickable) rather than an `externalLink` (which would render the raw URL\n * as visible text). The item uri is that http permalink, not an at-uri, so the\n * generic `resolveSourceUrl` path -- which parses a DID out of the uri -- can't\n * set it; do it here.\n */\nfunction applyFediversePost(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const url = httpUrl(record.url);\n if (url) vm.sourceUrl = url;\n const text = asNonEmptyString(record.excerpt);\n vm.body = text ? { kind: 'text', text } : { kind: 'generic' };\n return vm;\n}\n\nfunction applyGithubPr(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const body: Extract<StreamCardBody, { kind: 'github-pr' }> = {\n kind: 'github-pr',\n repoOwner: asNonEmptyString(record.repoOwner) ?? '',\n repoName: asNonEmptyString(record.repoName) ?? '',\n prNumber: asFiniteNumber(record.prNumber) ?? 0,\n title: asNonEmptyString(record.title) ?? '',\n additions: asFiniteNumber(record.additions) ?? 0,\n deletions: asFiniteNumber(record.deletions) ?? 0,\n };\n const url = asNonEmptyString(record.url);\n if (url) body.url = url;\n const language = asNonEmptyString(record.language);\n if (language) body.language = language;\n const mergedAt = asNonEmptyString(record.mergedAt);\n if (mergedAt) body.mergedAt = mergedAt;\n vm.body = body;\n return vm;\n}\n\nfunction applyBook(\n vm: StreamCardVM,\n item: ActivityItem,\n record: Record<string, unknown>,\n): StreamCardVM {\n const title = asNonEmptyString(record.title) ?? 'Untitled book';\n const body: Extract<StreamCardBody, { kind: 'book' }> = {\n kind: 'book',\n title,\n authors: parseAuthors(record.authors),\n };\n const stars = asFiniteNumber(record.stars);\n if (stars !== undefined && stars > 0) body.stars = stars;\n const status = asNonEmptyString(record.status);\n if (status) body.status = status;\n const review = asNonEmptyString(\n typeof record.review === 'string' ? record.review.trim() : undefined,\n );\n if (review) body.review = review;\n vm.body = body;\n\n const did = didFromUri(item.uri);\n if (did) {\n const cover = blobMedia(record.cover, did, `The cover of ${title}`);\n if (cover) vm.media = [cover];\n }\n return vm;\n}\n\nfunction popfeedReviewKind(collection: string): 'review' | 'post' | 'note' | 'other' {\n if (collection.endsWith('.review')) return 'review';\n if (collection.endsWith('.post')) return 'post';\n if (collection.endsWith('.note')) return 'note';\n return 'other';\n}\n\nfunction applyMediaReview(\n vm: StreamCardVM,\n item: ActivityItem,\n record: Record<string, unknown>,\n): StreamCardVM {\n const title = asNonEmptyString(record.title) ?? asNonEmptyString(record.name);\n const body: Extract<StreamCardBody, { kind: 'media-review' }> = {\n kind: 'media-review',\n reviewKind: popfeedReviewKind(item.collection),\n isRevisit: record.isRevisit === true,\n };\n if (title) body.title = title;\n const mediaType = asNonEmptyString(record.creativeWorkType);\n if (mediaType) body.mediaType = mediaType;\n const rating = asFiniteNumber(record.rating);\n if (rating !== undefined) body.rating = rating;\n const mainCredit = asNonEmptyString(record.mainCredit);\n if (mainCredit) body.mainCredit = mainCredit;\n const reviewText = asNonEmptyString(record.text);\n if (reviewText) body.reviewText = reviewText;\n vm.body = body;\n\n const posterUrl = asNonEmptyString(record.posterUrl);\n if (posterUrl) vm.media = [{ url: posterUrl, alt: title ? `${title} poster` : '' }];\n return vm;\n}\n\nconst RSVP_STATUS: Record<string, 'going' | 'interested' | 'notgoing'> = {\n '#going': 'going',\n '#interested': 'interested',\n '#notgoing': 'notgoing',\n};\n\nconst RSVP_MODE: Record<string, 'inperson' | 'virtual' | 'hybrid'> = {\n '#inperson': 'inperson',\n '#virtual': 'virtual',\n '#hybrid': 'hybrid',\n};\n\nfunction applyEventRsvp(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const status = asNonEmptyString(record.status);\n const body: Extract<StreamCardBody, { kind: 'event-rsvp' }> = {\n kind: 'event-rsvp',\n rsvpStatus: (status ? RSVP_STATUS[hashSuffix(status)] : undefined) ?? 'unknown',\n };\n const meta = asRecord(record.eventMeta);\n if (meta) {\n const eventName = asNonEmptyString(meta.name);\n if (eventName) body.eventName = eventName;\n const startsAt = asNonEmptyString(meta.startsAt);\n if (startsAt) body.startsAt = startsAt;\n const endsAt = asNonEmptyString(meta.endsAt);\n if (endsAt) body.endsAt = endsAt;\n const mode = asNonEmptyString(meta.mode);\n const modeEnum = mode ? RSVP_MODE[hashSuffix(mode)] : undefined;\n if (modeEnum) body.mode = modeEnum;\n const locationName = asNonEmptyString(meta.locationName);\n if (locationName) body.locationName = locationName;\n const locationLocality = asNonEmptyString(meta.locationLocality);\n if (locationLocality) body.locationLocality = locationLocality;\n const locationCountry = asNonEmptyString(meta.locationCountry);\n if (locationCountry) body.locationCountry = locationCountry;\n }\n vm.body = body;\n return vm;\n}\n\nfunction applyKeytraceVerification(\n vm: StreamCardVM,\n record: Record<string, unknown>,\n): StreamCardVM {\n const identity = asRecord(record.identity) ?? {};\n const subject = asNonEmptyString(identity.subject);\n const displayName = asNonEmptyString(identity.displayName);\n const body: Extract<StreamCardBody, { kind: 'verification' }> = {\n kind: 'verification',\n platform: asNonEmptyString(record.type) ?? 'unknown',\n verified: record.status === 'verified',\n };\n const subjectLabel = displayName ?? subject;\n if (subjectLabel) body.subjectLabel = subjectLabel;\n const profileUrl = asNonEmptyString(identity.profileUrl);\n if (profileUrl) body.profileUrl = profileUrl;\n vm.body = body;\n return vm;\n}\n\nfunction applyBskyVerification(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const handle = asNonEmptyString(record.handle);\n const displayName = asNonEmptyString(record.displayName);\n const body: Extract<StreamCardBody, { kind: 'verification' }> = {\n kind: 'verification',\n platform: 'bluesky',\n verified: true,\n };\n const subjectLabel = displayName ?? handle;\n if (subjectLabel) body.subjectLabel = subjectLabel;\n if (handle) body.handle = handle;\n vm.body = body;\n return vm;\n}\n\nfunction applyMembership(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const body: Extract<StreamCardBody, { kind: 'membership' }> = { kind: 'membership' };\n const communityUri = asNonEmptyString(record.community);\n if (communityUri) body.communityUri = communityUri;\n\n const meta = asRecord(record.communityMeta);\n const communityName = meta ? asNonEmptyString(meta.name) : undefined;\n if (communityName) body.communityName = communityName;\n const description = meta ? asNonEmptyString(meta.description) : undefined;\n if (description) body.description = description;\n vm.body = body;\n\n if (meta) {\n const ownerDid =\n asNonEmptyString(meta.ownerDid) ?? (communityUri ? didFromUri(communityUri) : undefined);\n if (ownerDid) {\n const picture = blobMedia(meta.picture, ownerDid, communityName ?? '');\n if (picture) vm.media = [picture];\n }\n }\n return vm;\n}\n\nfunction applyLocation(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const body: Extract<StreamCardBody, { kind: 'location' }> = { kind: 'location' };\n const venueName = asNonEmptyString(record.venueName);\n if (venueName) body.venueName = venueName;\n const shout = asNonEmptyString(record.shout);\n if (shout) body.shout = shout;\n const address = beaconAddress(record.addressDetails);\n if (address) body.address = address;\n const geo = beaconGeo(record.location);\n if (geo) body.geo = geo;\n vm.body = body;\n return vm;\n}\n\nfunction applyTravel(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const body: Extract<StreamCardBody, { kind: 'travel' }> = { kind: 'travel' };\n const origin = asNonEmptyString(record.originTransportCode);\n if (origin) body.origin = origin;\n const destination = asNonEmptyString(record.destinationTransportCode);\n if (destination) body.destination = destination;\n const transportation = asNonEmptyString(record.transportation);\n if (transportation) body.transportation = transportation;\n const carrier = asNonEmptyString(record.carrier);\n if (carrier) body.carrier = carrier;\n const carrierCode = asNonEmptyString(record.carrierCode);\n if (carrierCode) body.carrierCode = carrierCode;\n const startDate = asNonEmptyString(record.startDate);\n if (startDate) body.startDate = startDate;\n const endDate = asNonEmptyString(record.endDate);\n if (endDate) body.endDate = endDate;\n vm.body = body;\n return vm;\n}\n\nfunction applyStandardSite(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const body: Extract<StreamCardBody, { kind: 'standard-site' }> = { kind: 'standard-site' };\n const title = asNonEmptyString(record.title);\n if (title) body.title = title;\n const description = asNonEmptyString(record.description);\n if (description) body.description = description;\n const siteUrl = asNonEmptyString(record.siteUrl);\n if (siteUrl) {\n body.siteUrl = siteUrl;\n const publisherName = matchPublisherByUri(siteUrl)?.name;\n if (publisherName) body.publisherName = publisherName;\n }\n const path = asNonEmptyString(record.path);\n if (path) body.path = path;\n const icon = asNonEmptyString(record.publicationIcon);\n if (icon) body.icon = icon;\n const coverImageUrl = asNonEmptyString(record.coverImageUrl);\n if (coverImageUrl) body.coverImageUrl = coverImageUrl;\n const readingTime = estimateReadingTime(asNonEmptyString(record.textContent));\n if (readingTime !== undefined) body.readingTime = readingTime;\n const publishedAt = asNonEmptyString(record.publishedAt);\n if (publishedAt) body.publishedAt = publishedAt;\n vm.body = body;\n return vm;\n}\n\n/** at.youandme.connection: the record's `subject` is a bare person DID. */\nfunction applyYouAndMe(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const did = asNonEmptyString(record.subject);\n if (did) vm.subject = { kind: 'person', did };\n vm.body = { kind: 'generic' };\n return vm;\n}\n\n/** fyi.asq.answer: the record's `subject.uri` is the answered question. */\nfunction applyAsqAnswer(vm: StreamCardVM, record: Record<string, unknown>): StreamCardVM {\n const uri = asNonEmptyString(asRecord(record.subject)?.uri);\n if (uri) vm.subject = { kind: 'record', uri };\n vm.body = { kind: 'generic' };\n return vm;\n}\n\n// ---------------------------------------------------------------------------\n// Generic content extraction (base collections + unknown / future apps)\n// ---------------------------------------------------------------------------\n//\n// Collections without a typed body variant (Margin, Tangled, KipClip, Grain,\n// asq questions, Semble, Passports fifty-states, Streamplace, and every\n// unrecognized/future app) fall here. The rules below are GROUNDED in the\n// sifa-web card sources so each base collection reproduces the visible content\n// its dedicated card renders; for genuinely unknown records the same shapes act\n// as a best-effort heuristic, degrading to an empty generic body when a record\n// carries no recognizable text, media, link, or subject.\n\n/** A string with at least one non-whitespace character, else undefined. */\nfunction nonBlankString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value : undefined;\n}\n\n/** Read a `body` field that is a plain string OR `{ value: string }` (Margin). */\nfunction readBodyField(value: unknown): string | undefined {\n const direct = nonBlankString(value);\n if (direct) return direct;\n return nonBlankString(asRecord(value)?.value);\n}\n\n/** An http(s) URL string, else undefined. */\nfunction httpUrl(value: unknown): string | undefined {\n return typeof value === 'string' && /^https?:\\/\\//i.test(value) ? value : undefined;\n}\n\n/**\n * Ordered human-visible text fields. `body` (handled specially for the\n * `{ value }` shape) follows `content` and `excerpt`, before `message`. Mirrors\n * the union of fields the base cards read (generic\n * `text|title|name|description|content`, Tangled `name|title|text|message`,\n * Margin `body`, asq `title|body`). `excerpt` carries the post text for\n * external-feed items (Fediverse `fediverse.post`, RSS), which have no\n * `text`/`content` field.\n */\nconst GENERIC_TEXT_ORDER = [\n 'text',\n 'title',\n 'name',\n 'description',\n 'content',\n 'excerpt',\n 'body',\n 'message',\n 'note',\n 'caption',\n 'summary',\n 'status',\n] as const;\n\n/** The record's primary human-visible text, or undefined. */\nfunction genericText(collection: string, record: Record<string, unknown>): string | undefined {\n // Passports fifty-states carries no free-text field — its card composes\n // \"Visited {city}, {state}\". Only `city` is a real record string; the state\n // name mapping (US-NC → North Carolina) and the verb are surface concerns, so\n // the VM text is just the city (intentionally partial, never invented).\n if (collection === 'social.passports.fiftyStates.visit') {\n return nonBlankString(record.city);\n }\n for (const field of GENERIC_TEXT_ORDER) {\n if (field === 'body') {\n const body = readBodyField(record.body);\n if (body) return body;\n continue;\n }\n const value = nonBlankString(record[field]);\n if (value) return value;\n }\n return undefined;\n}\n\n/** Non-empty string tags off `record.tags`, or undefined. */\nfunction genericTags(record: Record<string, unknown>): string[] | undefined {\n const tags = record.tags;\n if (!Array.isArray(tags)) return undefined;\n const out = tags.filter((t): t is string => typeof t === 'string' && t.length > 0);\n return out.length > 0 ? out : undefined;\n}\n\n/**\n * Blob-ref image media from the common record shapes (reuses M1's blob helpers;\n * never builds a URL). Prefers an `images[]` / `embed.images[]` array (all\n * valid items), then single-blob fields, then Grain's bare `galleryMeta\n * .coverPhotoCid`.\n */\nfunction genericMedia(record: Record<string, unknown>, did: string, alt: string): StreamMedia[] {\n const fromArray = (raw: unknown): StreamMedia | undefined => {\n const img = asRecord(raw);\n if (!img) return undefined;\n return blobMedia(img.image ?? raw, did, asNonEmptyString(img.alt) ?? alt);\n };\n\n const images = record.images;\n if (Array.isArray(images)) {\n const out = images.map(fromArray).filter((m): m is StreamMedia => m !== undefined);\n if (out.length > 0) return out;\n }\n\n const embed = asRecord(record.embed);\n if (embed && Array.isArray(embed.images)) {\n const out = embed.images.map(fromArray).filter((m): m is StreamMedia => m !== undefined);\n if (out.length > 0) return out;\n }\n\n const single =\n blobMedia(record.image, did, alt) ??\n blobMedia(record.thumbnail, did, alt) ??\n blobMedia(record.thumb, did, alt) ??\n blobMedia(record.photo, did, alt) ??\n (embed ? blobMedia(embed.thumbnail, did, alt) : undefined);\n if (single) return [single];\n\n // Grain galleries store the cover as a bare CID string, not a blob object.\n const coverCid = asRecord(record.galleryMeta)?.coverPhotoCid;\n if (typeof coverCid === 'string' && coverCid.length > 0) {\n return [{ did, cid: coverCid, alt }];\n }\n return [];\n}\n\n/**\n * An outbound link from the common shapes: a Bluesky-style `embed.external`,\n * then a bare URL in `source` (Margin bookmark), `subject` (KipClip), or `url`.\n */\nfunction genericExternalLink(record: Record<string, unknown>): StreamExternalLink | undefined {\n const embed = asRecord(record.embed);\n if (embed) {\n const fromEmbed = bskyExternal(embed);\n if (fromEmbed) return fromEmbed;\n }\n const url = httpUrl(record.source) ?? httpUrl(record.subject) ?? httpUrl(record.url);\n return url ? { url } : undefined;\n}\n\n/**\n * A reply/quote/answer target from common reference shapes: `subject` as an\n * `at://` uri or a bare `did:` (person), or `subject.uri` (strongRef). A bare\n * http(s) `subject` is a bookmark target, handled as `externalLink` instead.\n */\nfunction genericSubject(record: Record<string, unknown>): StreamCardSubject | undefined {\n const subject = record.subject;\n if (typeof subject === 'string') {\n if (subject.startsWith('at://')) return { kind: 'record', uri: subject };\n if (subject.startsWith('did:')) return { kind: 'person', did: subject };\n return undefined;\n }\n const uri = nonBlankString(asRecord(subject)?.uri);\n if (uri && uri.startsWith('at://')) return { kind: 'record', uri };\n return undefined;\n}\n\n/** Recognize one facet feature (link / mention / tag), tolerating a missing $type. */\nfunction parseFacetFeature(\n features: unknown[],\n): Pick<StreamRichSegment, 'link' | 'mention' | 'tag'> | undefined {\n for (const raw of features) {\n const feat = asRecord(raw);\n if (!feat) continue;\n const type = asNonEmptyString(feat['$type']) ?? '';\n const uri = asNonEmptyString(feat.uri);\n const did = asNonEmptyString(feat.did);\n const tag = asNonEmptyString(feat.tag);\n if (type.endsWith('#link') && uri) return { link: uri };\n if (type.endsWith('#mention') && did) return { mention: did };\n if (type.endsWith('#tag') && tag) return { tag };\n // No / unknown $type: fall back to whichever identifying field is present.\n if (uri) return { link: uri };\n if (did) return { mention: did };\n if (tag) return { tag };\n }\n return undefined;\n}\n\n/**\n * Slice `text` into rich segments using `app.bsky.richtext.facet`-style\n * byte-offset facets. Heuristic and additive: `body.text` always holds the full\n * plain string, so a renderer may ignore this. Returns undefined unless at least\n * one enriched (link/mention/tag) span is produced.\n */\nfunction genericRichSegments(\n text: string,\n record: Record<string, unknown>,\n): StreamRichSegment[] | undefined {\n const facets = record.facets;\n if (!Array.isArray(facets)) return undefined;\n\n const parsed: { start: number; end: number; link?: string; mention?: string; tag?: string }[] =\n [];\n for (const raw of facets) {\n const facet = asRecord(raw);\n const index = asRecord(facet?.index);\n const start = asFiniteNumber(index?.byteStart);\n const end = asFiniteNumber(index?.byteEnd);\n if (start === undefined || end === undefined || start < 0 || end <= start) continue;\n const features = facet?.features;\n if (!Array.isArray(features)) continue;\n const feature = parseFacetFeature(features);\n if (!feature) continue;\n parsed.push({ start, end, ...feature });\n }\n if (parsed.length === 0) return undefined;\n\n const bytes = new TextEncoder().encode(text);\n const decoder = new TextDecoder();\n parsed.sort((a, b) => a.start - b.start);\n\n const segments: StreamRichSegment[] = [];\n let cursor = 0;\n for (const span of parsed) {\n if (span.start < cursor || span.start > bytes.length) continue; // overlap / OOB\n const end = Math.min(span.end, bytes.length);\n if (span.start > cursor) {\n const plain = decoder.decode(bytes.slice(cursor, span.start));\n if (plain) segments.push({ text: plain });\n }\n const seg: StreamRichSegment = { text: decoder.decode(bytes.slice(span.start, end)) };\n if (span.link) seg.link = span.link;\n if (span.mention) seg.mention = span.mention;\n if (span.tag) seg.tag = span.tag;\n segments.push(seg);\n cursor = end;\n }\n if (cursor < bytes.length) {\n const rest = decoder.decode(bytes.slice(cursor));\n if (rest) segments.push({ text: rest });\n }\n\n return segments.some((s) => s.link ?? s.mention ?? s.tag) ? segments : undefined;\n}\n\n/**\n * Populate a generic body with any real content the record carries — text,\n * media (blob refs), an external link, and a reply/quote/answer subject —\n * choosing `body.kind` the same way the Bluesky path does (text, else media,\n * else link, else generic).\n */\nfunction applyGeneric(\n vm: StreamCardVM,\n item: ActivityItem,\n record: Record<string, unknown> | null,\n): StreamCardVM {\n if (!record) return withGeneric(vm);\n\n const text = genericText(item.collection, record);\n const tags = genericTags(record);\n const did = didFromUri(item.uri);\n if (did) {\n const media = genericMedia(record, did, text ?? '');\n if (media.length > 0) vm.media = media;\n }\n const externalLink = genericExternalLink(record);\n if (externalLink) vm.externalLink = externalLink;\n // Don't clobber a repost/reply subject already normalized from item.subject.\n if (!vm.subject) {\n const subject = genericSubject(record);\n if (subject) vm.subject = subject;\n }\n\n let body: StreamCardBody;\n if (text) {\n body = { kind: 'text', text };\n const richSegments = genericRichSegments(text, record);\n if (richSegments) body.richSegments = richSegments;\n if (tags) body.tags = tags;\n } else if (vm.media) {\n body = { kind: 'media' };\n if (tags) body.tags = tags;\n } else if (vm.externalLink) {\n body = { kind: 'link' };\n if (tags) body.tags = tags;\n } else {\n body = { kind: 'generic' };\n if (tags) body.tags = tags;\n }\n vm.body = body;\n return vm;\n}\n\n// ---------------------------------------------------------------------------\n// Entry points\n// ---------------------------------------------------------------------------\n\n/**\n * Normalize one {@link ActivityItem} into a framework-free {@link StreamCardVM}.\n * Pure: no I/O, no React, no DOM, and no resolved CDN URLs (media carries raw\n * blob refs so each surface builds its own URL). Total: always returns a VM.\n *\n * Reference implementations: the generic/unknown case, `app.bsky.feed.post`\n * (text + images + external embed), and reposts (whose `subject` is normalized\n * through this same function). Collections with a typed body variant\n * (`github-pr`, `book`, `media-review`, `event-rsvp`, `verification`,\n * `membership`, `location`, `travel`, `standard-site`) are enriched from their\n * raw record below; `at.youandme.connection` and `fyi.asq.answer` populate a\n * person / record `subject`. Everything else (base collections + unknown apps)\n * flows through {@link applyGeneric}, which extracts text / media / link /\n * subject from common record shapes, degrading to an empty generic body.\n */\nexport function toStreamCardVM(\n item: ActivityItem,\n options: ToStreamCardVMOptions = {},\n): StreamCardVM {\n const verb = verbForCollection(item.collection);\n const source = buildSource(item, options);\n const record = asRecord(item.record);\n const timestamp = (record ? asNonEmptyString(record.createdAt) : undefined) ?? item.indexedAt;\n\n const vm: StreamCardVM = {\n uri: item.uri,\n cid: item.cid,\n verb,\n source,\n tier: getActivityTier(item.collection),\n timestamp,\n title: buildTitle(verb, source.label),\n };\n\n const author = buildAuthor(item);\n if (author) vm.author = author;\n\n const theme = readTheme(record);\n if (theme) vm.theme = theme;\n\n // Link to the record on its source app. Set before the switch so every\n // body-variant return path (each mutates and returns this same vm) keeps it.\n if (record) {\n const sourceUrl = resolveSourceUrl(item, record);\n if (sourceUrl) vm.sourceUrl = sourceUrl;\n }\n\n // Repost / reply target, normalized through the same transform. Its own\n // sourceUrl is computed by this recursion.\n if (item.subject) {\n vm.subject = { kind: 'post', post: toStreamCardVM(item.subject, options) };\n }\n\n switch (item.collection) {\n case 'app.bsky.feed.post':\n return applyBskyPost(vm, item, record);\n case 'github.pull_request':\n return record ? applyGithubPr(vm, record) : withGeneric(vm);\n case 'buzz.bookhive.book':\n return record ? applyBook(vm, item, record) : withGeneric(vm);\n case 'community.lexicon.calendar.rsvp':\n return record ? applyEventRsvp(vm, record) : withGeneric(vm);\n case 'dev.keytrace.claim':\n return record ? applyKeytraceVerification(vm, record) : withGeneric(vm);\n case 'app.bsky.graph.verification':\n return record ? applyBskyVerification(vm, record) : withGeneric(vm);\n case 'social.colibri.membership':\n return record ? applyMembership(vm, record) : withGeneric(vm);\n case 'app.beaconbits.beacon':\n return record ? applyLocation(vm, record) : withGeneric(vm);\n case 'social.passports.travel.leg':\n return record ? applyTravel(vm, record) : withGeneric(vm);\n case 'site.standard.document':\n return record ? applyStandardSite(vm, record) : withGeneric(vm);\n case 'at.youandme.connection':\n return record ? applyYouAndMe(vm, record) : withGeneric(vm);\n case 'fyi.asq.answer':\n return record ? applyAsqAnswer(vm, record) : withGeneric(vm);\n case 'fediverse.post':\n return record ? applyFediversePost(vm, record) : withGeneric(vm);\n }\n\n // social.popfeed.feed.{post,note,review} — registered by prefix in sifa-web.\n if (record && item.collection.startsWith('social.popfeed.feed.')) {\n return applyMediaReview(vm, item, record);\n }\n\n // Base collections + unknown / future apps: extract real content generically.\n return applyGeneric(vm, item, record);\n}\n\n/**\n * Map a list of activity items to VMs, applying {@link isVisibleActivityItem}\n * first so both surfaces (sifa-web, page.sifa.id) filter identically — a\n * filtered item produces no VM rather than a null-rendering card.\n */\nexport function toStreamCardVMs(\n items: ActivityItem[],\n options: ToStreamCardVMOptions = {},\n): StreamCardVM[] {\n const out: StreamCardVM[] = [];\n for (const item of items) {\n if (isVisibleActivityItem(item.collection, item.record)) {\n out.push(toStreamCardVM(item, options));\n }\n }\n return out;\n}\n","/**\n * Profile completeness scoring.\n *\n * Six binary signals, equal weight: headline filled, about filled, has at least\n * one position, education, skill, certification.\n *\n * Score: integer 0..6. Percent: round(score / 6 * 100) -- discrete values\n * {0, 17, 33, 50, 67, 83, 100}.\n *\n * Canonical source of truth for completeness scoring across Sifa clients.\n * sifa-api computes the underlying `ProfileCompletion` shape inline (in SQL\n * for admin-stats queries, in route handlers elsewhere) but defers scoring\n * to this module.\n */\n\nexport const COMPLETENESS_MAX_SCORE = 6;\n\nexport interface ProfileCompletion {\n hasHeadline: boolean;\n hasAbout: boolean;\n positionCount: number;\n educationCount: number;\n skillCount: number;\n certificationCount: number;\n}\n\n/** Pure-TS computation of the 0..6 score. */\nexport function completenessScore(c: ProfileCompletion): number {\n let filled = 0;\n if (c.hasHeadline) filled++;\n if (c.hasAbout) filled++;\n if (c.positionCount > 0) filled++;\n if (c.educationCount > 0) filled++;\n if (c.skillCount > 0) filled++;\n if (c.certificationCount > 0) filled++;\n return filled;\n}\n\n/** Completion as a rounded 0..100 integer percent (matches API serialisation). */\nexport function completenessPercent(c: ProfileCompletion): number {\n return Math.round((completenessScore(c) / COMPLETENESS_MAX_SCORE) * 100);\n}\n","/**\n * Profile dimensions -- the routing signal used by the Sifa homepage to choose\n * between the V3 \"still building\" and V4 \"established\" variants.\n *\n * Six binary signals, equal weight: avatar, headline, about, current position,\n * minimum-skill threshold, and at least one education entry. The routing\n * threshold itself (e.g. \">= 4 of 6 -> ESTABLISHED\") lives in the consumer\n * because different surfaces may want to cut at different bars over time.\n *\n * Canonical source of truth for dimension scoring across Sifa clients.\n * sifa-api computes the underlying `ProfileDimensionInputs` shape inline\n * (in SQL on the session route) but defers scoring to this module so the\n * frontend and backend cannot drift on what \"filled\" means.\n *\n * See `docs/plans/2026-04-27-homepage-variants.md` (sifa-web) for the\n * history of why these six were chosen over the original eight.\n */\n\nimport type { Profile, ProfilePosition } from '../types/index.js';\n\nexport const DIMENSIONS_MAX_SCORE = 6;\nexport const MIN_SKILLS = 3;\n\nexport type DimensionKey =\n | 'avatar'\n | 'headline'\n | 'about'\n | 'currentPosition'\n | 'skills'\n | 'education';\n\nexport type DimensionMap = Record<DimensionKey, boolean>;\n\n/**\n * Minimal raw inputs needed to compute the dimension map. sifa-api can\n * populate this from a single composite SQL query without loading the full\n * Profile shape, which is the whole point of putting this in the SDK.\n */\nexport interface ProfileDimensionInputs {\n hasAvatar: boolean;\n hasHeadline: boolean;\n hasAbout: boolean;\n currentPositionCount: number;\n skillCount: number;\n educationCount: number;\n}\n\nfunction nonEmptyString(value: string | undefined | null): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/**\n * Pure-TS computation of the 6-key boolean map from minimal inputs.\n * Use this when you already have aggregate counts (e.g. server-side).\n */\nexport function dimensionsFromInputs(inputs: ProfileDimensionInputs): DimensionMap {\n return {\n avatar: inputs.hasAvatar,\n headline: inputs.hasHeadline,\n about: inputs.hasAbout,\n currentPosition: inputs.currentPositionCount > 0,\n skills: inputs.skillCount >= MIN_SKILLS,\n education: inputs.educationCount > 0,\n };\n}\n\n/**\n * Derives `ProfileDimensionInputs` from a full Profile. Use this on the\n * client when you already have the profile loaded.\n */\nexport function profileToDimensionInputs(profile: Profile): ProfileDimensionInputs {\n const positions = profile.positions ?? [];\n const skills = profile.skills ?? [];\n const education = profile.education ?? [];\n const currentPositionCount = positions.filter((p: ProfilePosition) => !p.endedAt).length;\n return {\n hasAvatar: nonEmptyString(profile.avatar),\n hasHeadline: nonEmptyString(profile.headline),\n hasAbout: nonEmptyString(profile.about),\n currentPositionCount,\n skillCount: skills.length,\n educationCount: education.length,\n };\n}\n\n/** Convenience: full Profile -> dimension boolean map. */\nexport function getFilledDimensionsMap(profile: Profile): DimensionMap {\n return dimensionsFromInputs(profileToDimensionInputs(profile));\n}\n\n/** Count of filled dimensions, 0..6. Accepts either raw inputs or a full Profile. */\nexport function countFilledDimensions(input: ProfileDimensionInputs | Profile): number {\n const map = 'hasAvatar' in input ? dimensionsFromInputs(input) : getFilledDimensionsMap(input);\n let n = 0;\n for (const v of Object.values(map)) {\n if (v) n++;\n }\n return n;\n}\n","/**\n * Canonical rule for picking the \"primary\" position to surface on profile cards,\n * social previews, and structured-data outputs.\n *\n * Without this shared helper, different surfaces (visible hero, OG image,\n * <meta description>, JSON-LD) re-derived \"primary\" inconsistently and diverged\n * for users with multiple concurrent roles.\n *\n * Rules (in order):\n * 1. A position the user explicitly flagged `primary` AND that is still active.\n * 2. Otherwise, the active position with the most recent `startedAt`.\n * 3. Otherwise, undefined (no active position).\n */\n\nexport interface PrimaryPositionCandidate {\n startedAt?: string;\n endedAt?: string;\n primary?: boolean;\n}\n\nexport function pickPrimaryPosition<T extends PrimaryPositionCandidate>(\n positions: readonly T[] | undefined,\n): T | undefined {\n if (!positions || positions.length === 0) return undefined;\n\n const active = positions.filter((p) => !p.endedAt);\n if (active.length === 0) return undefined;\n\n const flagged = active.find((p) => p.primary === true);\n if (flagged) return flagged;\n\n return [...active].sort((a, b) => (b.startedAt ?? '').localeCompare(a.startedAt ?? ''))[0];\n}\n","/**\n * Compact professional summary derived from a {@link ProfileView}.\n *\n * The full `id.sifa.getProfileView` payload carries every section (all\n * positions, education, skills, publications, talks, and more). Third-party\n * surfaces that only want to show \"who is this, what do they do now\" — a badge,\n * a maintainer card, a byline — need a much smaller shape. This is that shape,\n * derived with the same canonical rules the Sifa web app uses (see\n * {@link pickPrimaryPosition}) so an embedded summary matches the profile page.\n *\n * Pure and I/O-free: pass it a view you already fetched. For the fetch +\n * summarize convenience, use `fetchProfileSummary` from `@singi-labs/sifa-sdk`.\n */\n\nimport type { ProfileView } from '../types/profile-view.js';\nimport { pickPrimaryPosition } from './primary-position.js';\n\nexport interface ProfileSummary {\n did: string;\n handle: string;\n displayName?: string;\n avatar?: string;\n pronouns?: string;\n headline?: string;\n /** Title of the current primary role, if the person has an active position. */\n currentTitle?: string;\n /** Current employer: the resolved entity name when linked, else the free-text company. */\n currentCompany?: string;\n /** Skill names in the order the AppView returns them, capped by `maxSkills`. */\n topSkills: string[];\n /** Whether the profile is claimed by its owner (vs an unclaimed placeholder). */\n claimed: boolean;\n}\n\nexport interface SummarizeProfileViewOptions {\n /** Maximum number of skills to include in `topSkills`. Default 5; negatives clamp to 0. */\n maxSkills?: number;\n}\n\nconst DEFAULT_MAX_SKILLS = 5;\n\nexport function summarizeProfileView(\n view: ProfileView,\n options: SummarizeProfileViewOptions = {},\n): ProfileSummary {\n const limit = Math.max(0, options.maxSkills ?? DEFAULT_MAX_SKILLS);\n const primary = pickPrimaryPosition(view.positions);\n\n return {\n did: view.did,\n handle: view.handle,\n displayName: view.displayName,\n avatar: view.avatar,\n pronouns: view.pronouns,\n headline: view.headline,\n currentTitle: primary?.title,\n currentCompany: primary ? (primary.entityName ?? primary.company) : undefined,\n topSkills: (view.skills ?? []).slice(0, limit).map((s) => s.name),\n claimed: view.claimed ?? false,\n };\n}\n","/**\n * Pseudo-employer detection (#159). Self-employment strings (\"self-employed\",\n * \"freelance\", \"independent\", ...) are NOT organizations: the position editor\n * routes them to the company-optional / \"Independent\" path instead of the entity\n * typeahead, and they are excluded from entity matching everywhere.\n *\n * Matching is on the WHOLE normalized string, not substrings, so real employers\n * that merely contain one of these words (\"Independent School District 191\")\n * are not misclassified. Mirrors the sifa-api matcher.\n */\nconst PSEUDO_EMPLOYERS = new Set<string>([\n 'self',\n 'self employed',\n 'selfemployed',\n 'self employment',\n 'self employed freelance',\n 'freelance',\n 'freelancer',\n 'freelancing',\n 'freelance work',\n 'independent',\n 'independent contractor',\n 'independent consultant',\n 'independent professional',\n 'sole proprietor',\n 'sole proprietorship',\n 'sole trader',\n 'own business',\n 'my own business',\n 'self employed consultant',\n]);\n\nfunction normalizePseudo(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n .replace(/\\s+/g, ' ');\n}\n\n/** True when the whole employer string is a self-employment / pseudo employer. */\nexport function isPseudoEmployer(company: string): boolean {\n const normalized = normalizePseudo(company);\n if (!normalized) return false;\n return PSEUDO_EMPLOYERS.has(normalized);\n}\n","/**\n * Lightweight \"does this typeahead query look like a domain?\" predicate, used to\n * decide whether to fire the domain grow-on-demand path (resolve-domain) on a\n * local typeahead miss. It is a heuristic, NOT a validator: the API re-validates\n * against the public suffix list. It only needs to distinguish \"randstad.com\"\n * (a domain) from \"Randstad\" / \"Acme Corp\" (a name) so a plain company name\n * never triggers a domain lookup.\n *\n * Accepts an optional scheme and path (`https://www.stripe.com/pricing`), a\n * leading `www.`, and multi-label hosts; requires at least one dot and a >=2\n * alpha final label (TLD-shaped); rejects whitespace and `@` (emails).\n *\n * Runs on uncontrolled typeahead input, so it is deliberately ReDoS-safe: the\n * input length is bounded up front (a domain is <=253 chars), the host is\n * extracted with plain string ops (no scheme/path/trailing-dot regex), and each\n * label is validated by a single anchored, bounded pattern. There is no\n * ambiguous or nested quantifier anywhere, so matching is linear in the input.\n */\n\n/** Max DNS name length; anything longer is rejected before any matching. */\nconst MAX_DOMAIN_LEN = 253;\n\n/**\n * One DNS label: 1-63 chars, alphanumeric, internal hyphens allowed. Anchored\n * and length-bounded, with a single optional group and no outer quantifier, so\n * it cannot backtrack polynomially.\n */\nconst LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;\n\n/** Final label must be TLD-shaped: 2-63 alphabetic chars. */\nconst TLD = /^[a-z]{2,63}$/;\n\n/** Strip trailing dots without a regex (avoids the `\\.+$` polynomial pattern). */\nfunction stripTrailingDots(s: string): string {\n let end = s.length;\n while (end > 0 && s.charCodeAt(end - 1) === 0x2e /* '.' */) end -= 1;\n return s.slice(0, end);\n}\n\nexport function looksLikeDomain(query: string): boolean {\n const q = query.trim().toLowerCase();\n // Bound the input BEFORE any matching. A domain is <=253 chars; a longer\n // typeahead value is never a domain, and this caps every check below to a\n // constant amount of work (ReDoS guard).\n if (!q || q.length > MAX_DOMAIN_LEN) return false;\n if (q.includes(' ') || q.includes('\\t') || q.includes('@')) return false;\n\n // Extract the host with plain string ops -- no backtracking regex on input.\n let host = q;\n const schemeAt = host.indexOf('://');\n if (schemeAt !== -1) host = host.slice(schemeAt + 3);\n // Cut at the first path / query / fragment delimiter.\n for (let i = 0; i < host.length; i += 1) {\n const ch = host[i];\n if (ch === '/' || ch === '?' || ch === '#') {\n host = host.slice(0, i);\n break;\n }\n }\n if (host.startsWith('www.')) host = host.slice(4);\n // Strip a trailing :port.\n const colonAt = host.lastIndexOf(':');\n if (colonAt !== -1 && /^[0-9]{1,5}$/.test(host.slice(colonAt + 1))) {\n host = host.slice(0, colonAt);\n }\n host = stripTrailingDots(host);\n if (!host || host.length > MAX_DOMAIN_LEN) return false;\n\n // Validate each label independently (split first, so no quantifier spans dots).\n const labels = host.split('.');\n if (labels.length < 2) return false;\n const tld = labels[labels.length - 1];\n if (tld === undefined || !TLD.test(tld)) return false;\n for (let i = 0; i < labels.length - 1; i += 1) {\n if (!LABEL.test(labels[i] as string)) return false;\n }\n return true;\n}\n","import type { EntitySearchResult } from '../schemas/entity.js';\n\n/**\n * Disambiguation-display helpers for the org typeahead (#159, Flow 1A-2). Two\n * same-name orgs must be told apart at a glance, so each row shows its domain,\n * country, and parent where known.\n */\n\nexport interface DisambiguationFields {\n domain?: string | null;\n country?: string | null;\n parentName?: string | null;\n}\n\n/**\n * Build the muted secondary line for a typeahead row, e.g.\n * `spryker.com · DE · part of Spryker Holding`. Empty when nothing to show.\n */\nexport function entityDisambiguationLabel(fields: DisambiguationFields): string {\n const parts: string[] = [];\n if (fields.domain) parts.push(fields.domain);\n if (fields.country) parts.push(fields.country);\n if (fields.parentName) parts.push(`part of ${fields.parentName}`);\n return parts.join(' · ');\n}\n\n/** Convenience over {@link entityDisambiguationLabel} for a search result row. */\nexport function searchResultDisambiguation(result: EntitySearchResult): string {\n return entityDisambiguationLabel({\n domain: result.domain,\n country: result.country,\n parentName: result.parentName,\n });\n}\n\n/** Stable per-row identity for React keys and dedupe (entity id or PDL id). */\nexport function entityResultKey(result: EntitySearchResult): string {\n return result.source === 'entity' ? `entity:${result.entityId}` : `pdl:${result.pdlId}`;\n}\n","/**\n * Anchor-quality classification for a position's `entityRef` pointer (#159).\n *\n * A durable company link tiers by the quality of its anchor, which drives the\n * link indicator in the UI (registry-backed reads stronger than a Sifa-scoped\n * PDL pointer, per the ratified D5 chip policy). The classification is derived\n * purely from the ref URI's host, so it is a shared, cross-platform predicate\n * (web today, the native app later).\n *\n * registry -- a portable external id any atproto app can resolve\n * (Wikidata / ROR / GLEIF). Renders as a full \"Linked\" indicator.\n * sifa -- a Sifa-scoped `sifa.id/company/<publicId>` pointer for a\n * PDL-only company. Renders as a muted \"Linked\" (no glyph).\n * unlinked -- no ref, a malformed URL, or an unrecognized host. Free text.\n *\n * NEVER surfaced as \"verified\": a link is not a verification.\n */\nexport const ENTITY_REF_ANCHORS = ['registry', 'sifa', 'unlinked'] as const;\nexport type EntityRefAnchor = (typeof ENTITY_REF_ANCHORS)[number];\n\n/** Hosts of portable, app-neutral company registries. */\nconst REGISTRY_HOSTS = new Set([\n 'wikidata.org',\n 'www.wikidata.org',\n 'ror.org',\n 'gleif.org',\n 'www.gleif.org',\n]);\n\nconst SIFA_HOST = 'sifa.id';\n\n/**\n * Classify an entityRef by anchor quality. Uses strict host parsing (never\n * substring matching) so a hostile URL that merely contains a registry host in a\n * query string is treated as unlinked, not falsely linked.\n */\nexport function classifyEntityRef(entityRef: string | null | undefined): EntityRefAnchor {\n if (!entityRef || !entityRef.trim()) return 'unlinked';\n let url: URL;\n try {\n url = new URL(entityRef.trim());\n } catch {\n return 'unlinked';\n }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') return 'unlinked';\n const host = url.hostname.toLowerCase();\n if (REGISTRY_HOSTS.has(host)) return 'registry';\n if (host === SIFA_HOST) return 'sifa';\n return 'unlinked';\n}\n\n/** Whether a position carries a durable link of any anchor quality. */\nexport function isLinked(entityRef: string | null | undefined): boolean {\n return classifyEntityRef(entityRef) !== 'unlinked';\n}\n","import type { OrgProfileRecord } from '../schemas/org-profile.js';\nimport { looksLikeDomain } from './domain-detect.js';\n\n/**\n * Handle hosts that are shared PDS / signup domains, never a single\n * organization's registrable identity. A handle under one of these (e.g.\n * `acme.bsky.social`) is a subdomain of someone else's domain, so it can never\n * satisfy the org rendering floor. Lowercased, leading-dot form for a suffix\n * match. Kept in sync with the PDS provider list in `format/pds-utils.ts`.\n */\nconst KNOWN_HANDLE_HOST_SUFFIXES = [\n '.bsky.social',\n '.blacksky.app',\n '.eurosky.social',\n '.northsky.social',\n] as const;\n\n/**\n * Approximate \"is this handle a custom registrable domain?\" check for the org\n * rendering floor.\n *\n * IMPORTANT -- this is deliberately NARROW, not authoritative. The SDK has no\n * public-suffix-list (PSL) dependency, so it cannot compute the true eTLD+1\n * apex: it cannot tell `acme.co.uk` (an apex) from `careers.acme.co.uk` (a\n * subdomain that routes to the subsidiary case), nor reject every PSL-private\n * host. It performs only the rejects it CAN make correctly with no PSL:\n * - DIDs (never a domain handle),\n * - bare / no-dot handles and non-TLD-shaped hosts (via `looksLikeDomain`),\n * - known shared PDS / handle hosts (`*.bsky.social` and friends).\n *\n * The AUTHORITATIVE apex + eTLD+1 + confusable check is server-side in\n * sifa-api's `bind-domain-guard` (`isBindableHandleDomain`, backed by `tldts`);\n * `computeOrgFloorVerdict` there is the source of truth and is surfaced to\n * clients on the profile resolve (read it via `useOrgProfile`). Recompute here\n * only when a client-side floor gate is needed without a round-trip.\n *\n * TODO(#160): promote a shared PSL-backed eTLD+1 helper into the SDK (or vendor\n * a compact public-suffix table) and tighten this to a true apex check.\n *\n * Pure: no network, no I/O.\n */\nexport function isRegistrableDomainHandle(handle: string): boolean {\n const h = handle.trim().toLowerCase();\n if (!h) return false;\n if (h.startsWith('did:')) return false;\n // Requires >=1 dot and a TLD-shaped final label; rejects bare usernames.\n if (!looksLikeDomain(h)) return false;\n for (const suffix of KNOWN_HANDLE_HOST_SUFFIXES) {\n if (h.endsWith(suffix)) return false;\n }\n return true;\n}\n\n/**\n * The org rendering floor (#160) -- the \"any AppView can evaluate\" promise made\n * executable. An account renders as an organization when BOTH:\n * 1. It has an `id.sifa.org.profile` record (record present), AND\n * 2. Its handle is a custom registrable domain\n * ({@link isRegistrableDomainHandle}).\n *\n * Only the PRESENCE of the record matters here (declaration marks the account\n * as presenting-as-org; trust is layered separately). The handle check is LIVE:\n * evaluate it on every render so a lost domain drops org rendering\n * automatically.\n *\n * Pure: no network, no I/O. Pass the fetched record (or null) and the current\n * handle.\n */\nexport function qualifiesAsOrg(\n record: OrgProfileRecord | null | undefined,\n handle: string,\n): boolean {\n if (record === null || record === undefined) return false;\n return isRegistrableDomainHandle(handle);\n}\n","/**\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","/**\n * Shared, single-source-of-truth model for which profile sections render, in\n * what order, their nav grouping, and which items a given viewer may see.\n *\n * Every Sifa profile surface builds on this: the HTML profile page, the\n * Markdown / DOCX / print exports, and the standalone personal-site renderer.\n * Adding a section to {@link ALL_SECTIONS} makes it appear everywhere (the\n * exports drive presence + order from here, and {@link SECTION_LABELS} is an\n * exhaustive `Record<SectionId, string>`, so a new id is a compile error until\n * it has a label).\n *\n * The per-section sorts live in `./section-sorts.js`, built on the same SDK\n * date extractors the HTML section components use, so the surfaces cannot\n * diverge on ordering.\n */\n\nimport type { Profile } from '../types/index.js';\n\n/**\n * Side-nav groups, in display order. Each labels a contiguous run of sections\n * in {@link ALL_SECTIONS}. `labelKey` resolves against the consumer's `sections`\n * i18n namespace.\n */\nexport const SECTION_GROUPS = [\n { id: 'overview', labelKey: 'groupOverview' },\n { id: 'experience', labelKey: 'groupExperience' },\n { id: 'qualifications', labelKey: 'groupQualifications' },\n { id: 'more', labelKey: 'groupMore' },\n] as const;\n\nexport type SectionGroupId = (typeof SECTION_GROUPS)[number]['id'];\n\n/**\n * Profile body sections in render + nav order (evidence-first): identity and\n * activity lead, then living work (career, skills, projects, talks,\n * publications), then the formal record (credentials, education, courses), then\n * the rest. `ns` selects the consumer's i18n namespace for `labelKey`; `group`\n * ties the section to a {@link SECTION_GROUPS} header.\n */\nexport const ALL_SECTIONS = [\n { id: 'about', labelKey: 'about', ns: 'profile' as const, group: 'overview' as const },\n { id: 'career', labelKey: 'career', ns: 'sections' as const, group: 'experience' as const },\n { id: 'skills', labelKey: 'skills', ns: 'sections' as const, group: 'experience' as const },\n { id: 'projects', labelKey: 'projects', ns: 'sections' as const, group: 'experience' as const },\n {\n id: 'presentations',\n labelKey: 'talksAndSessions',\n ns: 'sections' as const,\n group: 'experience' as const,\n },\n {\n id: 'publications',\n labelKey: 'publications',\n ns: 'sections' as const,\n group: 'experience' as const,\n },\n {\n id: 'credentials',\n labelKey: 'credentials',\n ns: 'sections' as const,\n group: 'qualifications' as const,\n },\n {\n id: 'education',\n labelKey: 'education',\n ns: 'sections' as const,\n group: 'qualifications' as const,\n },\n { id: 'courses', labelKey: 'courses', ns: 'sections' as const, group: 'qualifications' as const },\n { id: 'awards', labelKey: 'awards', ns: 'sections' as const, group: 'more' as const },\n { id: 'involvement', labelKey: 'involvement', ns: 'sections' as const, group: 'more' as const },\n { id: 'languages', labelKey: 'languages', ns: 'sections' as const, group: 'more' as const },\n {\n id: 'other-profiles',\n labelKey: 'otherProfiles',\n ns: 'sections' as const,\n group: 'more' as const,\n },\n] as const;\n\n/** Every profile section id, in canonical render order. */\nexport type SectionId = (typeof ALL_SECTIONS)[number]['id'];\n\n/** Whether a section has content for a given profile (used to hide empty nav entries for visitors). */\nexport function isSectionPopulated(profile: Profile, id: string): boolean {\n switch (id) {\n case 'about':\n return Boolean(profile.about && profile.headline);\n case 'career':\n return Boolean(profile.positions?.length);\n case 'education':\n return Boolean(profile.education?.length);\n case 'courses':\n return Boolean(profile.courses?.length);\n case 'skills':\n return Boolean(profile.skills?.length);\n case 'projects':\n return Boolean(profile.projects?.length);\n case 'credentials':\n return Boolean(profile.certifications?.length);\n case 'publications':\n return Boolean(profile.publications?.length);\n case 'presentations':\n return (\n Boolean(profile.presentations?.length) || Boolean(profile.presentationDeliveries?.length)\n );\n case 'involvement':\n return Boolean(profile.involvement?.length);\n case 'awards':\n return Boolean(profile.honors?.length);\n case 'languages':\n return Boolean(profile.languages?.length);\n case 'other-profiles':\n return Boolean(profile.externalAccounts?.length);\n default:\n return false;\n }\n}\n\n/**\n * The section ids a given viewer should see, in {@link ALL_SECTIONS} order.\n * Owners see every section; visitors only see populated ones.\n */\nexport function getVisibleSectionIds(profile: Profile, isOwnProfile: boolean): SectionId[] {\n return ALL_SECTIONS.map((s) => s.id).filter(\n (id) => isOwnProfile || isSectionPopulated(profile, id),\n );\n}\n\n/** Drop items the owner has hidden from visitors. */\nexport function filterHidden<T extends { hidden?: boolean }>(items: T[] | undefined): T[] {\n return (items ?? []).filter((i) => !i.hidden);\n}\n\n/**\n * Items visible to a given viewer: owners see their own hidden items, visitors\n * do not. Shared by every export format (markdown, docx, print) and the public\n * `.md` route so the hidden rule lives in one place.\n */\nexport function visibleItems<T extends { hidden?: boolean }>(\n items: T[] | undefined,\n isOwnProfile: boolean,\n): T[] {\n return isOwnProfile ? (items ?? []) : filterHidden(items);\n}\n\n/**\n * English heading text for each section, keyed by {@link SectionId} (e.g.\n * `other-profiles` renders as \"Links\"). Exhaustive `Record<SectionId, string>`:\n * adding a section to {@link ALL_SECTIONS} without a label here is a compile\n * error, so a section can never silently render without (or with a stale)\n * heading. Consumers with i18n resolve their own localized labels via\n * `labelKey`; this is the canonical English fallback used by the exports.\n */\nexport const SECTION_LABELS: Record<SectionId, string> = {\n about: 'About',\n career: 'Career',\n skills: 'Skills',\n projects: 'Projects',\n presentations: 'Talks & sessions',\n publications: 'Publications',\n credentials: 'Credentials',\n education: 'Education',\n courses: 'Courses',\n awards: 'Awards',\n involvement: 'Involvement',\n languages: 'Languages',\n 'other-profiles': 'Links',\n};\n","import { sortByDateDesc } from '../format/sort-by-date.js';\n\nconst hasValue = (date?: string) => !!date;\n\n/**\n * Sort items by date range, floating ongoing entries (startDate present, endDate\n * absent) to the top. Items with no dates sink to the bottom.\n *\n * Used by sections whose lexicons have no explicit `current` flag -- ongoing is\n * implicit from a missing endDate. Without this wrapper, the shared\n * `dateRangeExtractor` reads `item.current` (always undefined for these items)\n * and sinks ongoing entries below completed ones.\n *\n * Sections using lexicon-aligned `startedAt`/`endedAt` fields (positions,\n * education) should use `lexiconDateExtractor` instead -- that extractor already\n * derives `current` correctly.\n */\nexport function sortByActiveDateRange<T extends { startDate?: string; endDate?: string }>(\n items: T[],\n): T[] {\n return sortByDateDesc(items, (p) => ({\n startDate: p.startDate,\n endDate: p.endDate,\n current: !hasValue(p.endDate) && hasValue(p.startDate),\n }));\n}\n","const PROFICIENCY_RANK: Record<string, number> = {\n native: 5,\n full_professional: 4,\n professional_working: 3,\n limited_working: 2,\n elementary: 1,\n};\n\nfunction rank(proficiency: string | undefined): number {\n if (!proficiency) return 0;\n return PROFICIENCY_RANK[proficiency] ?? 0;\n}\n\n/** Sort languages by proficiency (native first), then alphabetically within a rank. */\nexport function sortLanguagesByProficiency<T extends { language?: string; proficiency?: string }>(\n items: T[],\n): T[] {\n return [...items].sort((a, b) => {\n const diff = rank(b.proficiency) - rank(a.proficiency);\n if (diff !== 0) return diff;\n return (a.language ?? '').localeCompare(b.language ?? '');\n });\n}\n","/**\n * Per-section item sorts, shared by every profile surface so ordering can't\n * diverge between the HTML page and the Markdown / DOCX / print exports and the\n * standalone personal-site renderer. Thin wrappers over the SDK date extractors\n * plus the range/language sorts in this directory.\n */\n\nimport type {\n ProfilePosition,\n ProfileEducation,\n ProfileProject,\n ProfilePublication,\n ProfileCertification,\n ProfileHonor,\n ProfileLanguage,\n} from '../types/index.js';\nimport {\n sortByDateDesc,\n lexiconDateExtractor,\n singleDateExtractor,\n certDateExtractor,\n} from '../format/sort-by-date.js';\nimport { sortByActiveDateRange } from './range-sort.js';\nimport { sortLanguagesByProficiency } from './language-sort.js';\n\n/**\n * Move a `primary && !endedAt` position to the top, matching the HTML career\n * section, so the current primary role always leads.\n */\nexport function hoistPrimary(positions: ProfilePosition[]): ProfilePosition[] {\n const idx = positions.findIndex((p) => p.primary && !p.endedAt);\n if (idx <= 0) return positions;\n const primary = positions[idx]!;\n return [primary, ...positions.slice(0, idx), ...positions.slice(idx + 1)];\n}\n\nexport const sortPositions = (items: ProfilePosition[]): ProfilePosition[] =>\n hoistPrimary(sortByDateDesc(items, lexiconDateExtractor));\n\nexport const sortEducation = (items: ProfileEducation[]): ProfileEducation[] =>\n sortByDateDesc(items, lexiconDateExtractor);\n\nexport const sortProjects = (items: ProfileProject[]): ProfileProject[] =>\n sortByActiveDateRange(items);\n\nexport const sortPublications = (items: ProfilePublication[]): ProfilePublication[] =>\n sortByDateDesc(items, singleDateExtractor);\n\nexport const sortCertifications = (items: ProfileCertification[]): ProfileCertification[] =>\n sortByDateDesc(items, certDateExtractor);\n\nexport const sortHonors = (items: ProfileHonor[]): ProfileHonor[] =>\n sortByDateDesc(items, singleDateExtractor);\n\nexport const sortLanguages = (items: ProfileLanguage[]): ProfileLanguage[] =>\n sortLanguagesByProficiency(items);\n","import { getInvolvementKindHeading } from '../taxonomy/involvement-kind.js';\nimport type { ProfileInvolvement } from '../types/index.js';\n\n/**\n * Fixed display order of involvement headings. A group renders only when it has\n * records. Charity + mapped legacy volunteering fall under \"Volunteering\".\n */\nexport const INVOLVEMENT_HEADING_ORDER = [\n 'Open Source',\n 'Community',\n 'Volunteering',\n 'Civic',\n 'Other',\n] as const;\n\nexport interface InvolvementGroup {\n heading: string;\n items: ProfileInvolvement[];\n}\n\n/**\n * Group involvement records by their kind's display heading, in the fixed order\n * above, most-recent first within a group. Empty groups are omitted. An unknown\n * kind falls under \"Other\" (via the shared heading map).\n */\nexport function groupInvolvementByHeading(items: ProfileInvolvement[]): InvolvementGroup[] {\n const byHeading = new Map<string, ProfileInvolvement[]>();\n for (const item of items) {\n const heading = getInvolvementKindHeading(item.kind);\n const bucket = byHeading.get(heading) ?? [];\n bucket.push(item);\n byHeading.set(heading, bucket);\n }\n const recency = (i: ProfileInvolvement) => i.endedAt ?? i.startedAt ?? '';\n const groups: InvolvementGroup[] = [];\n for (const heading of INVOLVEMENT_HEADING_ORDER) {\n const bucket = byHeading.get(heading);\n if (!bucket?.length) continue;\n const sorted = [...bucket].sort((a, b) => recency(b).localeCompare(recency(a)));\n groups.push({ heading, items: sorted });\n }\n return groups;\n}\n","import { z } from 'zod';\n\n/**\n * Blob-ref passthrough shared by records that carry an uploaded blob (org logo,\n * presentation cover image, ...). Mirrors the `blobRefSchema` validated by the\n * sifa-api write endpoints -- the shape is validated, then written to the PDS\n * verbatim.\n */\nexport const BlobRefSchema = z.object({\n $type: z.literal('blob'),\n ref: z.object({ $link: z.string().min(1) }),\n mimeType: z.string().min(1).max(255),\n size: z.number().int().nonnegative(),\n});\n\nexport type BlobRef = z.infer<typeof BlobRefSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, strongRefSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.endorsement.confirmation` records.\n * Lives in the endorsee's PDS to approve display of an endorsement.\n */\nexport const EndorsementConfirmationRecordSchema = z.object({\n endorsement: strongRefSchema,\n createdAt: datetimeSchema,\n});\n\nexport type EndorsementConfirmationRecord = z.infer<typeof EndorsementConfirmationRecordSchema>;\n","import { z } from 'zod';\n\n/**\n * Organization entity-resolution payloads (#159). Shared by the typeahead,\n * selection, and grow-on-demand import-search endpoints on sifa-api.\n */\n\n/**\n * A nullable string constrained to an http(s) URL. Rejects `javascript:` and\n * other script-bearing schemes at the SDK boundary so a hostile API response\n * cannot smuggle an XSS payload into a rendered `href`/`src`. Note: Wikidata\n * entity URIs are canonically `http://`, so both http and https are allowed.\n */\nconst httpUrlNullable = z\n .string()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'must be an http(s) URL' })\n .nullable();\n\nconst searchResultCommon = {\n kind: z.string(),\n name: z.string(),\n domain: z.string().nullable(),\n country: z.string().nullable(),\n logoUrl: httpUrlNullable,\n parentName: z.string().nullable(),\n};\n\n/**\n * A single typeahead row. Discriminated on `source`: a curated `entity` row\n * carries `entityId`, a `pdl` staging row carries `pdlId`. The union guarantees\n * the identifier for the row's source is always present, so a stable React key\n * can never be `entity:undefined`. The disambiguation fields\n * (domain/country/parentName) drive the dropdown display.\n */\nexport const EntitySearchResultSchema = z.discriminatedUnion('source', [\n z.object({\n source: z.literal('entity'),\n entityId: z.number().int().positive(),\n ...searchResultCommon,\n }),\n z.object({\n source: z.literal('pdl'),\n pdlId: z.string().min(1),\n ...searchResultCommon,\n }),\n]);\nexport type EntitySearchResult = z.infer<typeof EntitySearchResultSchema>;\n\n/** Response of `GET /api/entities/search`. */\nexport const EntitySearchResponseSchema = z.object({\n results: z.array(EntitySearchResultSchema),\n hasMore: z.boolean(),\n});\nexport type EntitySearchResponse = z.infer<typeof EntitySearchResponseSchema>;\n\n/**\n * Body of `POST /api/entities/select`: promote a PDL row OR bump an entity.\n * Exactly one of `entityId`/`pdlId` must be present -- supplying both is\n * ambiguous (the server would have to silently pick one) and is rejected.\n */\nexport const EntitySelectRequestSchema = z\n .object({\n entityId: z.number().int().positive().optional(),\n pdlId: z.string().min(1).optional(),\n })\n .refine((v) => (v.entityId != null) !== (v.pdlId != null), {\n message: 'exactly one of entityId or pdlId is required',\n });\nexport type EntitySelectRequest = z.infer<typeof EntitySelectRequestSchema>;\n\n/** Response of `POST /api/entities/select`. `entityRef` is the portable\n * Wikidata/ROR/LEI URI to write to the position record, or null for a\n * PDL-only entity (its resolution stays AppView-side). */\nexport const EntitySelectResponseSchema = z.object({\n entityId: z.number().int().positive(),\n slug: z.string(),\n kind: z.string(),\n canonicalName: z.string(),\n domain: z.string().nullable(),\n entityRef: httpUrlNullable,\n});\nexport type EntitySelectResponse = z.infer<typeof EntitySelectResponseSchema>;\n\n/** Response of `POST /api/entities/import-search`. */\nexport const EntityImportSearchResponseSchema = z.object({\n results: z.array(EntitySearchResultSchema),\n});\nexport type EntityImportSearchResponse = z.infer<typeof EntityImportSearchResponseSchema>;\n\n/**\n * Body of the domain grow-on-demand endpoints (`POST /api/entities/resolve-domain`\n * and `POST /api/entities/mint-domain`). The server re-validates the value as a\n * registrable domain; 253 is the max DNS name length.\n */\nexport const EntityResolveDomainRequestSchema = z.object({\n domain: z.string().min(1).max(253),\n});\nexport type EntityResolveDomainRequest = z.infer<typeof EntityResolveDomainRequestSchema>;\n\n/**\n * Response of `POST /api/entities/resolve-domain` (grow-on-demand Branch 1). Any\n * notable companies whose official website is the domain, imported from Wikidata.\n * `canMint` is true when nothing notable matched AND the domain is eligible for\n * the user-initiated mint-from-domain path -- it drives the \"Add <domain>\"\n * affordance.\n */\nexport const EntityResolveDomainResponseSchema = z.object({\n results: z.array(EntitySearchResultSchema),\n canMint: z.boolean(),\n});\nexport type EntityResolveDomainResponse = z.infer<typeof EntityResolveDomainResponseSchema>;\n\n/**\n * Response of `POST /api/entities/mint-domain` (grow-on-demand Branch 2). The\n * linkable entity minted from (or already resolved for) the domain. A non-2xx\n * status (e.g. the domain is not mintable, a confusable look-alike, or the site\n * yielded nothing usable) surfaces as a thrown error, not a null result.\n *\n * `pending` is true when the entity is a fresh hidden-pending mint: the\n * requesting user's own link resolves to it immediately, but it stays out of\n * other users' typeahead + aggregation until an admin approves it. Clients should\n * reflect this (\"added -- pending review\") rather than \"added & live\".\n */\nexport const EntityMintDomainResponseSchema = z.object({\n result: EntitySearchResultSchema,\n pending: z.boolean(),\n});\nexport type EntityMintDomainResponse = z.infer<typeof EntityMintDomainResponseSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, strongRefSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.endorsement` records. Lives in the endorser's PDS;\n * the endorser identity is implicit (whoever owns the repository).\n */\nexport const EndorsementRecordSchema = z.object({\n subject: didSchema,\n skill: strongRefSchema,\n skillName: z.string().min(1).refine(maxGraphemes(64)).max(640),\n comment: z.string().refine(maxGraphemes(300)).max(3000).optional(),\n createdAt: datetimeSchema,\n});\n\nexport type EndorsementRecord = z.infer<typeof EndorsementRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes, selfLabelsSchema, uriSchema } from './shared.js';\n\n/**\n * Structured physical address for an organization. Mirrors\n * `community.lexicon.location.address` (all fields optional). Sifa enforces\n * ISO 3166-1 alpha-2 country codes at the app layer.\n */\nconst orgAddressSchema = z.object({\n country: z.string().optional(),\n postalCode: z.string().optional(),\n region: z.string().optional(),\n locality: z.string().optional(),\n street: z.string().optional(),\n name: z.string().optional(),\n});\n\n/** A featured link on the org profile. Both `name` and `url` are required. */\nconst orgLinkSchema = z.object({\n name: z.string().refine(maxGraphemes(60)).max(600),\n url: uriSchema.max(2048),\n});\n\n/**\n * Zod schema for `id.sifa.org.profile` records -- the self-declared\n * organization profile. Singleton (record key `self`), lives in the org's PDS.\n * Presence of this record marks the account as presenting as an organization;\n * trust is layered separately (rendering floor, verification labels).\n *\n * Mirrors the lexicon wire shape (grapheme + byte caps, blob logo, uri refs).\n * For the sifa-api write-endpoint contract, use the schemas under\n * `@singi-labs/sifa-sdk/schemas/write` instead.\n */\nexport const OrgProfileRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n /** Blob ref for the org logo (`image/png` | `image/jpeg`). Not deeply validated client-side. */\n logo: z.unknown().optional(),\n website: uriSchema.optional(),\n entityRefs: z.array(uriSchema).max(20).optional(),\n /** Contact email. NOT rendered publicly; validated as email at the app layer. */\n contact: z.string().optional(),\n /** Physical addresses (headquarters, offices). */\n addresses: z.array(orgAddressSchema).max(10).optional(),\n /**\n * Self-selected headcount range (a declared bucket, never a calculated count).\n * Open enum (bare-string knownValues in the lexicon): `1-10`, `11-50`,\n * `51-200`, `201-500`, `501-1000`, `1001-5000`, `5001-10000`, `10001+`. Any\n * string is accepted so future ranges do not break older records.\n */\n companySize: z.string().optional(),\n /** Featured links or content surfaced on the org profile. */\n links: z.array(orgLinkSchema).max(10).optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type OrgProfileRecord = z.infer<typeof OrgProfileRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n strongRefSchema,\n uriSchema,\n} from './shared.js';\n\n/**\n * Zod schema for `id.sifa.org.employmentAttestation` records -- an\n * organization's attestation that a person is or was employed in a specific\n * position. Lives in the org's PDS (the org is implicit: whoever owns the repo).\n *\n * The position identity is pinned via a snapshot triple (`title`, `startedAt`,\n * and the entity identifier `entityRef` | `companyDid`) so editing those pinned\n * fields on the referenced position record voids the attestation. The free-text\n * company name is never pinned (a rebrand must not invalidate the attestation).\n *\n * `startedAt` / `endedAt` mirror the position lexicon's freeform `YYYY-MM` /\n * `YYYY-MM-DD` date shape, not strict `datetime`.\n */\nexport const OrgEmploymentAttestationRecordSchema = z.object({\n subject: didSchema,\n position: strongRefSchema,\n status: z.enum(['current', 'past']),\n title: z.string().min(1).refine(maxGraphemes(256)).max(2560),\n startedAt: partialDateSchema,\n entityRef: uriSchema.optional(),\n companyDid: didSchema.optional(),\n endedAt: partialDateSchema.optional(),\n comment: z.string().refine(maxGraphemes(300)).max(3000).optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type OrgEmploymentAttestationRecord = z.infer<typeof OrgEmploymentAttestationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.graph.follow` records.\n *\n * One-way professional follow; the record lives in the follower's PDS. Per\n * iter-1 decisions (`plans/2026-06-01-in-sifa-follow-primitive.md`), this is\n * a **distinct** graph from `app.bsky.graph.follow`, not a superset — but\n * the required field shape (`subject` + `createdAt`) is intentionally\n * identical so generic Bluesky `listRecords` consumers get usable records.\n *\n * `note` is a Sifa addition: an optional reason for the follow (\"why I\n * followed\"). Capped at 200 graphemes to match other profile-flavored\n * lexicon fields.\n */\nexport const GraphFollowRecordSchema = z.object({\n subject: didSchema,\n createdAt: datetimeSchema,\n note: z.string().refine(maxGraphemes(200), 'note must be at most 200 graphemes').optional(),\n});\n\nexport type GraphFollowRecord = z.infer<typeof GraphFollowRecordSchema>;\n\n/**\n * Build a `GraphFollowRecordSchema` that rejects self-follow at the Zod\n * layer (CLAUDE.md mandatory standards #3 — input validation; sifa-api#673\n * E8 — defence in depth).\n *\n * Use this on the **client side** when constructing a new follow record\n * (the follower DID is the authenticated user). The plain\n * {@link GraphFollowRecordSchema} stays without the refine so firehose\n * consumers can validate records without context.\n */\nexport function makeGraphFollowRecordSchema(followerDid: string) {\n return GraphFollowRecordSchema.refine((record) => record.subject !== followerDid, {\n message: 'Self-follow is not allowed',\n path: ['subject'],\n });\n}\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema } from './shared.js';\n\n/**\n * Profile row shared across `/api/following`, `/api/profile/:handleOrDid/mutuals`,\n * and `/api/me/bluesky-suggestions`. Matches the existing `FollowProfile` TS\n * interface byte-for-byte but adds runtime validation for the SDK's pagination\n * helpers and the upcoming `sifa-app` consumer (where we can't trust the wire).\n *\n * Per `sifa-api#674` PR body: mutuals + bluesky-suggestions reuse this shape\n * exactly, so a single Zod schema covers all three endpoints.\n */\nexport const FollowProfileSchema = z.object({\n did: didSchema,\n handle: z.string(),\n displayName: z.string().optional(),\n headline: z.string().optional(),\n avatarUrl: z.string().optional(),\n source: z.string(),\n claimed: z.boolean(),\n followedAt: datetimeSchema,\n blueskyVerified: z.boolean().optional(),\n blueskyVerifiedAt: datetimeSchema.nullable().optional(),\n});\n\nexport type FollowProfileItem = z.infer<typeof FollowProfileSchema>;\n\n/**\n * Cursor-paginated page of {@link FollowProfileSchema} rows. Used by mutuals\n * + bluesky-suggestions. The legacy `/api/following` endpoint uses a different\n * wrapper key (`follows` instead of `items`) and is intentionally NOT covered\n * by this schema.\n */\nexport const FollowProfilePageSchema = z.object({\n items: z.array(FollowProfileSchema),\n cursor: z.string().nullable(),\n});\n\nexport type FollowProfilePage = z.infer<typeof FollowProfilePageSchema>;\n\n/**\n * Per-flag allowlist row returned by `GET /api/admin/feature-allowlists/:flag`.\n * Mirrors the `feature_allowlists` table; `note` is optional free-form text.\n */\nexport const FeatureAllowlistEntrySchema = z.object({\n did: didSchema,\n addedAt: datetimeSchema,\n note: z.string().nullable().optional(),\n});\n\nexport type FeatureAllowlistEntry = z.infer<typeof FeatureAllowlistEntrySchema>;\n\n/**\n * Known feature flags accepted by the admin allowlist endpoints. Mirrors the\n * server-side `FEATURE_FLAGS` const in `sifa-api`. Kept as a `const` tuple so\n * consumers can `as const`-narrow when building UIs.\n */\nexport const FEATURE_FLAGS = ['FEED_V5_ENABLED'] as const;\nexport type FeatureFlag = (typeof FEATURE_FLAGS)[number];\n","import { z } from 'zod';\n\nimport { atUriSchema, cidSchema, datetimeSchema, didSchema } from './shared.js';\n\n/**\n * Feed item from `GET /api/following/feed`. Discriminated on `source`:\n *\n * - `sifa`: a Sifa-native event (e.g. profile update, endorsement).\n * - `atmosphere`: a curated creation event from another ATproto app\n * (Barazo post, etc.). Payload is the hydrated `app.bsky.embed.*#view`\n * shape, NOT the raw record (per memory `sifa-hydrated-view-embed-types`).\n *\n * Both variants share `actor`, `indexedAt`, and `id` (the materialized\n * `feed_events.id` row identifier, used in the cursor).\n */\nexport const FeedActorSchema = z.object({\n did: didSchema,\n handle: z.string(),\n displayName: z.string().optional(),\n avatarUrl: z.string().optional(),\n});\n\nexport type FeedActor = z.infer<typeof FeedActorSchema>;\n\nconst FeedItemBaseSchema = z.object({\n id: z.string(),\n actor: FeedActorSchema,\n indexedAt: datetimeSchema,\n eventType: z.string(),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const SifaFeedItemSchema = FeedItemBaseSchema.extend({\n source: z.literal('sifa'),\n appId: z.literal('sifa').optional(),\n payload: z.record(z.string(), z.unknown()),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type SifaFeedItem = z.infer<typeof SifaFeedItemSchema>;\n\n/**\n * ATmosphere feed item. `payload` is intentionally permissive: it carries\n * a hydrated `app.bsky.embed.*#view` shape that varies by source app. The\n * AppView resolves the hydration; clients render via the existing\n * embed-view union (mirrors `sifa-web/src/components/stream/`).\n *\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const AtmosphereFeedItemSchema = FeedItemBaseSchema.extend({\n source: z.literal('atmosphere'),\n appId: z.string(),\n uri: atUriSchema.optional(),\n cid: cidSchema.optional(),\n payload: z.record(z.string(), z.unknown()),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type AtmosphereFeedItem = z.infer<typeof AtmosphereFeedItemSchema>;\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const FollowFeedItemSchema = z.discriminatedUnion('source', [\n SifaFeedItemSchema,\n AtmosphereFeedItemSchema,\n]);\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type FollowFeedItem = z.infer<typeof FollowFeedItemSchema>;\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport const FollowFeedPageSchema = z.object({\n items: z.array(FollowFeedItemSchema),\n cursor: z.string().nullable(),\n});\n\n/**\n * @deprecated The `/api/following/feed` surface was reverted (sifa-api#674).\n * Per `decisions/activity-data-strategy.md` the Sifa Timeline + ATmosphere\n * Stream are two distinct surfaces with different data paths (Barazo API\n * for Timeline, live PDS reads + Valkey for Stream). These collapsed feed\n * types are no longer consumed. Scheduled for removal in next major bump.\n */\nexport type FollowFeedPage = z.infer<typeof FollowFeedPageSchema>;\n\n/**\n * Composite feed cursor `(indexedAt DESC, source, id)`. Encoded as a\n * URL-safe base64 string so it survives `URLSearchParams` round-trips\n * without further encoding. Decoupling encode/decode from the API call\n * lets consumers persist cursors (e.g. for \"jump-back-here\" UX) and\n * lets us unit-test the format.\n */\nexport interface FeedCursor {\n indexedAt: string;\n source: 'sifa' | 'atmosphere';\n id: string;\n}\n\nconst FeedCursorSchema = z.object({\n indexedAt: datetimeSchema,\n source: z.union([z.literal('sifa'), z.literal('atmosphere')]),\n id: z.string().min(1),\n});\n\ninterface BufferLike {\n from: (input: string, encoding: 'utf-8' | 'base64') => { toString: (encoding: string) => string };\n}\n\ninterface Base64Global {\n btoa?: (input: string) => string;\n atob?: (input: string) => string;\n Buffer?: BufferLike;\n}\n\nfunction toBase64Url(input: string): string {\n const g = globalThis as unknown as Base64Global;\n const b64: string =\n typeof g.btoa === 'function'\n ? g.btoa(unescape(encodeURIComponent(input)))\n : (g.Buffer as BufferLike).from(input, 'utf-8').toString('base64');\n // Strip up to 2 trailing '=' (base64 padding). CodeQL flags `/=+$/` as a\n // polynomial regex on tainted input; we don't accept tainted input here,\n // but the deterministic loop sidesteps the alert.\n let end = b64.length;\n while (end > 0 && b64.charCodeAt(end - 1) === 61) end--;\n return b64.slice(0, end).replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n\nfunction fromBase64Url(input: string): string {\n const padded = input.replace(/-/g, '+').replace(/_/g, '/') + '==='.slice((input.length + 3) % 4);\n const g = globalThis as unknown as Base64Global;\n if (typeof g.atob === 'function') {\n return decodeURIComponent(escape(g.atob(padded)));\n }\n return (g.Buffer as BufferLike).from(padded, 'base64').toString('utf-8');\n}\n\nexport function encodeFeedCursor(cursor: FeedCursor): string {\n return toBase64Url(JSON.stringify(cursor));\n}\n\nexport function decodeFeedCursor(encoded: string): FeedCursor {\n const json = fromBase64Url(encoded);\n const parsed: unknown = JSON.parse(json);\n return FeedCursorSchema.parse(parsed);\n}\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n uriSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.certification` records. */\nexport const ProfileCertificationRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n authority: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n authorityDid: didSchema.optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n credentialId: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n credentialUrl: uriSchema.optional(),\n issuedAt: partialDateSchema.optional(),\n expiresAt: partialDateSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileCertificationRecord = z.infer<typeof ProfileCertificationRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n atUriSchema,\n datetimeSchema,\n maxGraphemes,\n partialDateSchema,\n strongRefSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.course` records. */\nexport const ProfileCourseRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n number: z.string().refine(maxGraphemes(50)).max(500).optional(),\n institution: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n education: strongRefSchema.optional(),\n // AT-URI of the associated id.sifa.profile.certification record. Plain\n // at-uri (not a strongRef) so the link tracks the live certification.\n credential: atUriSchema.optional(),\n completedAt: partialDateSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileCourseRecord = z.infer<typeof ProfileCourseRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.education` records. */\nexport const ProfileEducationRecordSchema = z.object({\n institution: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n institutionDid: didSchema.optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n degree: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n fieldOfStudy: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n grade: z.string().refine(maxGraphemes(50)).max(500).optional(),\n activities: z.string().refine(maxGraphemes(1000)).max(10000).optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n location: z.unknown().optional(),\n startedAt: partialDateSchema.optional(),\n endedAt: partialDateSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileEducationRecord = z.infer<typeof ProfileEducationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes, uriSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.externalAccount` records.\n *\n * `platform` is advisory (`knownValues` in the lexicon) -- known values live\n * under `id.sifa.defs#platform*` but unknown values are accepted.\n */\nexport const ProfileExternalAccountRecordSchema = z.object({\n platform: z.string(),\n url: uriSchema,\n label: z.string().refine(maxGraphemes(64)).max(640).optional(),\n feedUrl: uriSchema.optional(),\n isPrimary: z.boolean().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileExternalAccountRecord = z.infer<typeof ProfileExternalAccountRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, partialDateSchema } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.honor` records. */\nexport const ProfileHonorRecordSchema = z.object({\n title: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n issuer: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n issuerDid: didSchema.optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n awardedAt: partialDateSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileHonorRecord = z.infer<typeof ProfileHonorRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n uriSchema,\n} from './shared.js';\n\n/** Collection NSID for involvement records. Pass to the generic record helpers. */\nexport const PROFILE_INVOLVEMENT_NSID = 'id.sifa.profile.involvement';\n\n/**\n * A public artifact proving a piece of work. Mirrors `id.sifa.defs#artifactLink`.\n * `kind` is an open enum (bare-string knownValues), so any string is accepted.\n * `.passthrough()` keeps unknown fields a newer client or co-writer may emit.\n */\nexport const ArtifactLinkSchema = z\n .object({\n url: uriSchema,\n kind: z.string().optional(),\n label: z.string().refine(maxGraphemes(200)).max(2000).optional(),\n })\n .passthrough();\n\nexport type ArtifactLink = z.infer<typeof ArtifactLinkSchema>;\n\n/**\n * Zod schema for `id.sifa.profile.involvement` records.\n *\n * `.passthrough()` (not `.strict()`): external apps (Verak, weareonhire)\n * co-write `id.sifa.*`, so an older SDK must not reject a record carrying a\n * field it doesn't know yet. `kind` is an open enum matching the lexicon's\n * knownValues but accepting any string for the same forward-compat reason.\n */\nexport const ProfileInvolvementRecordSchema = z\n .object({\n kind: z.string(),\n upstream: z.string().refine(maxGraphemes(256)).max(2560).optional(),\n upstreamDid: didSchema.optional(),\n upstreamUrl: uriSchema.optional(),\n role: z.string().refine(maxGraphemes(256)).max(2560).optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n startedAt: partialDateSchema.optional(),\n endedAt: partialDateSchema.optional(),\n links: z.array(ArtifactLinkSchema).max(50).optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the resolver\n // typeahead, constrained to http(s) so a script scheme is never a valid ref.\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n // community.lexicon.location.address — validated at the app layer.\n location: z.unknown().optional(),\n // id.sifa.defs#skillRef references (at-uri to a skill record in the same repo).\n skills: z\n .array(z.object({ uri: z.string() }))\n .max(50)\n .optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n })\n .passthrough();\n\nexport type ProfileInvolvementRecord = z.infer<typeof ProfileInvolvementRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.language` records.\n *\n * `proficiency` is advisory (`knownValues` in the lexicon) -- known values\n * are the five-level LinkedIn-compatible scale under `id.sifa.defs#*`.\n */\nexport const ProfileLanguageRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(64)).max(640),\n proficiency: z.string().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileLanguageRecord = z.infer<typeof ProfileLanguageRecordSchema>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n didSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n strongRefSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.position` records. */\nexport const ProfilePositionRecordSchema = z.object({\n company: z.string().min(1).refine(maxGraphemes(100)).max(1000).optional(),\n companyDid: didSchema.optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n title: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n employmentType: z.string().optional(),\n workplaceType: z.string().optional(),\n location: z.unknown().optional(),\n startedAt: partialDateSchema,\n endedAt: partialDateSchema.optional(),\n skills: z.array(strongRefSchema).max(50).optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePositionRecord = z.infer<typeof ProfilePositionRecordSchema>;\n","import { z } from 'zod';\n\nimport { BlobRefSchema } from './blob-ref.js';\nimport { datetimeSchema, externalRecordRefSchema, maxGraphemes, uriSchema } from './shared.js';\n\n/**\n * Duration of a presentation, in minutes. Mirrors\n * `id.sifa.profile.presentation#duration`: a fixed length (minMinutes only) or\n * a range (minMinutes to maxMinutes).\n */\nexport const PresentationDurationSchema = z\n .object({\n minMinutes: z.number().int().min(1),\n maxMinutes: z.number().int().min(1).optional(),\n })\n .refine((d) => d.maxMinutes === undefined || d.maxMinutes >= d.minMinutes, {\n message: 'maxMinutes must be greater than or equal to minMinutes',\n path: ['maxMinutes'],\n });\n\nexport type PresentationDuration = z.infer<typeof PresentationDurationSchema>;\n\n/**\n * A related link for a presentation or one of its deliveries. Mirrors\n * `id.sifa.defs#presentationLink`. `type` is an open enum (knownValues), so any\n * string is accepted.\n */\nexport const PresentationLinkSchema = z.object({\n uri: uriSchema,\n label: z.string().refine(maxGraphemes(64)).max(640).optional(),\n type: z.string().optional(),\n});\n\nexport type PresentationLink = z.infer<typeof PresentationLinkSchema>;\n\n/** Zod schema for `id.sifa.profile.presentation` records (the reusable content). */\nexport const ProfilePresentationRecordSchema = z.object({\n title: z.string().min(1).refine(maxGraphemes(300)).max(3000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n duration: PresentationDurationSchema.optional(),\n intendedAudiences: z\n .array(z.string().refine(maxGraphemes(100)).max(1000))\n .max(20)\n .optional(),\n links: z.array(PresentationLinkSchema).max(20).optional(),\n // Optional reference to a long-form write-up (pub.leaflet.document or\n // site.standard.document). Plain at-uri + optional cid so it tracks edits.\n writeupRef: externalRecordRefSchema.optional(),\n // Optional uploaded cover image for the talk page.\n coverImage: BlobRefSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePresentationRecord = z.infer<typeof ProfilePresentationRecordSchema>;\n","import { z } from 'zod';\n\nimport { PresentationLinkSchema } from './profile-presentation.js';\nimport { datetimeSchema, externalRecordRefSchema, maxGraphemes } from './shared.js';\n\n/**\n * Structured address for a delivery occasion. Mirrors\n * `community.lexicon.location.address` (all fields optional).\n */\nconst communityAddressSchema = z.object({\n country: z.string().optional(),\n postalCode: z.string().optional(),\n region: z.string().optional(),\n locality: z.string().optional(),\n street: z.string().optional(),\n name: z.string().optional(),\n});\n\n/**\n * Zod schema for `id.sifa.profile.presentationDelivery` records (one occasion\n * on which a presentation was delivered). Works standalone or linked to a\n * presentation and/or a calendar event. `role`, `mode`, and `status` are open\n * enums (knownValues); `mode`/`status` store the full\n * `community.lexicon.calendar.event` token.\n */\nexport const ProfilePresentationDeliveryRecordSchema = z.object({\n // Optional reference to the id.sifa.profile.presentation delivered here.\n presentationRef: externalRecordRefSchema.optional(),\n // Fallback title used when there is no presentationRef.\n title: z.string().refine(maxGraphemes(300)).max(3000).optional(),\n role: z.string().refine(maxGraphemes(64)).max(640).optional(),\n eventName: z.string().refine(maxGraphemes(300)).max(3000).optional(),\n // Calendar date as YYYY-MM-DD (day only).\n date: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'date must be YYYY-MM-DD')\n .optional(),\n location: z.string().refine(maxGraphemes(256)).max(2560).optional(),\n // Structured community.lexicon.location.address for the occasion. The\n // free-text `location` string above stays as a legacy fallback.\n address: communityAddressSchema.optional(),\n mode: z.string().optional(),\n status: z.string().optional(),\n links: z.array(PresentationLinkSchema).max(20).optional(),\n // Optional reference to a community.lexicon.calendar.event for this occasion.\n eventRef: externalRecordRefSchema.optional(),\n // DIDs of co-speakers who presented alongside the author at this occasion.\n coSpeakers: z\n .array(z.string().regex(/^did:[a-z]+:[^\\s]+$/, 'must be a DID'))\n .max(20)\n .optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePresentationDeliveryRecord = z.infer<\n typeof ProfilePresentationDeliveryRecordSchema\n>;\n","import { z } from 'zod';\n\nimport {\n datetimeSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n strongRefSchema,\n uriSchema,\n} from './shared.js';\n\n/** Zod schema for `id.sifa.profile.project` records. */\nexport const ProfileProjectRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n url: uriSchema.optional(),\n position: strongRefSchema.optional(),\n startedAt: partialDateSchema.optional(),\n endedAt: partialDateSchema.optional(),\n labels: selfLabelsSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileProjectRecord = z.infer<typeof ProfileProjectRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, partialDateSchema, uriSchema } from './shared.js';\n\n/** Author shape from `id.sifa.profile.publication#author`. */\nexport const PublicationAuthorSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n did: didSchema.optional(),\n});\n\nexport type PublicationAuthor = z.infer<typeof PublicationAuthorSchema>;\n\n/** Zod schema for `id.sifa.profile.publication` records. */\nexport const ProfilePublicationRecordSchema = z.object({\n title: z.string().min(1).refine(maxGraphemes(200)).max(2000),\n subtitle: z.string().refine(maxGraphemes(200)).max(2000).optional(),\n publisher: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n url: uriSchema.optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n authors: z.array(PublicationAuthorSchema).max(50).optional(),\n publishedAt: partialDateSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfilePublicationRecord = z.infer<typeof ProfilePublicationRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, languageTagSchema, maxGraphemes, selfLabelsSchema } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.self` records. Singleton (record key `self`).\n *\n * `knownValues` on `openTo` and `preferredWorkplace` are advisory per the\n * lexicon spec -- unknown values are allowed, but documented options live\n * under the `id.sifa.defs#*` namespace.\n */\nexport const ProfileSelfRecordSchema = z.object({\n headline: z.string().refine(maxGraphemes(120)).max(1200).optional(),\n about: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n industry: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n givenName: z.string().refine(maxGraphemes(64)).max(640).optional(),\n familyName: z.string().refine(maxGraphemes(64)).max(640).optional(),\n location: z.unknown().optional(),\n openTo: z.array(z.string()).max(10).optional(),\n preferredWorkplace: z.array(z.string()).max(3).optional(),\n langs: z.array(languageTagSchema).max(3).optional(),\n labels: selfLabelsSchema.optional(),\n discoverable: z.boolean().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileSelfRecord = z.infer<typeof ProfileSelfRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, maxGraphemes } from './shared.js';\n\n/**\n * Zod schema for `id.sifa.profile.skill` records.\n *\n * `category` is advisory (`knownValues` in the lexicon) -- known values live\n * under `id.sifa.defs#*` but unknown values are accepted.\n */\nexport const ProfileSkillRecordSchema = z.object({\n name: z.string().min(1).refine(maxGraphemes(64)).max(640),\n category: z.string().optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileSkillRecord = z.infer<typeof ProfileSkillRecordSchema>;\n","import { z } from 'zod';\n\nimport { datetimeSchema, didSchema, maxGraphemes, partialDateSchema } from './shared.js';\n\n/** Zod schema for `id.sifa.profile.volunteering` records. */\nexport const ProfileVolunteeringRecordSchema = z.object({\n organization: z.string().min(1).refine(maxGraphemes(100)).max(1000),\n organizationDid: didSchema.optional(),\n // Portable org entity identifier (Wikidata/ROR/LEI URI) from the typeahead.\n // Constrained to http(s) so a script-bearing scheme is never a valid ref (#159).\n entityRef: z\n .string()\n .url()\n .refine((s) => /^https?:\\/\\//i.test(s), { message: 'entityRef must be an http(s) URL' })\n .max(2048)\n .optional(),\n role: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n cause: z.string().refine(maxGraphemes(100)).max(1000).optional(),\n description: z.string().refine(maxGraphemes(5000)).max(50000).optional(),\n startedAt: partialDateSchema.optional(),\n endedAt: partialDateSchema.optional(),\n createdAt: datetimeSchema,\n});\n\nexport type ProfileVolunteeringRecord = z.infer<typeof ProfileVolunteeringRecordSchema>;\n","/**\n * Sifa SDK -- public client library for the Sifa AppView on AT Protocol.\n *\n * Pre-1.0: the public API is unstable and may change in any minor release.\n *\n * @see https://github.com/singi-labs/sifa-sdk\n */\n\ndeclare const __SIFA_SDK_VERSION__: string;\n\nexport const SIFA_SDK_VERSION: string = __SIFA_SDK_VERSION__;\n\nexport type {\n ActiveApp,\n Endorsement,\n EndorsementData,\n ExternalAccount,\n ExternalAccountKeytraceClaim,\n FeedItem,\n LanguageProficiency,\n LocationValue,\n OrgAddressView,\n OrgFloorVerdict,\n OrgLinkView,\n OrgProfileView,\n RecognizedEntity,\n PdsProviderInfo,\n PresentationLinkView,\n Profile,\n ProfileCertification,\n ProfileCourse,\n ProfileEducation,\n ProfileHonor,\n ProfileIndustry,\n ProfileInvolvement,\n ProfileInvolvementLink,\n ProfileLanguage,\n ProfileLocation,\n ProfileOverrideSource,\n ProfilePosition,\n ProfilePresentation,\n CoSpeaker,\n ProfilePresentationDelivery,\n ProfileProject,\n ProfilePublication,\n ProfileSkill,\n ProfileVolunteering,\n PublicationContributor,\n SkillRef,\n SkillSuggestion,\n TrustStat,\n VerifiedAccount,\n} from './types/index.js';\n\n// Aggregated public profile view (`id.sifa.getProfileView` XRPC query).\nexport type {\n ProfileView,\n IndustryDomain,\n ProfileLocationView,\n PositionView,\n EducationView,\n SkillView,\n CertificationView,\n ProjectView,\n VolunteeringView,\n InvolvementView,\n InvolvementLinkView,\n PublicationView,\n ContributorView,\n CourseView,\n DurationView,\n CoSpeakerView,\n PresentationDeliveryView,\n PresentationView,\n HonorView,\n LanguageView,\n ExternalAccountView,\n ActiveAppView,\n AtfundLinkView,\n} from './types/profile-view.js';\n\nexport {\n ACTIVITY_TIERS,\n APP_CATEGORIES,\n APP_CATEGORY_IDS,\n APP_CATEGORY_MAP,\n CATEGORY_LABELS,\n CATEGORY_ORDER,\n CONTINENTS,\n COMPANY_OPTIONAL_EMPLOYMENT_TYPES,\n COUNTRIES,\n CALENDAR_EVENT_MODE_LABELS,\n CALENDAR_EVENT_STATUS_LABELS,\n PRESENTATION_LINK_TYPE_LABELS,\n PRESENTATION_LINK_TYPE_OPTIONS,\n PRESENTATION_ROLE_LABELS,\n PRESENTATION_ROLE_OPTIONS,\n EMPLOYMENT_TYPE_GROUPS,\n EMPLOYMENT_TYPE_LABELS,\n INDUSTRY_OPTIONS,\n OPEN_TO_OPTIONS,\n OPEN_TO_TOKENS,\n OPEN_TO_TOKEN_TO_VALUE,\n OPEN_TO_VALUE_TO_TOKEN,\n categoryForApp,\n findIndustry,\n getActivityTaxonomyVersion,\n getActivityTier,\n getCalendarEventModeLabel,\n getCalendarEventStatusLabel,\n getPresentationLinkTypeLabel,\n getPresentationRoleLabel,\n getAppCategoryIcon,\n getEmploymentTypeLabel,\n isCompanyRequired,\n getIndustryLabelKey,\n getLexiconEntry,\n getOpenToLabelKey,\n normalizeOpenTo,\n openToTokenToValue,\n openToValueToToken,\n getTierMeta,\n getWorkplaceTypeLabel,\n normalizeWorkplaceTypes,\n isAppCategory,\n isKnownAppId,\n PLATFORM_LABELS,\n PLATFORM_OPTIONS,\n SKILL_CATEGORIES,\n WORKPLACE_TYPE_LABELS,\n WORKPLACE_TYPE_OPTIONS,\n dedupeSkills,\n getContinent,\n getFaviconUrl,\n getPlatformLabel,\n groupSkillsByCategory,\n isKnownPlatform,\n normalizePlatformId,\n type ActivityTaxonomy,\n type ActivityTier,\n type AppCategoryId,\n type ContinentCode,\n type EmploymentTypeGroup,\n type EmploymentTypeOption,\n type IndustryOption,\n type KnownAppId,\n type LexiconEntry,\n type MergedProfileSkill,\n type PresentationLinkTypeOption,\n type PresentationRoleOption,\n INVOLVEMENT_KIND_OPTIONS,\n INVOLVEMENT_KIND_LABELS,\n INVOLVEMENT_KIND_HEADINGS,\n getInvolvementKindHeading,\n getInvolvementKindLabel,\n ARTIFACT_LINK_KIND_OPTIONS,\n ARTIFACT_LINK_KIND_LABELS,\n getArtifactLinkKindLabel,\n VERIFICATION_PROVIDERS,\n getVerificationProvider,\n isKnownVerificationProvider,\n resolveVerifierProvider,\n primaryVerification,\n type AccountVerification,\n type VerificationProvider,\n type VerificationProviderId,\n type VerificationSource,\n type InvolvementKindOption,\n type ArtifactLinkKindOption,\n type OpenToGroup,\n type OpenToOption,\n type PlatformId,\n type SkillCategory,\n type TierMeta,\n type WorkplaceTypeOption,\n} from './taxonomy/index.js';\n\nexport {\n certDateExtractor,\n contrastRatio,\n countryCodeToFlag,\n dateRangeExtractor,\n detectPdsProvider,\n formatCompanyName,\n formatDateRange,\n formatDistanceToNow,\n formatLocation,\n formatPresentationDuration,\n formatRelativeTime,\n formatTimelineDate,\n getDisplayLabel,\n getHandleStem,\n getPdsDisplayName,\n isValidRgbColor,\n lexiconDateExtractor,\n limitCombiningMarks,\n meetsContrastAA,\n normalizeCompanyKey,\n normalizeLegalForm,\n parseLocationString,\n parseTalkRkey,\n pdsProviderFromApi,\n relativeLuminance,\n resolveEmbed,\n youtubeVideoId,\n youtubeThumbnailUrl,\n rgbToString,\n sanitizeDisplayText,\n sanitizeHandleInput,\n singleDateExtractor,\n slugifyTitle,\n buildTalkSlug,\n sortByDateDesc,\n summarizePresentationDeliveries,\n truncateGraphemes,\n type EmbedResult,\n type PdsProvider,\n type PresentationDeliverySummary,\n type RgbColor,\n} from './format/index.js';\n\nexport {\n parsePresentationDuration,\n durationFromMinutes,\n parseIntendedAudiences,\n stripHtmlToText,\n normalizePresentationRole,\n normalizePresentationMode,\n presentationCsvRowToRecord,\n presentationDeliveryCsvRowToRecord,\n type CsvRow,\n type ParsedPresentation,\n type ParsedDelivery,\n} from './import/index.js';\n\nexport {\n ACTIVITY_VISIBILITY_RULES,\n ADULT_CONTENT_LABELS,\n APP_URL_PATTERNS,\n COLLECTION_TO_APP,\n getAppIdForCollection,\n hasAdultContent,\n isVisibleActivityItem,\n resolveCardHealth,\n resolveCardUrl,\n type ActivityItemForUrl,\n type ActivityLabel,\n type AdultContentLabel,\n type AppUrlPatterns,\n type CardHealth,\n type CardHealthStrategy,\n} from './cards/index.js';\n\nexport {\n PUBLISHERS,\n STANDARD_PUBLISHER_ID,\n getPublisherById,\n getPublisherByHost,\n getPublisherFromSiteUrl,\n type Publisher,\n} from './publishers/index.js';\n\n// Shared activity-stream view-model: the normalized, framework-free feed both\n// sifa-web (React cards) and page.sifa.id (string-HTML renderer) consume.\nexport {\n ACTIVITY_VERBS,\n STREAM_VERBS,\n getActivityVerbsVersion,\n streamVerbSchema,\n verbForCollection,\n streamAddressSchema,\n streamAuthorSchema,\n streamCardBodySchema,\n streamCardSubjectSchema,\n streamCardVMSchema,\n streamExternalLinkSchema,\n streamGeoSchema,\n streamMediaSchema,\n streamRichSegmentSchema,\n streamSourceSchema,\n streamThemeSchema,\n toStreamCardVM,\n toStreamCardVMs,\n type ActivityItem,\n type ActivityVerbMap,\n type StreamAddress,\n type StreamAuthor,\n type StreamCardBody,\n type StreamCardSubject,\n type StreamCardVM,\n type StreamExternalLink,\n type StreamGeo,\n type StreamMedia,\n type StreamMediaBase,\n type StreamMediaBlob,\n type StreamMediaResolved,\n type StreamRichSegment,\n type StreamSource,\n type StreamTheme,\n type StreamVerb,\n type ToStreamCardVMOptions,\n} from './stream/index.js';\n\nexport {\n COMPLETENESS_MAX_SCORE,\n completenessPercent,\n completenessScore,\n DIMENSIONS_MAX_SCORE,\n MIN_SKILLS,\n countFilledDimensions,\n dimensionsFromInputs,\n getFilledDimensionsMap,\n pickPrimaryPosition,\n summarizeProfileView,\n profileToDimensionInputs,\n isPseudoEmployer,\n looksLikeDomain,\n entityDisambiguationLabel,\n searchResultDisambiguation,\n entityResultKey,\n classifyEntityRef,\n isLinked,\n ENTITY_REF_ANCHORS,\n qualifiesAsOrg,\n isRegistrableDomainHandle,\n isCompanyPageIndexable,\n COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS,\n type DimensionKey,\n type DimensionMap,\n type PrimaryPositionCandidate,\n type ProfileSummary,\n type SummarizeProfileViewOptions,\n type ProfileCompletion,\n type ProfileDimensionInputs,\n type DisambiguationFields,\n type EntityRefAnchor,\n type CompanyFirmographics,\n} from './logic/index.js';\n\n// Profile section model: which sections render, in what order, their nav\n// grouping, per-section sorts, and involvement grouping. Shared by the HTML\n// profile page, the Markdown/DOCX/print exports, and the personal-site renderer.\nexport {\n ALL_SECTIONS,\n INVOLVEMENT_HEADING_ORDER,\n SECTION_GROUPS,\n SECTION_LABELS,\n filterHidden,\n getVisibleSectionIds,\n groupInvolvementByHeading,\n hoistPrimary,\n isSectionPopulated,\n sortByActiveDateRange,\n sortCertifications,\n sortEducation,\n sortHonors,\n sortLanguages,\n sortLanguagesByProficiency,\n sortPositions,\n sortProjects,\n sortPublications,\n visibleItems,\n type InvolvementGroup,\n type SectionGroupId,\n type SectionId,\n} from './profile/index.js';\n\nexport {\n AtmosphereFeedItemSchema,\n BlobRefSchema,\n EndorsementConfirmationRecordSchema,\n EndorsementRecordSchema,\n OrgProfileRecordSchema,\n OrgEmploymentAttestationRecordSchema,\n EntitySearchResultSchema,\n EntitySearchResponseSchema,\n EntitySelectRequestSchema,\n EntitySelectResponseSchema,\n EntityImportSearchResponseSchema,\n EntityResolveDomainRequestSchema,\n EntityResolveDomainResponseSchema,\n EntityMintDomainResponseSchema,\n FEATURE_FLAGS,\n FeatureAllowlistEntrySchema,\n FeedActorSchema,\n FollowFeedItemSchema,\n FollowFeedPageSchema,\n FollowProfilePageSchema,\n FollowProfileSchema,\n GraphFollowRecordSchema,\n PresentationDurationSchema,\n PresentationLinkSchema,\n ProfileCertificationRecordSchema,\n ProfileCourseRecordSchema,\n ProfileEducationRecordSchema,\n ProfileExternalAccountRecordSchema,\n ProfileHonorRecordSchema,\n ProfileInvolvementRecordSchema,\n ArtifactLinkSchema,\n PROFILE_INVOLVEMENT_NSID,\n ProfileLanguageRecordSchema,\n ProfilePositionRecordSchema,\n ProfilePresentationDeliveryRecordSchema,\n ProfilePresentationRecordSchema,\n ProfileProjectRecordSchema,\n ProfilePublicationRecordSchema,\n ProfileSelfRecordSchema,\n ProfileSkillRecordSchema,\n ProfileVolunteeringRecordSchema,\n PublicationAuthorSchema,\n SifaFeedItemSchema,\n atUriSchema,\n cidSchema,\n datetimeSchema,\n decodeFeedCursor,\n didSchema,\n encodeFeedCursor,\n externalRecordRefSchema,\n languageTagSchema,\n makeGraphFollowRecordSchema,\n maxGraphemes,\n partialDateSchema,\n selfLabelsSchema,\n strongRefSchema,\n uriSchema,\n type AtmosphereFeedItem,\n type BlobRef,\n type EndorsementConfirmationRecord,\n type EndorsementRecord,\n type OrgProfileRecord,\n type OrgEmploymentAttestationRecord,\n type EntitySearchResult,\n type EntitySearchResponse,\n type EntitySelectRequest,\n type EntitySelectResponse,\n type EntityImportSearchResponse,\n type EntityResolveDomainRequest,\n type EntityResolveDomainResponse,\n type EntityMintDomainResponse,\n type FeatureAllowlistEntry,\n type FeatureFlag,\n type FeedActor,\n type FeedCursor,\n type FollowFeedItem,\n type FollowFeedPage,\n type FollowProfileItem,\n type FollowProfilePage,\n type GraphFollowRecord,\n type SifaFeedItem,\n type ProfileCertificationRecord,\n type ProfileCourseRecord,\n type ProfileEducationRecord,\n type ProfileExternalAccountRecord,\n type ProfileHonorRecord,\n type ProfileInvolvementRecord,\n type ArtifactLink,\n type ProfileLanguageRecord,\n type PresentationDuration,\n type PresentationLink,\n type ProfilePositionRecord,\n type ProfilePresentationDeliveryRecord,\n type ProfilePresentationRecord,\n type ProfileProjectRecord,\n type ProfilePublicationRecord,\n type ProfileSelfRecord,\n type ProfileSkillRecord,\n type ProfileVolunteeringRecord,\n type PublicationAuthor,\n} from './schemas/index.js';\n"]}
|