@singi-labs/sifa-sdk 0.19.81 → 0.19.82
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/cards/app-url-patterns.js +23 -1
- package/dist/cards/app-url-patterns.js.map +1 -1
- package/dist/index.cjs +47 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -1
- package/dist/taxonomy/activity-tiers.js +15 -0
- package/dist/taxonomy/activity-tiers.js.map +1 -1
- package/dist/taxonomy/app-category-map.js +8 -1
- package/dist/taxonomy/app-category-map.js.map +1 -1
- package/package.json +1 -1
|
@@ -282,6 +282,24 @@ var APP_URL_PATTERNS = Object.freeze({
|
|
|
282
282
|
// Verified live: GET /c/{did}/{rkey} server-renders <title>{record title}
|
|
283
283
|
// | Brickster</title>. No per-user profile route found.
|
|
284
284
|
urlPattern: "https://brickster.at/c/{did}/{rkey}"
|
|
285
|
+
},
|
|
286
|
+
skillz: {
|
|
287
|
+
// Verified live: GET /skills/{did}/{rkey} server-renders
|
|
288
|
+
// <title>{slug} — skillz.supply</title>. No per-user profile route found.
|
|
289
|
+
urlPattern: "https://skillz.supply/skills/{did}/{rkey}"
|
|
290
|
+
},
|
|
291
|
+
birdsplace: {
|
|
292
|
+
// Verified live: GET /u/{did}/{rkey} server-renders <title>{count} x
|
|
293
|
+
// {species}</title>; an unknown rkey 404s. /u/{did} is the profile page.
|
|
294
|
+
urlPattern: "https://birds.place/u/{did}/{rkey}",
|
|
295
|
+
profileUrlPattern: "https://birds.place/u/{did}"
|
|
296
|
+
},
|
|
297
|
+
skymap: {
|
|
298
|
+
// Nuxt SPA routes: /users/:username and /users/:username/maps/:mapId.
|
|
299
|
+
// The username segment accepts a DID (verified live against a real map);
|
|
300
|
+
// the shell returns 200 for any path, so the rkey itself is not checkable.
|
|
301
|
+
urlPattern: "https://skymap.blue/users/{did}/maps/{rkey}",
|
|
302
|
+
profileUrlPattern: "https://skymap.blue/users/{did}"
|
|
285
303
|
}
|
|
286
304
|
});
|
|
287
305
|
var COLLECTION_TO_APP = [
|
|
@@ -379,7 +397,11 @@ var COLLECTION_TO_APP = [
|
|
|
379
397
|
["equipment.rpg.", "rpgactor"],
|
|
380
398
|
["app.lexidraw.", "lexidraw"],
|
|
381
399
|
["fm.leadsheet.", "leadsheet"],
|
|
382
|
-
["at.brickster.", "brickster"]
|
|
400
|
+
["at.brickster.", "brickster"],
|
|
401
|
+
// Onboard from the 2026-10-06 profile-of-the-day queue audit.
|
|
402
|
+
["supply.skillz.", "skillz"],
|
|
403
|
+
["place.birds.", "birdsplace"],
|
|
404
|
+
["blue.skymap.", "skymap"]
|
|
383
405
|
];
|
|
384
406
|
export {
|
|
385
407
|
APP_URL_PATTERNS,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cards/app-url-patterns.ts"],"sourcesContent":["/**\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 // Community-calendar events (community.lexicon.calendar.*, incl. records\n // originally authored in the decommissioned Smoke Signal). atmo.rsvp resolves\n // any such event by did+rkey, so links point there. Internal id kept as\n // `smokesignal` for continuity with existing token/color keys.\n smokesignal: {\n urlPattern: 'https://atmo.rsvp/p/{did}/e/{rkey}',\n profileUrlPattern: 'https://atmo.rsvp/p/{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 // atmoBB per-item thread/reply URLs are built bespoke in resolve-card-url.ts\n // (raw-colon /t/{did}/{rkey}); this is only the member-profile fallback.\n atmobb: { profileUrlPattern: 'https://atmobb.app/members/{did}' },\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 guestbook: {\n // Guestbook (dev.baileytownsend.guestbook) is a self-hosted, cross-site\n // widget: each site owner renders their own guestbook wherever they choose,\n // so there is no canonical public per-entry viewer or per-handle profile\n // page. Entries render non-clickable. Same shape as crate `note`.\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 atcommons: {\n // eu.atcommons.member records are self-asserted and live in the member's\n // own repo; the commons sites (atproto.eu, atproto.nl) render a single\n // members directory with no per-member permalink. Profile fallback only.\n profileUrlPattern: 'https://atproto.eu/members',\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 pinksea: {\n // PinkSea oekaki viewer. Verified live: GET /{did}/oekaki/{rkey} returns\n // 200 AND its og:image resolves to harbor.pinksea.art/{did}/{blobCid}\n // carrying the same CID as the record, so the route really is per-record\n // and not just an SPA catch-all.\n urlPattern: 'https://pinksea.art/{did}/oekaki/{rkey}',\n profileUrlPattern: 'https://pinksea.art/{did}',\n },\n hypercerts: {\n // No confirmed public per-record viewer. hyperscan.dev is a network-wide\n // search explorer (its input takes \"DID, handle, AT-URI, or PDS host\"),\n // and hypercerts.org 404s on every claim route tried. Recognized so the\n // pill renders, but cards stay non-clickable.\n },\n certified: {\n // certified.app is fully client-rendered and returns an identical\n // \"Loading\" shell for a real DID and a nonsense one, so no per-record\n // route could be verified. Non-clickable until one is confirmed.\n },\n impactindexer: {\n // Reviews are surfaced through hyperscan.dev/review, which has no\n // per-record route. Non-clickable.\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 zeens: {\n // Zeens (zeens.app) still uses its former app.photosky.* namespace. The\n // app redirects /collection/{handle}/{rkey} to the canonical path below.\n urlPattern: 'https://zeens.app/profile/{handle}/collections/{rkey}',\n profileUrlPattern: 'https://zeens.app/profile/{handle}',\n },\n chive: {\n // Chive's eprint route is a catch-all that decodes a single URI-encoded\n // at-uri segment: /eprints/<encodeURIComponent(at://did/nsid/rkey)>.\n // {did} and {rkey} are URI-encoded on interpolation, so the separators\n // are pre-encoded as literals here rather than resolved bespoke.\n urlPattern: 'https://chive.pub/eprints/at%3A%2F%2F{did}%2Fpub.chive.eprint.submission%2F{rkey}',\n profileUrlPattern: 'https://chive.pub/authors/{did}',\n },\n dropanchor: {\n // Dropanchor (dropanchor.app) renders each check-in at /checkin/{rkey} —\n // the record's own rkey, no did/handle needed. Documented as the OG-tagged\n // share URL in the dropanchorapp repos. A self-permalink for this record.\n urlPattern: 'https://dropanchor.app/checkin/{rkey}',\n },\n askeverything: {\n // Ask Everything (askeverything.app) keys its public answer route\n // (/answer/{id}) on an internal DB id, not the atproto rkey, so there's no\n // per-record permalink we can build from {did, rkey}. Its profile route\n // /profile/{handle} does resolve by atproto handle, so fall back to that.\n profileUrlPattern: 'https://askeverything.app/profile/{handle}',\n },\n greengale: {\n // GreenGale (greengale.app) renders each blog entry at /{handle}/{rkey}.\n // Verified live against a real post. Self-permalink for this record.\n urlPattern: 'https://greengale.app/{handle}/{rkey}',\n profileUrlPattern: 'https://greengale.app/{handle}',\n },\n kut: {\n // Kut (kut.social) is a community app. A membership record has no page of\n // its own; the card links to the community it joined, built from the\n // membership's community.uri in resolve-card-url. Homepage fallback only.\n profileUrlPattern: 'https://kut.social',\n },\n atmob: {\n // atmob (atmob.in) is a paste app. Its SPA viewer renders any paste by its\n // full at-uri via a `?uri=` query param (verified in the app's app.js:\n // `location.search = ?uri=${encodeURIComponent(uri)}`). Both paste.document\n // and paste.bundle share that viewer, so the per-record URL is built\n // bespoke from the item's own uri in resolve-card-url. No pattern here.\n },\n tokono: {\n // tokono (tokono.ma) hosts \"bring your own video\" records, but tokono.ma is\n // the owner's static personal site with no public per-video viewer route.\n // Cards render non-clickable.\n },\n portable: {\n // agency.portable (handle portable.agency) has no resolving website, and a\n // membership record has no page of its own. Cards render non-clickable.\n },\n rpgactor: {\n // rpg.actor renders one character page per player, holding the sprite and\n // every equipped item. Sprites (rkey self) and items (rkey = item id) have\n // no page of their own, so both link to the player. Verified live:\n // GET /{handle} returns 200 with og:url https://rpg.actor/{handle}.\n profileUrlPattern: 'https://rpg.actor/{handle}',\n },\n lexidraw: {\n // Verified live: GET /s/{did}/{rkey} returns 200 with <title> set to the\n // scene name and an og:image built from the record's thumb blob CID. Other\n // paths return the generic editor shell, so no profile page is assumed.\n urlPattern: 'https://lexidraw.app/s/{did}/{rkey}',\n },\n leadsheet: {\n // Routes from the SPA router: /sheet/:actor/:rkey and /u/:actor.\n urlPattern: 'https://leadsheet.fm/sheet/{did}/{rkey}',\n profileUrlPattern: 'https://leadsheet.fm/u/{handle}',\n },\n brickster: {\n // Verified live: GET /c/{did}/{rkey} server-renders <title>{record title}\n // | Brickster</title>. No per-user profile route found.\n urlPattern: 'https://brickster.at/c/{did}/{rkey}',\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 ['pics.pixl.', 'pixl'],\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 ['eu.atcommons.', 'atcommons'],\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 // Onboard from willow.sh profile audit.\n ['dev.baileytownsend.guestbook.', 'guestbook'],\n // Onboard from trezy.codes profile audit.\n ['app.atmobb.', 'atmobb'],\n // Onboard from aaronstevenwhite.io profile audit.\n ['pub.chive.', 'chive'],\n // Onboard from helene-cook.eu profile audit. Zeens kept its old NSID.\n ['app.photosky.', 'zeens'],\n // Onboard from the holke.xyz profile audit.\n ['org.hypercerts.', 'hypercerts'],\n ['app.certified.', 'certified'],\n ['org.impactindexer.', 'impactindexer'],\n ['com.shinolabs.pinksea.', 'pinksea'],\n // Onboard from tijs.org profile audit.\n ['app.dropanchor.', 'dropanchor'],\n // Onboard from angrydutchman.houseofmadness.org profile audit.\n ['app.askeverything.', 'askeverything'],\n ['app.greengale.', 'greengale'],\n ['social.kut.', 'kut'],\n // Onboard from the upcoming profile-of-the-day audit.\n ['in.atmob.paste.', 'atmob'],\n ['ma.tokono.byov.', 'tokono'],\n ['agency.portable.', 'portable'],\n ['actor.rpg.', 'rpgactor'],\n ['equipment.rpg.', 'rpgactor'],\n ['app.lexidraw.', 'lexidraw'],\n ['fm.leadsheet.', 'leadsheet'],\n ['at.brickster.', 'brickster'],\n];\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/cards/app-url-patterns.ts"],"sourcesContent":["/**\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 // Community-calendar events (community.lexicon.calendar.*, incl. records\n // originally authored in the decommissioned Smoke Signal). atmo.rsvp resolves\n // any such event by did+rkey, so links point there. Internal id kept as\n // `smokesignal` for continuity with existing token/color keys.\n smokesignal: {\n urlPattern: 'https://atmo.rsvp/p/{did}/e/{rkey}',\n profileUrlPattern: 'https://atmo.rsvp/p/{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 // atmoBB per-item thread/reply URLs are built bespoke in resolve-card-url.ts\n // (raw-colon /t/{did}/{rkey}); this is only the member-profile fallback.\n atmobb: { profileUrlPattern: 'https://atmobb.app/members/{did}' },\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 guestbook: {\n // Guestbook (dev.baileytownsend.guestbook) is a self-hosted, cross-site\n // widget: each site owner renders their own guestbook wherever they choose,\n // so there is no canonical public per-entry viewer or per-handle profile\n // page. Entries render non-clickable. Same shape as crate `note`.\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 atcommons: {\n // eu.atcommons.member records are self-asserted and live in the member's\n // own repo; the commons sites (atproto.eu, atproto.nl) render a single\n // members directory with no per-member permalink. Profile fallback only.\n profileUrlPattern: 'https://atproto.eu/members',\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 pinksea: {\n // PinkSea oekaki viewer. Verified live: GET /{did}/oekaki/{rkey} returns\n // 200 AND its og:image resolves to harbor.pinksea.art/{did}/{blobCid}\n // carrying the same CID as the record, so the route really is per-record\n // and not just an SPA catch-all.\n urlPattern: 'https://pinksea.art/{did}/oekaki/{rkey}',\n profileUrlPattern: 'https://pinksea.art/{did}',\n },\n hypercerts: {\n // No confirmed public per-record viewer. hyperscan.dev is a network-wide\n // search explorer (its input takes \"DID, handle, AT-URI, or PDS host\"),\n // and hypercerts.org 404s on every claim route tried. Recognized so the\n // pill renders, but cards stay non-clickable.\n },\n certified: {\n // certified.app is fully client-rendered and returns an identical\n // \"Loading\" shell for a real DID and a nonsense one, so no per-record\n // route could be verified. Non-clickable until one is confirmed.\n },\n impactindexer: {\n // Reviews are surfaced through hyperscan.dev/review, which has no\n // per-record route. Non-clickable.\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 zeens: {\n // Zeens (zeens.app) still uses its former app.photosky.* namespace. The\n // app redirects /collection/{handle}/{rkey} to the canonical path below.\n urlPattern: 'https://zeens.app/profile/{handle}/collections/{rkey}',\n profileUrlPattern: 'https://zeens.app/profile/{handle}',\n },\n chive: {\n // Chive's eprint route is a catch-all that decodes a single URI-encoded\n // at-uri segment: /eprints/<encodeURIComponent(at://did/nsid/rkey)>.\n // {did} and {rkey} are URI-encoded on interpolation, so the separators\n // are pre-encoded as literals here rather than resolved bespoke.\n urlPattern: 'https://chive.pub/eprints/at%3A%2F%2F{did}%2Fpub.chive.eprint.submission%2F{rkey}',\n profileUrlPattern: 'https://chive.pub/authors/{did}',\n },\n dropanchor: {\n // Dropanchor (dropanchor.app) renders each check-in at /checkin/{rkey} —\n // the record's own rkey, no did/handle needed. Documented as the OG-tagged\n // share URL in the dropanchorapp repos. A self-permalink for this record.\n urlPattern: 'https://dropanchor.app/checkin/{rkey}',\n },\n askeverything: {\n // Ask Everything (askeverything.app) keys its public answer route\n // (/answer/{id}) on an internal DB id, not the atproto rkey, so there's no\n // per-record permalink we can build from {did, rkey}. Its profile route\n // /profile/{handle} does resolve by atproto handle, so fall back to that.\n profileUrlPattern: 'https://askeverything.app/profile/{handle}',\n },\n greengale: {\n // GreenGale (greengale.app) renders each blog entry at /{handle}/{rkey}.\n // Verified live against a real post. Self-permalink for this record.\n urlPattern: 'https://greengale.app/{handle}/{rkey}',\n profileUrlPattern: 'https://greengale.app/{handle}',\n },\n kut: {\n // Kut (kut.social) is a community app. A membership record has no page of\n // its own; the card links to the community it joined, built from the\n // membership's community.uri in resolve-card-url. Homepage fallback only.\n profileUrlPattern: 'https://kut.social',\n },\n atmob: {\n // atmob (atmob.in) is a paste app. Its SPA viewer renders any paste by its\n // full at-uri via a `?uri=` query param (verified in the app's app.js:\n // `location.search = ?uri=${encodeURIComponent(uri)}`). Both paste.document\n // and paste.bundle share that viewer, so the per-record URL is built\n // bespoke from the item's own uri in resolve-card-url. No pattern here.\n },\n tokono: {\n // tokono (tokono.ma) hosts \"bring your own video\" records, but tokono.ma is\n // the owner's static personal site with no public per-video viewer route.\n // Cards render non-clickable.\n },\n portable: {\n // agency.portable (handle portable.agency) has no resolving website, and a\n // membership record has no page of its own. Cards render non-clickable.\n },\n rpgactor: {\n // rpg.actor renders one character page per player, holding the sprite and\n // every equipped item. Sprites (rkey self) and items (rkey = item id) have\n // no page of their own, so both link to the player. Verified live:\n // GET /{handle} returns 200 with og:url https://rpg.actor/{handle}.\n profileUrlPattern: 'https://rpg.actor/{handle}',\n },\n lexidraw: {\n // Verified live: GET /s/{did}/{rkey} returns 200 with <title> set to the\n // scene name and an og:image built from the record's thumb blob CID. Other\n // paths return the generic editor shell, so no profile page is assumed.\n urlPattern: 'https://lexidraw.app/s/{did}/{rkey}',\n },\n leadsheet: {\n // Routes from the SPA router: /sheet/:actor/:rkey and /u/:actor.\n urlPattern: 'https://leadsheet.fm/sheet/{did}/{rkey}',\n profileUrlPattern: 'https://leadsheet.fm/u/{handle}',\n },\n brickster: {\n // Verified live: GET /c/{did}/{rkey} server-renders <title>{record title}\n // | Brickster</title>. No per-user profile route found.\n urlPattern: 'https://brickster.at/c/{did}/{rkey}',\n },\n skillz: {\n // Verified live: GET /skills/{did}/{rkey} server-renders\n // <title>{slug} — skillz.supply</title>. No per-user profile route found.\n urlPattern: 'https://skillz.supply/skills/{did}/{rkey}',\n },\n birdsplace: {\n // Verified live: GET /u/{did}/{rkey} server-renders <title>{count} x\n // {species}</title>; an unknown rkey 404s. /u/{did} is the profile page.\n urlPattern: 'https://birds.place/u/{did}/{rkey}',\n profileUrlPattern: 'https://birds.place/u/{did}',\n },\n skymap: {\n // Nuxt SPA routes: /users/:username and /users/:username/maps/:mapId.\n // The username segment accepts a DID (verified live against a real map);\n // the shell returns 200 for any path, so the rkey itself is not checkable.\n urlPattern: 'https://skymap.blue/users/{did}/maps/{rkey}',\n profileUrlPattern: 'https://skymap.blue/users/{did}',\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 ['pics.pixl.', 'pixl'],\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 ['eu.atcommons.', 'atcommons'],\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 // Onboard from willow.sh profile audit.\n ['dev.baileytownsend.guestbook.', 'guestbook'],\n // Onboard from trezy.codes profile audit.\n ['app.atmobb.', 'atmobb'],\n // Onboard from aaronstevenwhite.io profile audit.\n ['pub.chive.', 'chive'],\n // Onboard from helene-cook.eu profile audit. Zeens kept its old NSID.\n ['app.photosky.', 'zeens'],\n // Onboard from the holke.xyz profile audit.\n ['org.hypercerts.', 'hypercerts'],\n ['app.certified.', 'certified'],\n ['org.impactindexer.', 'impactindexer'],\n ['com.shinolabs.pinksea.', 'pinksea'],\n // Onboard from tijs.org profile audit.\n ['app.dropanchor.', 'dropanchor'],\n // Onboard from angrydutchman.houseofmadness.org profile audit.\n ['app.askeverything.', 'askeverything'],\n ['app.greengale.', 'greengale'],\n ['social.kut.', 'kut'],\n // Onboard from the upcoming profile-of-the-day audit.\n ['in.atmob.paste.', 'atmob'],\n ['ma.tokono.byov.', 'tokono'],\n ['agency.portable.', 'portable'],\n ['actor.rpg.', 'rpgactor'],\n ['equipment.rpg.', 'rpgactor'],\n ['app.lexidraw.', 'lexidraw'],\n ['fm.leadsheet.', 'leadsheet'],\n ['at.brickster.', 'brickster'],\n // Onboard from the 2026-10-06 profile-of-the-day queue audit.\n ['supply.skillz.', 'skillz'],\n ['place.birds.', 'birdsplace'],\n ['blue.skymap.', 'skymap'],\n];\n"],"mappings":"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","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -1388,8 +1388,15 @@ var APP_CATEGORY_MAP = {
|
|
|
1388
1388
|
// app.lexidraw.scene — named whiteboard drawings
|
|
1389
1389
|
leadsheet: "Music",
|
|
1390
1390
|
// fm.leadsheet.sheet — authored chord sheets and tabs
|
|
1391
|
-
brickster: "Art"
|
|
1391
|
+
brickster: "Art",
|
|
1392
1392
|
// at.brickster.creation — 3D brick builds
|
|
1393
|
+
// 2026-10-06 profile-of-the-day queue onboards.
|
|
1394
|
+
skillz: "Code",
|
|
1395
|
+
// supply.skillz.skill — authored agent skills (SKILL.md) on skillz.supply
|
|
1396
|
+
birdsplace: "Places",
|
|
1397
|
+
// place.birds.sighting — logged bird sightings with photo, notes, and location
|
|
1398
|
+
skymap: "Places"
|
|
1399
|
+
// blue.skymap.geo.map — authored maps of places (features inline)
|
|
1393
1400
|
};
|
|
1394
1401
|
function isKnownAppId(appId) {
|
|
1395
1402
|
return Object.prototype.hasOwnProperty.call(APP_CATEGORY_MAP, appId);
|
|
@@ -2314,6 +2321,21 @@ var activity_tiers_default = {
|
|
|
2314
2321
|
tier: "creation",
|
|
2315
2322
|
app: "brickster",
|
|
2316
2323
|
notes: "A 3D brick build saved from the Brickster editor."
|
|
2324
|
+
},
|
|
2325
|
+
"supply.skillz.skill": {
|
|
2326
|
+
tier: "creation",
|
|
2327
|
+
app: "skillz",
|
|
2328
|
+
notes: "An authored agent skill (SKILL.md body) published on skillz.supply."
|
|
2329
|
+
},
|
|
2330
|
+
"place.birds.sighting": {
|
|
2331
|
+
tier: "creation",
|
|
2332
|
+
app: "birdsplace",
|
|
2333
|
+
notes: "A logged bird sighting with species, count, photo, notes, and location."
|
|
2334
|
+
},
|
|
2335
|
+
"blue.skymap.geo.map": {
|
|
2336
|
+
tier: "creation",
|
|
2337
|
+
app: "skymap",
|
|
2338
|
+
notes: "An authored map with inline point features (title, description, tags)."
|
|
2317
2339
|
}
|
|
2318
2340
|
}
|
|
2319
2341
|
};
|
|
@@ -3957,6 +3979,24 @@ var APP_URL_PATTERNS = Object.freeze({
|
|
|
3957
3979
|
// Verified live: GET /c/{did}/{rkey} server-renders <title>{record title}
|
|
3958
3980
|
// | Brickster</title>. No per-user profile route found.
|
|
3959
3981
|
urlPattern: "https://brickster.at/c/{did}/{rkey}"
|
|
3982
|
+
},
|
|
3983
|
+
skillz: {
|
|
3984
|
+
// Verified live: GET /skills/{did}/{rkey} server-renders
|
|
3985
|
+
// <title>{slug} — skillz.supply</title>. No per-user profile route found.
|
|
3986
|
+
urlPattern: "https://skillz.supply/skills/{did}/{rkey}"
|
|
3987
|
+
},
|
|
3988
|
+
birdsplace: {
|
|
3989
|
+
// Verified live: GET /u/{did}/{rkey} server-renders <title>{count} x
|
|
3990
|
+
// {species}</title>; an unknown rkey 404s. /u/{did} is the profile page.
|
|
3991
|
+
urlPattern: "https://birds.place/u/{did}/{rkey}",
|
|
3992
|
+
profileUrlPattern: "https://birds.place/u/{did}"
|
|
3993
|
+
},
|
|
3994
|
+
skymap: {
|
|
3995
|
+
// Nuxt SPA routes: /users/:username and /users/:username/maps/:mapId.
|
|
3996
|
+
// The username segment accepts a DID (verified live against a real map);
|
|
3997
|
+
// the shell returns 200 for any path, so the rkey itself is not checkable.
|
|
3998
|
+
urlPattern: "https://skymap.blue/users/{did}/maps/{rkey}",
|
|
3999
|
+
profileUrlPattern: "https://skymap.blue/users/{did}"
|
|
3960
4000
|
}
|
|
3961
4001
|
});
|
|
3962
4002
|
var COLLECTION_TO_APP = [
|
|
@@ -4054,7 +4094,11 @@ var COLLECTION_TO_APP = [
|
|
|
4054
4094
|
["equipment.rpg.", "rpgactor"],
|
|
4055
4095
|
["app.lexidraw.", "lexidraw"],
|
|
4056
4096
|
["fm.leadsheet.", "leadsheet"],
|
|
4057
|
-
["at.brickster.", "brickster"]
|
|
4097
|
+
["at.brickster.", "brickster"],
|
|
4098
|
+
// Onboard from the 2026-10-06 profile-of-the-day queue audit.
|
|
4099
|
+
["supply.skillz.", "skillz"],
|
|
4100
|
+
["place.birds.", "birdsplace"],
|
|
4101
|
+
["blue.skymap.", "skymap"]
|
|
4058
4102
|
];
|
|
4059
4103
|
|
|
4060
4104
|
// src/cards/resolve-card-url.ts
|
|
@@ -7313,7 +7357,7 @@ function describeSifaRecord(collection, value) {
|
|
|
7313
7357
|
}
|
|
7314
7358
|
|
|
7315
7359
|
// src/index.ts
|
|
7316
|
-
var SIFA_SDK_VERSION = "0.19.
|
|
7360
|
+
var SIFA_SDK_VERSION = "0.19.82";
|
|
7317
7361
|
|
|
7318
7362
|
exports.ACTIVITY_TIERS = ACTIVITY_TIERS;
|
|
7319
7363
|
exports.ACTIVITY_VERBS = ACTIVITY_VERBS;
|