@singi-labs/sifa-sdk 0.9.20 → 0.9.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/index.d.cts CHANGED
@@ -171,6 +171,126 @@ declare function dedupeSkills(skills: ProfileSkill[]): MergedProfileSkill[];
171
171
  */
172
172
  declare function groupSkillsByCategory<T extends ProfileSkill>(skills: T[]): [string, T[]][];
173
173
 
174
+ /**
175
+ * App-category taxonomy for AT Protocol apps tracked by Sifa.
176
+ *
177
+ * Categories group apps by what kind of activity they produce (Posts, Photos,
178
+ * Code, ...). They drive the pill-size icon shown in `<AppPill>` and the
179
+ * fallback glyph used in activity-card headers when no app-specific logo
180
+ * exists.
181
+ *
182
+ * This file is intentionally data-only -- icon mapping is renderer-specific
183
+ * (React DOM Phosphor components on web, React Native components on mobile)
184
+ * and lives in the consumer. The `phosphorIcon` field is the Phosphor icon
185
+ * NAME, not a component reference.
186
+ *
187
+ * Categories are an internal grouping; we do not surface this taxonomy in
188
+ * public-facing copy.
189
+ */
190
+ declare const APP_CATEGORIES: {
191
+ readonly Articles: {
192
+ readonly phosphorIcon: "Article";
193
+ };
194
+ readonly Chat: {
195
+ readonly phosphorIcon: "ChatsCircle";
196
+ };
197
+ readonly Code: {
198
+ readonly phosphorIcon: "Code";
199
+ };
200
+ readonly Events: {
201
+ readonly phosphorIcon: "CalendarBlank";
202
+ };
203
+ readonly Links: {
204
+ readonly phosphorIcon: "LinkSimple";
205
+ };
206
+ readonly Lists: {
207
+ readonly phosphorIcon: "ListBullets";
208
+ };
209
+ readonly Pages: {
210
+ readonly phosphorIcon: "BrowserSimple";
211
+ };
212
+ readonly Pastes: {
213
+ readonly phosphorIcon: "Clipboard";
214
+ };
215
+ readonly Photos: {
216
+ readonly phosphorIcon: "Camera";
217
+ };
218
+ readonly Places: {
219
+ readonly phosphorIcon: "MapPin";
220
+ };
221
+ readonly Posts: {
222
+ readonly phosphorIcon: "ChatCircle";
223
+ };
224
+ readonly Questions: {
225
+ readonly phosphorIcon: "Question";
226
+ };
227
+ readonly Research: {
228
+ readonly phosphorIcon: "Path";
229
+ };
230
+ readonly Reviews: {
231
+ readonly phosphorIcon: "Star";
232
+ };
233
+ readonly Social: {
234
+ readonly phosphorIcon: "UsersThree";
235
+ };
236
+ readonly Verification: {
237
+ readonly phosphorIcon: "Key";
238
+ };
239
+ readonly Video: {
240
+ readonly phosphorIcon: "VideoCamera";
241
+ };
242
+ };
243
+ type AppCategoryId = keyof typeof APP_CATEGORIES;
244
+ declare const APP_CATEGORY_IDS: AppCategoryId[];
245
+ declare function isAppCategory(value: string): value is AppCategoryId;
246
+ declare function getAppCategoryIcon(category: AppCategoryId): string;
247
+
248
+ /**
249
+ * Maps every AT Protocol app Sifa tracks to its `AppCategoryId`. Single source
250
+ * of truth for what category an app belongs to; sifa-api and sifa-web both
251
+ * import from here.
252
+ *
253
+ * Add a new app: pick the category whose generic glyph best represents the
254
+ * activity. If no existing category fits, add a new one to APP_CATEGORIES
255
+ * rather than introducing a per-app override.
256
+ */
257
+
258
+ declare const APP_CATEGORY_MAP: {
259
+ readonly bluesky: "Posts";
260
+ readonly tangled: "Code";
261
+ readonly github: "Code";
262
+ readonly smokesignal: "Events";
263
+ readonly flashes: "Photos";
264
+ readonly grain: "Photos";
265
+ readonly whitewind: "Articles";
266
+ readonly frontpage: "Links";
267
+ readonly picosky: "Chat";
268
+ readonly pastesphere: "Pastes";
269
+ readonly standard: "Articles";
270
+ readonly aetheros: "Pages";
271
+ readonly roomy: "Social";
272
+ readonly keytrace: "Verification";
273
+ readonly popfeed: "Reviews";
274
+ readonly streamplace: "Video";
275
+ readonly semble: "Research";
276
+ readonly youandme: "Social";
277
+ readonly leaflet: "Articles";
278
+ readonly colibri: "Social";
279
+ readonly collectivesocial: "Lists";
280
+ readonly linkat: "Links";
281
+ readonly kipclip: "Links";
282
+ readonly statusphere: "Social";
283
+ readonly bookhive: "Reviews";
284
+ readonly passports: "Social";
285
+ readonly beaconbits: "Places";
286
+ readonly margin: "Research";
287
+ readonly anisota: "Posts";
288
+ readonly asq: "Questions";
289
+ };
290
+ type KnownAppId = keyof typeof APP_CATEGORY_MAP;
291
+ declare function isKnownAppId(appId: string): appId is KnownAppId;
292
+ declare function categoryForApp(appId: string): AppCategoryId | undefined;
293
+
174
294
  type ActivityTier = 'creation' | 'action' | 'filtered';
