@singi-labs/sifa-sdk 0.18.7 → 0.18.9

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
@@ -464,6 +464,9 @@ declare const APP_CATEGORY_MAP: {
464
464
  readonly askeverything: "Q&A";
465
465
  readonly greengale: "Articles";
466
466
  readonly kut: "Social";
467
+ readonly atmob: "Pastes";
468
+ readonly tokono: "Video";
469
+ readonly portable: "Social";
467
470
  readonly linkat: "Links";
468
471
  readonly kipclip: "Links";
469
472
  readonly statusphere: "Social";
@@ -2559,8 +2562,11 @@ interface InvolvementGroup {
2559
2562
  }
2560
2563
  /**
2561
2564
  * Group involvement records by their kind's display heading, in the fixed order
2562
- * above, most-recent first within a group. Empty groups are omitted. An unknown
2563
- * kind falls under "Other" (via the shared heading map).
2565
+ * above. Within a group, ongoing entries (no `endedAt`) float to the top, then
2566
+ * by end date descending, then start date descending -- the same current-first
2567
+ * ordering positions and education use (`lexiconDateExtractor`), so a role that
2568
+ * ended recently no longer sorts above a long-running current one. Empty groups
2569
+ * are omitted. An unknown kind falls under "Other" (via the shared heading map).
2564
2570
  */
2565
2571
  declare function groupInvolvementByHeading(items: ProfileInvolvement[]): InvolvementGroup[];
2566
2572
 
package/dist/index.d.ts CHANGED
@@ -464,6 +464,9 @@ declare const APP_CATEGORY_MAP: {
464
464
  readonly askeverything: "Q&A";
465
465
  readonly greengale: "Articles";
466
466
  readonly kut: "Social";
467
+ readonly atmob: "Pastes";
468
+ readonly tokono: "Video";
469
+ readonly portable: "Social";
467
470
  readonly linkat: "Links";
468
471
  readonly kipclip: "Links";
469
472
  readonly statusphere: "Social";
@@ -2559,8 +2562,11 @@ interface InvolvementGroup {
2559
2562
  }
2560
2563
  /**
2561
2564
  * Group involvement records by their kind's display heading, in the fixed order
2562
- * above, most-recent first within a group. Empty groups are omitted. An unknown
2563
- * kind falls under "Other" (via the shared heading map).
2565
+ * above. Within a group, ongoing entries (no `endedAt`) float to the top, then
2566
+ * by end date descending, then start date descending -- the same current-first
2567
+ * ordering positions and education use (`lexiconDateExtractor`), so a role that
2568
+ * ended recently no longer sorts above a long-running current one. Empty groups
2569
+ * are omitted. An unknown kind falls under "Other" (via the shared heading map).
2564
2570
  */
2565
2571
  declare function groupInvolvementByHeading(items: ProfileInvolvement[]): InvolvementGroup[];
2566
2572
 
package/dist/index.js CHANGED
@@ -1146,6 +1146,13 @@ var APP_CATEGORY_MAP = {
1146
1146
  // app.greengale.blog.entry — authored blog posts (title, subtitle, Markdown body)
1147
1147
  kut: "Social",
1148
1148
  // social.kut.community.membership — joining a Kut community (a commitment)
1149
+ // Onboard from the upcoming profile-of-the-day audit.
1150
+ atmob: "Pastes",
1151
+ // in.atmob.paste.{document,bundle} — authored text/code pastes on atmob.in
1152
+ tokono: "Video",
1153
+ // ma.tokono.byov.video — authored videos hosted via the tokono.ma "bring your own video" feature
1154
+ portable: "Social",
1155
+ // agency.portable.membership — joining a community (a commitment), attested by another actor
1149
1156
  // Web-only (rendered in pills/cards via sifa-web atproto-apps.ts;
1150
1157
  // no backend scan collection yet)
1151
1158
  linkat: "Links",
@@ -1162,8 +1169,8 @@ function categoryForApp(appId) {
1162
1169
  // src/taxonomy/activity-tiers.json
1163
1170
  var activity_tiers_default = {
1164
1171
  $schema: "https://sifa.id/schemas/activity-tiers/v1.json",
1165
- version: "1.3.0",
1166
- updated: "2026-08-25",
1172
+ version: "1.4.0",
1173
+ updated: "2026-09-04",
1167
1174
  tiers: {
1168
1175
  creation: {
1169
1176
  label: "Made",
@@ -1182,6 +1189,23 @@ var activity_tiers_default = {
1182
1189
  }
1183
1190
  },
1184
1191
  lexicons: {
1192
+ "agency.portable.membership": {
1193
+ tier: "creation",
1194
+ app: "portable",
1195
+ notes: "Joining a community (a commitment), attested by another actor."
1196
+ },
1197
+ "in.atmob.paste.document": {
1198
+ tier: "creation",
1199
+ app: "atmob"
1200
+ },
1201
+ "in.atmob.paste.bundle": {
1202
+ tier: "creation",
1203
+ app: "atmob"
1204
+ },
1205
+ "ma.tokono.byov.video": {
1206
+ tier: "creation",
1207
+ app: "tokono"
1208
+ },
1185
1209
  "app.atmobb.discussion.reply": {
1186
1210
  tier: "creation",
1187
1211
  app: "atmobb",
@@ -3483,6 +3507,22 @@ var APP_URL_PATTERNS = Object.freeze({
3483
3507
  // its own; the card links to the community it joined, built from the
3484
3508
  // membership's community.uri in resolve-card-url. Homepage fallback only.
3485
3509
  profileUrlPattern: "https://kut.social"
3510
+ },
3511
+ atmob: {
3512
+ // atmob (atmob.in) is a paste app. Its SPA viewer renders any paste by its
3513
+ // full at-uri via a `?uri=` query param (verified in the app's app.js:
3514
+ // `location.search = ?uri=${encodeURIComponent(uri)}`). Both paste.document
3515
+ // and paste.bundle share that viewer, so the per-record URL is built
3516
+ // bespoke from the item's own uri in resolve-card-url. No pattern here.
3517
+ },
3518
+ tokono: {
3519
+ // tokono (tokono.ma) hosts "bring your own video" records, but tokono.ma is
3520
+ // the owner's static personal site with no public per-video viewer route.
3521
+ // Cards render non-clickable.
3522
+ },
3523
+ portable: {
3524
+ // agency.portable (handle portable.agency) has no resolving website, and a
3525
+ // membership record has no page of its own. Cards render non-clickable.
3486
3526
  }
3487
3527
  });
3488
3528
  var COLLECTION_TO_APP = [
@@ -3570,7 +3610,11 @@ var COLLECTION_TO_APP = [
3570
3610
  // Onboard from angrydutchman.houseofmadness.org profile audit.
3571
3611
  ["app.askeverything.", "askeverything"],
3572
3612
  ["app.greengale.", "greengale"],
3573
- ["social.kut.", "kut"]
3613
+ ["social.kut.", "kut"],
3614
+ // Onboard from the upcoming profile-of-the-day audit.
3615
+ ["in.atmob.paste.", "atmob"],
3616
+ ["ma.tokono.byov.", "tokono"],
3617
+ ["agency.portable.", "portable"]
3574
3618
  ];
3575
3619
 
3576
3620
  // src/cards/resolve-card-url.ts
@@ -3753,6 +3797,10 @@ function resolveCardHealth(item) {
3753
3797
  if (collection === "exchange.recipe.recipe") {
3754
3798
  return patternHealth("recipe", { handle: authorHandle, did: authorDid, rkey }, collection);
3755
3799
  }
3800
+ if (collection.startsWith("in.atmob.paste.")) {
3801
+ if (uri) return recordHealth(`https://atmob.in/?uri=${encodeURIComponent(uri)}`);
3802
+ return { url: null, strategy: "none" };
3803
+ }
3756
3804
  const recordUrl = stringOrNull(record.url);
3757
3805
  if (recordUrl) return urlHealth(recordUrl);
3758
3806
  return patternHealth(appId, { handle: authorHandle, did: authorDid, rkey }, collection);
@@ -5317,13 +5365,11 @@ function groupInvolvementByHeading(items) {
5317
5365
  bucket.push(item);
5318
5366
  byHeading.set(heading, bucket);
5319
5367
  }
5320
- const recency = (i) => i.endedAt ?? i.startedAt ?? "";
5321
5368
  const groups = [];
5322
5369
  for (const heading of INVOLVEMENT_HEADING_ORDER) {
5323
5370
  const bucket = byHeading.get(heading);
5324
5371
  if (!bucket?.length) continue;
5325
- const sorted = [...bucket].sort((a, b) => recency(b).localeCompare(recency(a)));
5326
- groups.push({ heading, items: sorted });
5372
+ groups.push({ heading, items: sortByDateDesc(bucket, lexiconDateExtractor) });
5327
5373
  }
5328
5374
  return groups;
5329
5375
  }
@@ -6148,7 +6194,7 @@ function describeSifaRecord(collection, value) {
6148
6194
  }
6149
6195
 
6150
6196
  // src/index.ts
6151
- var SIFA_SDK_VERSION = "0.18.7";
6197
+ var SIFA_SDK_VERSION = "0.18.9";
6152
6198
 
6153
6199
  export { ACTIVITY_TIERS, ACTIVITY_VERBS, ACTIVITY_VISIBILITY_RULES, ADULT_CONTENT_LABELS, ALL_SECTIONS, APP_CATEGORIES, APP_CATEGORY_IDS, APP_CATEGORY_MAP, APP_URL_PATTERNS, ARTIFACT_LINK_KIND_LABELS, ARTIFACT_LINK_KIND_OPTIONS, ArtifactLinkSchema, AtmosphereFeedItemSchema, BlobRefSchema, CALENDAR_EVENT_MODE_LABELS, CALENDAR_EVENT_STATUS_LABELS, CATEGORY_LABELS, CATEGORY_ORDER, COLLECTION_TO_APP, COMPANY_OPTIONAL_EMPLOYMENT_TYPES, COMPANY_PAGE_MIN_FIRMOGRAPHIC_FIELDS, COMPLETENESS_MAX_SCORE, CONTINENTS, COUNTRIES, DIMENSIONS_MAX_SCORE, EMPLOYMENT_TYPE_GROUPS, EMPLOYMENT_TYPE_LABELS, ENTITY_REF_ANCHORS, EndorsementConfirmationRecordSchema, EndorsementRecordSchema, EntityImportSearchResponseSchema, EntityMintDomainResponseSchema, EntityResolveDomainRequestSchema, EntityResolveDomainResponseSchema, EntitySearchResponseSchema, EntitySearchResultSchema, EntitySelectRequestSchema, EntitySelectResponseSchema, FEATURE_FLAGS, FeatureAllowlistEntrySchema, FeedActorSchema, FollowFeedItemSchema, FollowFeedPageSchema, FollowProfilePageSchema, FollowProfileSchema, GraphFollowRecordSchema, INDUSTRY_OPTIONS, INVESTMENT_ROLE_LABELS, INVESTMENT_ROLE_OPTIONS, INVESTMENT_STAGE_LABELS, INVESTMENT_STAGE_OPTIONS, INVESTMENT_STATUS_LABELS, INVESTMENT_STATUS_OPTIONS, INVOLVEMENT_HEADING_ORDER, INVOLVEMENT_KIND_HEADINGS, INVOLVEMENT_KIND_LABELS, INVOLVEMENT_KIND_OPTIONS, InvestmentAmountSchema, MIN_SKILLS, ON_BEHALF_OF_EMPLOYMENT_TYPES, OPEN_TO_OPTIONS, OPEN_TO_TOKENS, OPEN_TO_TOKEN_TO_VALUE, OPEN_TO_VALUE_TO_TOKEN, OrgEmploymentAttestationRecordSchema, OrgProfileRecordSchema, PLATFORM_LABELS, PLATFORM_OPTIONS, PRESENTATION_LINK_TYPE_LABELS, PRESENTATION_LINK_TYPE_OPTIONS, PRESENTATION_ROLE_LABELS, PRESENTATION_ROLE_OPTIONS, PROFILE_INVESTMENT_NSID, PROFILE_INVOLVEMENT_NSID, PROJECT_ROLES, PUBLICATION_TYPE_LABELS, PUBLICATION_TYPE_OPTIONS, PUBLISHERS, PresentationDurationSchema, PresentationLinkSchema, ProfileCertificationRecordSchema, ProfileCourseRecordSchema, ProfileEducationRecordSchema, ProfileExternalAccountRecordSchema, ProfileHonorRecordSchema, ProfileInvestmentRecordSchema, ProfileInvolvementRecordSchema, ProfileLanguageRecordSchema, ProfilePositionRecordSchema, ProfilePresentationDeliveryRecordSchema, ProfilePresentationRecordSchema, ProfileProjectRecordSchema, ProfilePublicationRecordSchema, ProfileSelfRecordSchema, ProfileSkillRecordSchema, ProfileVolunteeringRecordSchema, PublicationAuthorSchema, ROADMAP_ISSUES_REPO, ROADMAP_ITEM_META, SECTION_GROUPS, SECTION_LABELS, SELF_APP_ID, SIFA_REPO_GROUPS, SIFA_SDK_VERSION, SKILL_CATEGORIES, STANDARD_PUBLISHER_ID, STREAM_VERBS, SifaFeedItemSchema, VERIFICATION_PROVIDERS, WORKPLACE_TYPE_LABELS, WORKPLACE_TYPE_OPTIONS, atUriSchema, buildMetaDescription, buildTalkSlug, categoryForApp, certDateExtractor, cidSchema, classifyEntityRef, completenessPercent, completenessScore, contrastRatio, countFilledDimensions, countRecentActivity, countryCodeToFlag, dateRangeExtractor, datetimeSchema, decodeFeedCursor, dedupeSkills, describeSifaRecord, detectPdsProvider, didSchema, dimensionsFromInputs, durationFromMinutes, encodeFeedCursor, entityDisambiguationLabel, entityResultKey, excludeSelfApp, externalRecordRefSchema, filterHidden, findIndustry, formatCompanyName, formatDateRange, formatDisplayUrl, formatDistanceToNow, formatLocation, formatPresentationDuration, formatRelativeTime, formatTimelineDate, getActivityTaxonomyVersion, getActivityTier, getActivityVerbsVersion, getAppCategoryIcon, getAppIdForCollection, getArtifactLinkKindLabel, getCalendarEventModeLabel, getCalendarEventStatusLabel, getContinent, getDisplayLabel, getEmploymentTypeLabel, getFaviconUrl, getFilledDimensionsMap, getHandleStem, getIndustryLabelKey, getInvestmentRoleLabel, getInvestmentStageLabel, getInvestmentStatusLabel, getInvolvementKindHeading, getInvolvementKindLabel, getLexiconEntry, getOpenToLabelKey, getPdsDisplayName, getPlatformLabel, getPresentationLinkTypeLabel, getPresentationRoleLabel, getPublicationTypeLabel, getPublisherByHost, getPublisherById, getPublisherFromSiteUrl, getTierMeta, getVerificationProvider, getVisibleSectionIds, getWorkplaceTypeLabel, groupInvolvementByHeading, groupSkillsByCategory, groupSkillsBySubCategory, groupSkillsForDisplay, hasAdultContent, hasPersonalProfileContent, hoistPrimary, isAppCategory, isCompanyPageIndexable, isCompanyRequired, isKnownAppId, isKnownPlatform, isKnownVerificationProvider, isLinked, isOnBehalfOfApplicable, isPseudoEmployer, isRegistrableDomainHandle, isRoleLineRedundant, isSectionPopulated, isValidRgbColor, isVisibleActivityItem, languageTagSchema, lexiconDateExtractor, limitCombiningMarks, locationSegments, looksLikeDomain, makeGraphFollowRecordSchema, maxGraphemes, meetsContrastAA, normalizeCompanyKey, normalizeDoi, normalizeLegalForm, normalizeOpenTo, normalizePlatformId, normalizePresentationMode, normalizePresentationRole, normalizeSkillCategory, normalizeWorkplaceTypes, openToTokenToValue, openToValueToToken, parseIntendedAudiences, parseLocationString, parsePresentationDuration, parseTalkRkey, partialDateSchema, pdsProviderFromApi, pickPrimaryPosition, presentationCsvRowToRecord, presentationDeliveryCsvRowToRecord, primaryVerification, profileToDimensionInputs, qualifiesAsOrg, relativeLuminance, rendersCompanyProfile, rendersPersonalProfile, repoGroupForCollection, resolveAccountFacetMode, resolveCardHealth, resolveCardUrl, resolveEmbed, resolveVerifierProvider, rgbToString, roadmapIssueUrl, sanitizeDisplayText, sanitizeHandleInput, searchResultDisambiguation, selfLabelsSchema, singleDateExtractor, skillRefSchema, slugifyTitle, sortByActiveDateRange, sortByDateDesc, sortCertifications, sortEducation, sortHonors, sortLanguages, sortLanguagesByProficiency, sortPositions, sortProjects, sortPublications, streamAddressSchema, streamAuthorSchema, streamCardBodySchema, streamCardSubjectSchema, streamCardVMSchema, streamExternalLinkSchema, streamGeoSchema, streamMediaSchema, streamRichSegmentSchema, streamSourceSchema, streamThemeSchema, streamVerbSchema, stripHtmlToText, strongRefSchema, summarizePresentationDeliveries, summarizeProfileView, toStreamCardVM, toStreamCardVMs, truncateGraphemes, uriSchema, verbForCollection, visibleItems, youtubeThumbnailUrl, youtubeVideoId };
6154
6200
  //# sourceMappingURL=index.js.map