@singi-labs/sifa-sdk 0.14.6 → 0.15.0

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.cjs CHANGED
@@ -979,12 +979,14 @@ function groupSkillsForDisplay(skills, options = {}) {
979
979
 
980
980
  // src/taxonomy/app-categories.ts
981
981
  var APP_CATEGORIES = {
982
+ Art: { phosphorIcon: "PaintBrush" },
982
983
  Articles: { phosphorIcon: "Article" },
983
984
  Chat: { phosphorIcon: "ChatsCircle" },
984
985
  Code: { phosphorIcon: "Code" },
985
986
  Domains: { phosphorIcon: "Globe" },
986
987
  Endorsements: { phosphorIcon: "HandHeart" },
987
988
  Events: { phosphorIcon: "CalendarBlank" },
989
+ Impact: { phosphorIcon: "Certificate" },
988
990
  Links: { phosphorIcon: "LinkSimple" },
989
991
  Lists: { phosphorIcon: "ListBullets" },
990
992
  Music: { phosphorIcon: "MusicNote" },
@@ -1127,6 +1129,15 @@ var APP_CATEGORY_MAP = {
1127
1129
  // at.locale.{project,translation} — localization projects and authored translation strings on locale.at
1128
1130
  pckt: "Posts",
1129
1131
  // blog.pckt.mini.post — microblog posts with no site.standard.document twin
1132
+ // Onboard from the holke.xyz profile audit (impact-funding ecosystem).
1133
+ hypercerts: "Impact",
1134
+ // org.hypercerts.{claim.activity,collection} — authored claims of work done, and the project collections that group them
1135
+ certified: "Endorsements",
1136
+ // app.certified.{badge.award,actor.membership} — endorsements issued to another DID, and group memberships
1137
+ impactindexer: "Reviews",
1138
+ // org.impactindexer.review.comment — written reviews of a hypercert claim
1139
+ pinksea: "Art",
1140
+ // com.shinolabs.pinksea.oekaki — hand-drawn artwork posted to the PinkSea oekaki BBS
1130
1141
  // Web-only (rendered in pills/cards via sifa-web atproto-apps.ts;
1131
1142
  // no backend scan collection yet)
1132
1143
  linkat: "Links",
@@ -2789,6 +2800,15 @@ function pickPrimaryPosition(positions) {
2789
2800
  return [...active].sort((a, b) => (b.startedAt ?? "").localeCompare(a.startedAt ?? ""))[0];
2790
2801
  }
2791
2802
 
2803
+ // src/profile/headline-role-dedupe.ts
2804
+ function normalize(value) {
2805
+ return value.trim().replace(/\s+/g, " ").replace(/[.,;:·|]+$/, "").trim().toLowerCase();
2806
+ }
2807
+ function isRoleLineRedundant(headline, roleLine) {
2808
+ if (!headline || !roleLine) return false;
2809
+ return normalize(headline) === normalize(roleLine);
2810
+ }
2811
+
2792
2812
  // src/profile/section-model.ts
2793
2813
  var SECTION_GROUPS = [
2794
2814
  { id: "overview", labelKey: "groupOverview" },
@@ -2915,7 +2935,10 @@ function buildMetaDescription(profile) {
2915
2935
  if (currentPosition.title) positionParts.push(currentPosition.title);
2916
2936
  const company = currentPosition.entityName ?? currentPosition.company;
2917
2937
  if (company) positionParts.push(`at ${company}`);
2918
- if (positionParts.length > 0) parts.push(positionParts.join(" "));
2938
+ if (positionParts.length > 0) {
2939
+ const roleLine = positionParts.join(" ");
2940
+ if (!isRoleLineRedundant(profile.headline, roleLine)) parts.push(roleLine);
2941
+ }
2919
2942
  }
2920
2943
  if (profile.location) {
2921
2944
  parts.push(formatLocation(profile.location));
@@ -3313,6 +3336,29 @@ var APP_URL_PATTERNS = Object.freeze({
3313
3336
  urlPattern: "https://kich.io/recipes/{rkey}",
3314
3337
  profileUrlPattern: "https://kich.io"
3315
3338
  },
3339
+ pinksea: {
3340
+ // PinkSea oekaki viewer. Verified live: GET /{did}/oekaki/{rkey} returns
3341
+ // 200 AND its og:image resolves to harbor.pinksea.art/{did}/{blobCid}
3342
+ // carrying the same CID as the record, so the route really is per-record
3343
+ // and not just an SPA catch-all.
3344
+ urlPattern: "https://pinksea.art/{did}/oekaki/{rkey}",
3345
+ profileUrlPattern: "https://pinksea.art/{did}"
3346
+ },
3347
+ hypercerts: {
3348
+ // No confirmed public per-record viewer. hyperscan.dev is a network-wide
3349
+ // search explorer (its input takes "DID, handle, AT-URI, or PDS host"),
3350
+ // and hypercerts.org 404s on every claim route tried. Recognized so the
3351
+ // pill renders, but cards stay non-clickable.
3352
+ },
3353
+ certified: {
3354
+ // certified.app is fully client-rendered and returns an identical
3355
+ // "Loading" shell for a real DID and a nonsense one, so no per-record
3356
+ // route could be verified. Non-clickable until one is confirmed.
3357
+ },
3358
+ impactindexer: {
3359
+ // Reviews are surfaced through hyperscan.dev/review, which has no
3360
+ // per-record route. Non-clickable.
3361
+ },
3316
3362
  recipe: {
3317
3363
  // recipe.exchange viewer. Verified: GET /recipes/{rkey} returns 200 (rkey
3318
3364
  // alone; no did needed) and /profiles/{handle} returns 200 for the author
@@ -3415,7 +3461,12 @@ var COLLECTION_TO_APP = [
3415
3461
  // Onboard from aaronstevenwhite.io profile audit.
3416
3462
  ["pub.chive.", "chive"],
3417
3463
  // Onboard from helene-cook.eu profile audit. Zeens kept its old NSID.
3418
- ["app.photosky.", "zeens"]
3464
+ ["app.photosky.", "zeens"],
3465
+ // Onboard from the holke.xyz profile audit.
3466
+ ["org.hypercerts.", "hypercerts"],
3467
+ ["app.certified.", "certified"],
3468
+ ["org.impactindexer.", "impactindexer"],
3469
+ ["com.shinolabs.pinksea.", "pinksea"]
3419
3470
  ];
3420
3471
 
3421
3472
  // src/cards/resolve-card-url.ts
@@ -5086,15 +5137,6 @@ var sortCertifications = (items) => sortByDateDesc(items, certDateExtractor);
5086
5137
  var sortHonors = (items) => sortByDateDesc(items, singleDateExtractor);
5087
5138
  var sortLanguages = (items) => sortLanguagesByProficiency(items);
5088
5139
 
5089
- // src/profile/headline-role-dedupe.ts
5090
- function normalize(value) {
5091
- return value.trim().replace(/\s+/g, " ").replace(/[.,;:·|]+$/, "").trim().toLowerCase();
5092
- }
5093
- function isRoleLineRedundant(headline, roleLine) {
5094
- if (!headline || !roleLine) return false;
5095
- return normalize(headline) === normalize(roleLine);
5096
- }
5097
-
5098
5140
  // src/profile/involvement-grouping.ts
5099
5141
  var INVOLVEMENT_HEADING_ORDER = [
5100
5142
  "Open Source",
@@ -5942,7 +5984,7 @@ function describeSifaRecord(collection, value) {
5942
5984
  }
5943
5985
 
5944
5986
  // src/index.ts
5945
- var SIFA_SDK_VERSION = "0.14.6";
5987
+ var SIFA_SDK_VERSION = "0.15.0";
5946
5988
 
5947
5989
  exports.ACTIVITY_TIERS = ACTIVITY_TIERS;
5948
5990
  exports.ACTIVITY_VERBS = ACTIVITY_VERBS;