175
295
  interface TierMeta {
176
296
  label: string | null;
@@ -583,4 +703,4 @@ declare function pickPrimaryPosition<T extends PrimaryPositionCandidate>(positio
583
703
  */
584
704
  declare const SIFA_SDK_VERSION: string;
585
705
 
586
- export { ACTIVITY_TIERS, ACTIVITY_VISIBILITY_RULES, APP_URL_PATTERNS, type ActivityItemForUrl, type ActivityTaxonomy, type ActivityTier, type AppUrlPatterns, CATEGORY_LABELS, CATEGORY_ORDER, COLLECTION_TO_APP, COMPLETENESS_MAX_SCORE, CONTINENTS, COUNTRIES, type ContinentCode, DIMENSIONS_MAX_SCORE, type DimensionKey, type DimensionMap, EMPLOYMENT_TYPE_GROUPS, EMPLOYMENT_TYPE_LABELS, type EmploymentTypeGroup, type EmploymentTypeOption, INDUSTRY_OPTIONS, type IndustryOption, type LexiconEntry, LocationValue, MIN_SKILLS, type MergedProfileSkill, OPEN_TO_OPTIONS, type OpenToOption, PLATFORM_LABELS, PLATFORM_OPTIONS, type PdsProvider, PdsProviderInfo, type PlatformId, type PrimaryPositionCandidate, Profile, type ProfileCompletion, type ProfileDimensionInputs, ProfileSkill, type RgbColor, SIFA_SDK_VERSION, SKILL_CATEGORIES, type SkillCategory, type TierMeta, WORKPLACE_TYPE_LABELS, WORKPLACE_TYPE_OPTIONS, type WorkplaceTypeOption, certDateExtractor, completenessPercent, completenessScore, contrastRatio, countFilledDimensions, countryCodeToFlag, dateRangeExtractor, dedupeSkills, detectPdsProvider, dimensionsFromInputs, findIndustry, formatDistanceToNow, formatLocation, formatRelativeTime, getActivityTaxonomyVersion, getActivityTier, getAppIdForCollection, getContinent, getDisplayLabel, getEmploymentTypeLabel, getFaviconUrl, getFilledDimensionsMap, getHandleStem, getIndustryLabelKey, getLexiconEntry, getOpenToLabelKey, getPdsDisplayName, getPlatformLabel, getTierMeta, getWorkplaceTypeLabel, groupSkillsByCategory, isKnownPlatform, isValidRgbColor, isVisibleActivityItem, lexiconDateExtractor, limitCombiningMarks, meetsContrastAA, parseLocationString, pdsProviderFromApi, pickPrimaryPosition, profileToDimensionInputs, relativeLuminance, resolveCardUrl, rgbToString, sanitizeDisplayText, sanitizeHandleInput, singleDateExtractor, sortByDateDesc, truncateGraphemes };
706
+ export { ACTIVITY_TIERS, ACTIVITY_VISIBILITY_RULES, APP_CATEGORIES, APP_CATEGORY_IDS, APP_CATEGORY_MAP, APP_URL_PATTERNS, type ActivityItemForUrl, type ActivityTaxonomy, type ActivityTier, type AppCategoryId, type AppUrlPatterns, CATEGORY_LABELS, CATEGORY_ORDER, COLLECTION_TO_APP, COMPLETENESS_MAX_SCORE, CONTINENTS, COUNTRIES, type ContinentCode, DIMENSIONS_MAX_SCORE, type DimensionKey, type DimensionMap, EMPLOYMENT_TYPE_GROUPS, EMPLOYMENT_TYPE_LABELS, type EmploymentTypeGroup, type EmploymentTypeOption, INDUSTRY_OPTIONS, type IndustryOption, type KnownAppId, type LexiconEntry, LocationValue, MIN_SKILLS, type MergedProfileSkill, OPEN_TO_OPTIONS, type OpenToOption, PLATFORM_LABELS, PLATFORM_OPTIONS, type PdsProvider, PdsProviderInfo, type PlatformId, type PrimaryPositionCandidate, Profile, type ProfileCompletion, type ProfileDimensionInputs, ProfileSkill, type RgbColor, SIFA_SDK_VERSION, SKILL_CATEGORIES, type SkillCategory, type TierMeta, WORKPLACE_TYPE_LABELS, WORKPLACE_TYPE_OPTIONS, type WorkplaceTypeOption, categoryForApp, certDateExtractor, completenessPercent, completenessScore, contrastRatio, countFilledDimensions, countryCodeToFlag, dateRangeExtractor, dedupeSkills, detectPdsProvider, dimensionsFromInputs, findIndustry, formatDistanceToNow, formatLocation, formatRelativeTime, getActivityTaxonomyVersion, getActivityTier, getAppCategoryIcon, getAppIdForCollection, getContinent, getDisplayLabel, getEmploymentTypeLabel, getFaviconUrl, getFilledDimensionsMap, getHandleStem, getIndustryLabelKey, getLexiconEntry, getOpenToLabelKey, getPdsDisplayName, getPlatformLabel, getTierMeta, getWorkplaceTypeLabel, groupSkillsByCategory, isAppCategory, isKnownAppId, isKnownPlatform, isValidRgbColor, isVisibleActivityItem, lexiconDateExtractor, limitCombiningMarks, meetsContrastAA, parseLocationString, pdsProviderFromApi, pickPrimaryPosition, profileToDimensionInputs, relativeLuminance, resolveCardUrl, rgbToString, sanitizeDisplayText, sanitizeHandleInput, singleDateExtractor, sortByDateDesc, truncateGraphemes };
package/dist/index.d.ts CHANGED
@@ -171,6 +171,126 @@ declare function dedupeSkills(skills: ProfileSkill[]): MergedProfileSkill[];
171
171
  */
172
172
  declare function groupSkillsByCategory<T extends ProfileSkill>(skills: T[]): [string, T[]][];
173
173
 
174
+ /**
175
+ * App-category taxonomy for AT Protocol apps tracked by Sifa.
176
+ *
177
+ * Categories group apps by what kind of activity they produce (Posts, Photos,
178
+ * Code, ...). They drive the pill-size icon shown in `<AppPill>` and the
179
+ * fallback glyph used in activity-card headers when no app-specific logo
180
+ * exists.
181
+ *
182
+ * This file is intentionally data-only -- icon mapping is renderer-specific
183
+ * (React DOM Phosphor components on web, React Native components on mobile)
184
+ * and lives in the consumer. The `phosphorIcon` field is the Phosphor icon
185
+ * NAME, not a component reference.
186
+ *
187
+ * Categories are an internal grouping; we do not surface this taxonomy in
188
+ * public-facing copy.
189
+ */
190
+ declare const APP_CATEGORIES: {
191
+ readonly Articles: {
192
+ readonly phosphorIcon: "Article";
193
+ };
194
+ readonly Chat: {
195
+ readonly phosphorIcon: "ChatsCircle";
196
+ };
197
+ readonly Code: {
198
+ readonly phosphorIcon: "Code";
199
+ };
200
+ readonly Events: {
201
+ readonly phosphorIcon: "CalendarBlank";
202
+ };
203
+ readonly Links: {
204
+ readonly phosphorIcon: "LinkSimple";
205
+ };
206
+ readonly Lists: {
207
+ readonly phosphorIcon: "ListBullets";
208
+ };
209
+ readonly Pages: {
210
+ readonly phosphorIcon: "BrowserSimple";
211
+ };
212
+ readonly Pastes: {
213
+ readonly phosphorIcon: "Clipboard";
214
+ };
215
+ readonly Photos: {
216
+ readonly phosphorIcon: "Camera";
217
+ };
218
+ readonly Places: {
219
+ readonly phosphorIcon: "MapPin";
220
+ };
221
+ readonly Posts: {
222
+ readonly phosphorIcon: "ChatCircle";
223
+ };
224
+ readonly Questions: {
225
+ readonly phosphorIcon: "Question";
226
+ };
227
+ readonly Research: {
228
+ readonly phosphorIcon: "Path";
229
+ };
230
+ readonly Reviews: {
231
+ readonly phosphorIcon: "Star";
232
+ };
233
+ readonly Social: {
234
+ readonly phosphorIcon: "UsersThree";
235
+ };
236
+ readonly Verification: {
237
+ readonly phosphorIcon: "Key";
238
+ };
239
+ readonly Video: {
240
+ readonly phosphorIcon: "VideoCamera";
241
+ };
242
+ };
243
+ type AppCategoryId = keyof typeof APP_CATEGORIES;
244
+ declare const APP_CATEGORY_IDS: AppCategoryId[];
245
+ declare function isAppCategory(value: string): value is AppCategoryId;
246
+ declare function getAppCategoryIcon(category: AppCategoryId): string;
247
+
248
+ /**
249
+ * Maps every AT Protocol app Sifa tracks to its `AppCategoryId`. Single source
250
+ * of truth for what category an app belongs to; sifa-api and sifa-web both
251
+ * import from here.
252
+ *
253
+ * Add a new app: pick the category whose generic glyph best represents the
254
+ * activity. If no existing category fits, add a new one to APP_CATEGORIES
255
+ * rather than introducing a per-app override.
256
+ */
257
+
258
+ declare const APP_CATEGORY_MAP: {
259
+ readonly bluesky: "Posts";
260
+ readonly tangled: "Code";
261
+ readonly github: "Code";
262
+ readonly smokesignal: "Events";
263
+ readonly flashes: "Photos";
264
+ readonly grain: "Photos";
265
+ readonly whitewind: "Articles";
266
+ readonly frontpage: "Links";
267
+ readonly picosky: "Chat";
268
+ readonly pastesphere: "Pastes";
269
+ readonly standard: "Articles";
270
+ readonly aetheros: "Pages";
271
+ readonly roomy: "Social";
272
+ readonly keytrace: "Verification";
273
+ readonly popfeed: "Reviews";
274
+ readonly streamplace: "Video";
275
+ readonly semble: "Research";
276
+ readonly youandme: "Social";
277
+ readonly leaflet: "Articles";
278
+ readonly colibri: "Social";
279
+ readonly collectivesocial: "Lists";
280
+ readonly linkat: "Links";
281
+ readonly kipclip: "Links";
282
+ readonly statusphere: "Social";
283
+ readonly bookhive: "Reviews";
284
+ readonly passports: "Social";
285
+ readonly beaconbits: "Places";
286
+ readonly margin: "Research";
287
+ readonly anisota: "Posts";
288
+ readonly asq: "Questions";
289
+ };
290
+ type KnownAppId = keyof typeof APP_CATEGORY_MAP;
291
+ declare function isKnownAppId(appId: string): appId is KnownAppId;
292
+ declare function categoryForApp(appId: string): AppCategoryId | undefined;
293
+
174
294
  type ActivityTier = 'creation' | 'action' | 'filtered';
175
295
  interface TierMeta {
176
296
  label: string | null;
@@ -583,4 +703,4 @@ declare function pickPrimaryPosition<T extends PrimaryPositionCandidate>(positio
583
703
  */
584
704
  declare const SIFA_SDK_VERSION: string;
585
705
 
586
- export { ACTIVITY_TIERS, ACTIVITY_VISIBILITY_RULES, APP_URL_PATTERNS, type ActivityItemForUrl, type ActivityTaxonomy, type ActivityTier, type AppUrlPatterns, CATEGORY_LABELS, CATEGORY_ORDER, COLLECTION_TO_APP, COMPLETENESS_MAX_SCORE, CONTINENTS, COUNTRIES, type ContinentCode, DIMENSIONS_MAX_SCORE, type DimensionKey, type DimensionMap, EMPLOYMENT_TYPE_GROUPS, EMPLOYMENT_TYPE_LABELS, type EmploymentTypeGroup, type EmploymentTypeOption, INDUSTRY_OPTIONS, type IndustryOption, type LexiconEntry, LocationValue, MIN_SKILLS, type MergedProfileSkill, OPEN_TO_OPTIONS, type OpenToOption, PLATFORM_LABELS, PLATFORM_OPTIONS, type PdsProvider, PdsProviderInfo, type PlatformId, type PrimaryPositionCandidate, Profile, type ProfileCompletion, type ProfileDimensionInputs, ProfileSkill, type RgbColor, SIFA_SDK_VERSION, SKILL_CATEGORIES, type SkillCategory, type TierMeta, WORKPLACE_TYPE_LABELS, WORKPLACE_TYPE_OPTIONS, type WorkplaceTypeOption, certDateExtractor, completenessPercent, completenessScore, contrastRatio, countFilledDimensions, countryCodeToFlag, dateRangeExtractor, dedupeSkills, detectPdsProvider, dimensionsFromInputs, findIndustry, formatDistanceToNow, formatLocation, formatRelativeTime, getActivityTaxonomyVersion, getActivityTier, getAppIdForCollection, getContinent, getDisplayLabel, getEmploymentTypeLabel, getFaviconUrl, getFilledDimensionsMap, getHandleStem, getIndustryLabelKey, getLexiconEntry, getOpenToLabelKey, getPdsDisplayName, getPlatformLabel, getTierMeta, getWorkplaceTypeLabel, groupSkillsByCategory, isKnownPlatform, isValidRgbColor, isVisibleActivityItem, lexiconDateExtractor, limitCombiningMarks, meetsContrastAA, parseLocationString, pdsProviderFromApi, pickPrimaryPosition, profileToDimensionInputs, relativeLuminance, resolveCardUrl, rgbToString, sanitizeDisplayText, sanitizeHandleInput, singleDateExtractor, sortByDateDesc, truncateGraphemes };
706
+ export { ACTIVITY_TIERS, ACTIVITY_VISIBILITY_RULES, APP_CATEGORIES, APP_CATEGORY_IDS, APP_CATEGORY_MAP, APP_URL_PATTERNS, type ActivityItemForUrl, type ActivityTaxonomy, type ActivityTier, type AppCategoryId, type AppUrlPatterns, CATEGORY_LABELS, CATEGORY_ORDER, COLLECTION_TO_APP, COMPLETENESS_MAX_SCORE, CONTINENTS, COUNTRIES, type ContinentCode, DIMENSIONS_MAX_SCORE, type DimensionKey, type DimensionMap, EMPLOYMENT_TYPE_GROUPS, EMPLOYMENT_TYPE_LABELS, type EmploymentTypeGroup, type EmploymentTypeOption, INDUSTRY_OPTIONS, type IndustryOption, type KnownAppId, type LexiconEntry, LocationValue, MIN_SKILLS, type MergedProfileSkill, OPEN_TO_OPTIONS, type OpenToOption, PLATFORM_LABELS, PLATFORM_OPTIONS, type PdsProvider, PdsProviderInfo, type PlatformId, type PrimaryPositionCandidate, Profile, type ProfileCompletion, type ProfileDimensionInputs, ProfileSkill, type RgbColor, SIFA_SDK_VERSION, SKILL_CATEGORIES, type SkillCategory, type TierMeta, WORKPLACE_TYPE_LABELS, WORKPLACE_TYPE_OPTIONS, type WorkplaceTypeOption, categoryForApp, certDateExtractor, completenessPercent, completenessScore, contrastRatio, countFilledDimensions, countryCodeToFlag, dateRangeExtractor, dedupeSkills, detectPdsProvider, dimensionsFromInputs, findIndustry, formatDistanceToNow, formatLocation, formatRelativeTime, getActivityTaxonomyVersion, getActivityTier, getAppCategoryIcon, getAppIdForCollection, getContinent, getDisplayLabel, getEmploymentTypeLabel, getFaviconUrl, getFilledDimensionsMap, getHandleStem, getIndustryLabelKey, getLexiconEntry, getOpenToLabelKey, getPdsDisplayName, getPlatformLabel, getTierMeta, getWorkplaceTypeLabel, groupSkillsByCategory, isAppCategory, isKnownAppId, isKnownPlatform, isValidRgbColor, isVisibleActivityItem, lexiconDateExtractor, limitCombiningMarks, meetsContrastAA, parseLocationString, pdsProviderFromApi, pickPrimaryPosition, profileToDimensionInputs, relativeLuminance, resolveCardUrl, rgbToString, sanitizeDisplayText, sanitizeHandleInput, singleDateExtractor, sortByDateDesc, truncateGraphemes };
package/dist/index.js CHANGED
@@ -794,6 +794,76 @@ function groupSkillsByCategory(skills) {
794
794
  return ordered;
795
795
  }
796
796
 
797
+ // src/taxonomy/app-categories.ts
798
+ var APP_CATEGORIES = {
799
+ Articles: { phosphorIcon: "Article" },
800
+ Chat: { phosphorIcon: "ChatsCircle" },
801
+ Code: { phosphorIcon: "Code" },
802
+ Events: { phosphorIcon: "CalendarBlank" },
803
+ Links: { phosphorIcon: "LinkSimple" },
804
+ Lists: { phosphorIcon: "ListBullets" },
805
+ Pages: { phosphorIcon: "BrowserSimple" },
806
+ Pastes: { phosphorIcon: "Clipboard" },
807
+ Photos: { phosphorIcon: "Camera" },
808
+ Places: { phosphorIcon: "MapPin" },
809
+ Posts: { phosphorIcon: "ChatCircle" },
810
+ Questions: { phosphorIcon: "Question" },
811
+ Research: { phosphorIcon: "Path" },
812
+ Reviews: { phosphorIcon: "Star" },
813
+ Social: { phosphorIcon: "UsersThree" },
814
+ Verification: { phosphorIcon: "Key" },
815
+ Video: { phosphorIcon: "VideoCamera" }
816
+ };
817
+ var APP_CATEGORY_IDS = Object.keys(APP_CATEGORIES);
818
+ function isAppCategory(value) {
819
+ return Object.prototype.hasOwnProperty.call(APP_CATEGORIES, value);
820
+ }
821
+ function getAppCategoryIcon(category) {
822
+ return APP_CATEGORIES[category].phosphorIcon;
823
+ }
824
+
825
+ // src/taxonomy/app-category-map.ts
826
+ var APP_CATEGORY_MAP = {
827
+ // API registry (backend-scanned)
828
+ bluesky: "Posts",
829
+ tangled: "Code",
830
+ github: "Code",
831
+ smokesignal: "Events",
832
+ flashes: "Photos",
833
+ grain: "Photos",
834
+ whitewind: "Articles",
835
+ frontpage: "Links",
836
+ picosky: "Chat",
837
+ pastesphere: "Pastes",
838
+ standard: "Articles",
839
+ aetheros: "Pages",
840
+ roomy: "Social",
841
+ keytrace: "Verification",
842
+ popfeed: "Reviews",
843
+ streamplace: "Video",
844
+ semble: "Research",
845
+ youandme: "Social",
846
+ leaflet: "Articles",
847
+ colibri: "Social",
848
+ collectivesocial: "Lists",
849
+ // Web-only (rendered in pills/cards; not scanned as standalone collections yet)
850
+ linkat: "Links",
851
+ kipclip: "Links",
852
+ statusphere: "Social",
853
+ bookhive: "Reviews",
854
+ passports: "Social",
855
+ beaconbits: "Places",
856
+ margin: "Research",
857
+ anisota: "Posts",
858
+ asq: "Questions"
859
+ };
860
+ function isKnownAppId(appId) {
861
+ return Object.prototype.hasOwnProperty.call(APP_CATEGORY_MAP, appId);
862
+ }
863
+ function categoryForApp(appId) {
864
+ return isKnownAppId(appId) ? APP_CATEGORY_MAP[appId] : void 0;
865
+ }
866
+
797
867
  // src/taxonomy/activity-tiers.json
798
868
  var activity_tiers_default = {
799
869
  $schema: "https://sifa.id/schemas/activity-tiers/v1.json",
@@ -1434,7 +1504,7 @@ var APP_URL_PATTERNS = Object.freeze({
1434
1504
  profileUrlPattern: "https://grain.social/profile/{did}"
1435
1505
  },
1436
1506
  youandme: { profileUrlPattern: "https://youandme.at" },
1437
- anisota: { profileUrlPattern: "https://anisota.net" },
1507
+ // anisota: upgraded with per-record URL pattern below.
1438
1508
  margin: { profileUrlPattern: "https://margin.at" },
1439
1509
  beaconbits: { profileUrlPattern: "https://beaconbits.app" },
1440
1510
  bookhive: { profileUrlPattern: "https://bookhive.buzz/profile/{handle}" },
@@ -1461,6 +1531,29 @@ var APP_URL_PATTERNS = Object.freeze({
1461
1531
  // at the marketing site.
1462
1532
  urlPattern: "https://leaflet.pub/{rkey}",
1463
1533
  profileUrlPattern: "https://leaflet.pub"
1534
+ },
1535
+ spark: {
1536
+ // Verified live: GET /post/{did}/{rkey} returns 200.
1537
+ urlPattern: "https://sprk.so/post/{did}/{rkey}",
1538
+ profileUrlPattern: "https://sprk.so/profile/{handle}"
1539
+ },
1540
+ anisota: {
1541
+ urlPattern: "https://anisota.net/post/{did}/{rkey}",
1542
+ profileUrlPattern: "https://anisota.net/profile/{handle}"
1543
+ },
1544
+ nooki: {
1545
+ // Per-post URLs use slug-based routing (e.g. /post/{slug}), not rkey —
1546
+ // can't be constructed from a record. Profile fallback only.
1547
+ profileUrlPattern: "https://nooki.me/user/{handle}"
1548
+ },
1549
+ atstore: {
1550
+ // SPA — per-record URLs require JS routing. Profile fallback only.
1551
+ profileUrlPattern: "https://atstore.fyi/@{handle}"
1552
+ },
1553
+ plyr: {
1554
+ // SPA — per-record URLs require JS routing. plyr.fm doesn't expose a
1555
+ // public per-handle profile page server-side either; falls back to root.
1556
+ profileUrlPattern: "https://plyr.fm"
1464
1557
  }
1465
1558
  });
1466
1559
  var COLLECTION_TO_APP = [
@@ -1497,7 +1590,11 @@ var COLLECTION_TO_APP = [
1497
1590
  ["social.colibri.", "colibri"],
1498
1591
  ["social.passports.", "passports"],
1499
1592
  ["fyi.asq.", "asq"],
1500
- ["pub.leaflet.", "leaflet"]
1593
+ ["pub.leaflet.", "leaflet"],
1594
+ ["so.sprk.", "spark"],
1595
+ ["community.nooki.", "nooki"],
1596
+ ["fyi.atstore.", "atstore"],
1597
+ ["fm.plyr.", "plyr"]
1501
1598
  ];
1502
1599
 
1503
1600
  // src/cards/resolve-card-url.ts
@@ -1964,8 +2061,8 @@ var ProfileVolunteeringRecordSchema = z.object({
1964
2061
  });
1965
2062
 
1966
2063
  // src/index.ts
1967
- var SIFA_SDK_VERSION = "0.9.20";
2064
+ var SIFA_SDK_VERSION = "0.9.22";
1968
2065
 
1969
- export { ACTIVITY_TIERS, ACTIVITY_VISIBILITY_RULES, APP_URL_PATTERNS, AtmosphereFeedItemSchema, CATEGORY_LABELS, CATEGORY_ORDER, COLLECTION_TO_APP, COMPLETENESS_MAX_SCORE, CONTINENTS, COUNTRIES, DIMENSIONS_MAX_SCORE, EMPLOYMENT_TYPE_GROUPS, EMPLOYMENT_TYPE_LABELS, EndorsementConfirmationRecordSchema, EndorsementRecordSchema, FEATURE_FLAGS, FeatureAllowlistEntrySchema, FeedActorSchema, FollowFeedItemSchema, FollowFeedPageSchema, FollowProfilePageSchema, FollowProfileSchema, GraphFollowRecordSchema, INDUSTRY_OPTIONS, MIN_SKILLS, OPEN_TO_OPTIONS, PLATFORM_LABELS, PLATFORM_OPTIONS, ProfileCertificationRecordSchema, ProfileCourseRecordSchema, ProfileEducationRecordSchema, ProfileExternalAccountRecordSchema, ProfileHonorRecordSchema, ProfileLanguageRecordSchema, ProfilePositionRecordSchema, ProfileProjectRecordSchema, ProfilePublicationRecordSchema, ProfileSelfRecordSchema, ProfileSkillRecordSchema, ProfileVolunteeringRecordSchema, PublicationAuthorSchema, SIFA_SDK_VERSION, SKILL_CATEGORIES, SifaFeedItemSchema, WORKPLACE_TYPE_LABELS, WORKPLACE_TYPE_OPTIONS, atUriSchema, certDateExtractor, cidSchema, completenessPercent, completenessScore, contrastRatio, countFilledDimensions, countryCodeToFlag, dateRangeExtractor, datetimeSchema, decodeFeedCursor, dedupeSkills, detectPdsProvider, didSchema, dimensionsFromInputs, encodeFeedCursor, findIndustry, formatDistanceToNow, formatLocation, formatRelativeTime, getActivityTaxonomyVersion, getActivityTier, getAppIdForCollection, getContinent, getDisplayLabel, getEmploymentTypeLabel, getFaviconUrl, getFilledDimensionsMap, getHandleStem, getIndustryLabelKey, getLexiconEntry, getOpenToLabelKey, getPdsDisplayName, getPlatformLabel, getTierMeta, getWorkplaceTypeLabel, groupSkillsByCategory, isKnownPlatform, isValidRgbColor, isVisibleActivityItem, languageTagSchema, lexiconDateExtractor, limitCombiningMarks, makeGraphFollowRecordSchema, maxGraphemes, meetsContrastAA, parseLocationString, pdsProviderFromApi, pickPrimaryPosition, profileToDimensionInputs, relativeLuminance, resolveCardUrl, rgbToString, sanitizeDisplayText, sanitizeHandleInput, selfLabelsSchema, singleDateExtractor, sortByDateDesc, strongRefSchema, truncateGraphemes, uriSchema };
2066
+ export { ACTIVITY_TIERS, ACTIVITY_VISIBILITY_RULES, APP_CATEGORIES, APP_CATEGORY_IDS, APP_CATEGORY_MAP, APP_URL_PATTERNS, AtmosphereFeedItemSchema, CATEGORY_LABELS, CATEGORY_ORDER, COLLECTION_TO_APP, COMPLETENESS_MAX_SCORE, CONTINENTS, COUNTRIES, DIMENSIONS_MAX_SCORE, EMPLOYMENT_TYPE_GROUPS, EMPLOYMENT_TYPE_LABELS, EndorsementConfirmationRecordSchema, EndorsementRecordSchema, FEATURE_FLAGS, FeatureAllowlistEntrySchema, FeedActorSchema, FollowFeedItemSchema, FollowFeedPageSchema, FollowProfilePageSchema, FollowProfileSchema, GraphFollowRecordSchema, INDUSTRY_OPTIONS, MIN_SKILLS, OPEN_TO_OPTIONS, PLATFORM_LABELS, PLATFORM_OPTIONS, ProfileCertificationRecordSchema, ProfileCourseRecordSchema, ProfileEducationRecordSchema, ProfileExternalAccountRecordSchema, ProfileHonorRecordSchema, ProfileLanguageRecordSchema, ProfilePositionRecordSchema, ProfileProjectRecordSchema, ProfilePublicationRecordSchema, ProfileSelfRecordSchema, ProfileSkillRecordSchema, ProfileVolunteeringRecordSchema, PublicationAuthorSchema, SIFA_SDK_VERSION, SKILL_CATEGORIES, SifaFeedItemSchema, WORKPLACE_TYPE_LABELS, WORKPLACE_TYPE_OPTIONS, atUriSchema, categoryForApp, certDateExtractor, cidSchema, completenessPercent, completenessScore, contrastRatio, countFilledDimensions, countryCodeToFlag, dateRangeExtractor, datetimeSchema, decodeFeedCursor, dedupeSkills, detectPdsProvider, didSchema, dimensionsFromInputs, encodeFeedCursor, findIndustry, formatDistanceToNow, formatLocation, formatRelativeTime, getActivityTaxonomyVersion, getActivityTier, getAppCategoryIcon, getAppIdForCollection, getContinent, getDisplayLabel, getEmploymentTypeLabel, getFaviconUrl, getFilledDimensionsMap, getHandleStem, getIndustryLabelKey, getLexiconEntry, getOpenToLabelKey, getPdsDisplayName, getPlatformLabel, getTierMeta, getWorkplaceTypeLabel, groupSkillsByCategory, isAppCategory, isKnownAppId, isKnownPlatform, isValidRgbColor, isVisibleActivityItem, languageTagSchema, lexiconDateExtractor, limitCombiningMarks, makeGraphFollowRecordSchema, maxGraphemes, meetsContrastAA, parseLocationString, pdsProviderFromApi, pickPrimaryPosition, profileToDimensionInputs, relativeLuminance, resolveCardUrl, rgbToString, sanitizeDisplayText, sanitizeHandleInput, selfLabelsSchema, singleDateExtractor, sortByDateDesc, strongRefSchema, truncateGraphemes, uriSchema };
1970
2067
  //# sourceMappingURL=index.js.map
1971
2068
  //# sourceMappingURL=index.js.map