@singi-labs/sifa-sdk 0.19.72 → 0.19.74

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
@@ -2541,7 +2541,10 @@ interface PersonalFacetContent {
2541
2541
  * claiming.
2542
2542
  *
2543
2543
  * True when any profile section holds at least one record, or when the headline
2544
- * or about text is non-blank. Whitespace-only text does not count.
2544
+ * is non-blank. Whitespace-only text does not count. The about text is ignored:
2545
+ * it is seeded from the Bluesky bio at sign-in, so a plain organization account
2546
+ * carries one too, and counting it would make every such claim keep a personal
2547
+ * profile the account never had.
2545
2548
  *
2546
2549
  * Pure: no network, no I/O.
2547
2550
  */
package/dist/index.d.ts CHANGED
@@ -2541,7 +2541,10 @@ interface PersonalFacetContent {
2541
2541
  * claiming.
2542
2542
  *
2543
2543
  * True when any profile section holds at least one record, or when the headline
2544
- * or about text is non-blank. Whitespace-only text does not count.
2544
+ * is non-blank. Whitespace-only text does not count. The about text is ignored:
2545
+ * it is seeded from the Bluesky bio at sign-in, so a plain organization account
2546
+ * carries one too, and counting it would make every such claim keep a personal
2547
+ * profile the account never had.
2545
2548
  *
2546
2549
  * Pure: no network, no I/O.
2547
2550
  */
package/dist/index.js CHANGED
@@ -357,7 +357,7 @@ import {
357
357
  roadmapIssueUrl
358
358
  } from "./roadmap/index.js";
359
359
  import { SIFA_REPO_GROUPS, describeSifaRecord, repoGroupForCollection } from "./repo/index.js";
360
- var SIFA_SDK_VERSION = "0.19.72";
360
+ var SIFA_SDK_VERSION = "0.19.74";
361
361
  export {
362
362
  ACTIVITY_TIERS,
363
363
  ACTIVITY_VERBS,
@@ -22,7 +22,7 @@ function qualifiesAsOrg(record, handle) {
22
22
  }
23
23
  function hasPersonalProfileContent(profile) {
24
24
  const filled = (text) => typeof text === "string" && text.trim() !== "";
25
- if (filled(profile.headline) || filled(profile.about)) return true;
25
+ if (filled(profile.headline)) return true;
26
26
  const sections = [
27
27
  profile.positions,
28
28
  profile.education,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/logic/org-floor.ts"],"sourcesContent":["import type { OrgProfileRecord } from '../schemas/org-profile.js';\nimport { looksLikeDomain } from './domain-detect.js';\nimport type { AccountFacetMode } from '../types/index.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/**\n * The person-facet fields that decide whether an account has a CV worth\n * keeping. A structural subset of `Profile`, so callers can pass a profile\n * straight in. Every list is optional; `positions`, `education`, and `skills`\n * are always present on a real profile but typed optional here so partial\n * fixtures and trimmed payloads work.\n */\nexport interface PersonalFacetContent {\n headline?: string | null;\n about?: string | null;\n positions?: unknown[];\n education?: unknown[];\n skills?: unknown[];\n certifications?: unknown[];\n projects?: unknown[];\n publications?: unknown[];\n volunteering?: unknown[];\n involvement?: unknown[];\n honors?: unknown[];\n courses?: unknown[];\n}\n\n/**\n * Does this account have a personal profile worth keeping visible?\n *\n * Decides the claim-flow default when an account claims its domain as an\n * organization. An empty account claiming a domain is a plain company signup:\n * present solely as an org, ask nothing. An account that already carries a CV\n * is the sole-trader case: keeping both facets is the default, and hiding the\n * person facet must be a deliberate choice rather than a silent side effect of\n * claiming.\n *\n * True when any profile section holds at least one record, or when the headline\n * or about text is non-blank. Whitespace-only text does not count.\n *\n * Pure: no network, no I/O.\n */\nexport function hasPersonalProfileContent(profile: PersonalFacetContent): boolean {\n const filled = (text: string | null | undefined): boolean =>\n typeof text === 'string' && text.trim() !== '';\n if (filled(profile.headline) || filled(profile.about)) return true;\n const sections = [\n profile.positions,\n profile.education,\n profile.skills,\n profile.certifications,\n profile.projects,\n profile.publications,\n profile.volunteering,\n profile.involvement,\n profile.honors,\n profile.courses,\n ];\n return sections.some((section) => Array.isArray(section) && section.length > 0);\n}\n\n/**\n * Should this account's personal profile render at `/p/`, given the org verdict?\n *\n * The single routing predicate behind the freelancer dual-identity case: a\n * claimed org that set `personalProfileVisible` renders both facets, so `/p/`\n * serves the person instead of redirecting to `/c/`. Every other account keeps\n * the exclusive behaviour -- an org (claimed or merely recognized) redirects\n * `/p/` to `/c/`, and a plain person renders at `/p/` as always.\n *\n * Pure: no network, no I/O.\n */\nexport function rendersPersonalProfile(\n org: { isOrg: boolean; recognized: boolean; personalProfileVisible?: boolean } | null | undefined,\n renderPreference?: 'person' | 'company' | null,\n): boolean {\n // An explicit 'person' choice is the owner's own override and wins outright:\n // it is what makes \"Person\" mean person, even for an account holding an org\n // record (which stays in the PDS, inert).\n if (renderPreference === 'person') return true;\n if (org === null || org === undefined) return true;\n if (!org.isOrg && !org.recognized) return true;\n // Gated on isOrg, not merely on the flag: `personalProfileVisible` lives in\n // the `id.sifa.org.profile` record, so an account that is only RECOGNIZED\n // (known company domain, never claimed) has no record to carry it and keeps\n // the redirect. Claiming is the way in.\n return org.isOrg && org.personalProfileVisible === true;\n}\n\n/**\n * Should this account's company page render at `/c/`?\n *\n * The mirror of {@link rendersPersonalProfile}. True for any company account --\n * claimed or merely recognized -- EXCEPT when the owner explicitly chose to\n * present as a person, which suppresses the company page rather than deleting\n * anything. The org record stays in the PDS and the choice is reversible.\n *\n * Pure: no network, no I/O.\n */\nexport function rendersCompanyProfile(\n org: { isOrg: boolean; recognized: boolean } | null | undefined,\n renderPreference?: 'person' | 'company' | null,\n): boolean {\n if (renderPreference === 'person') return false;\n if (org === null || org === undefined) return false;\n return org.isOrg || org.recognized;\n}\n\n/**\n * Resolve the three-way \"are you a person, a company, or both?\" answer that the\n * account settings switch presents, from the two places the answer is stored.\n *\n * Precedence, highest first:\n * 1. `renderPreference === 'person'` -- the owner's explicit local override.\n * Wins even over a claimed org record, which stays inert in the PDS.\n * 2. A claimed org that declared `personalProfileVisible` -- `'both'`, the\n * sole trader. Read from the PDS record, so it is portable.\n * 3. Any other company account (claimed, recognized, or `renderPreference`\n * `'company'`) -- `'company'`.\n * 4. Everything else -- `'person'`.\n *\n * Pure: no network, no I/O.\n */\nexport function resolveAccountFacetMode(profile: {\n org?: { isOrg: boolean; recognized: boolean; personalProfileVisible?: boolean } | null;\n renderPreference?: 'person' | 'company' | null;\n}): AccountFacetMode {\n if (profile.renderPreference === 'person') return 'person';\n const org = profile.org;\n if (org?.isOrg && org.personalProfileVisible === true) return 'both';\n if (org?.isOrg || org?.recognized || profile.renderPreference === 'company') return 'company';\n return 'person';\n}\n"],"mappings":";AACA,SAAS,uBAAuB;AAUhC,IAAM,6BAA6B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA0BO,SAAS,0BAA0B,QAAyB;AACjE,QAAM,IAAI,OAAO,KAAK,EAAE,YAAY;AACpC,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,EAAE,WAAW,MAAM,EAAG,QAAO;AAEjC,MAAI,CAAC,gBAAgB,CAAC,EAAG,QAAO;AAChC,aAAW,UAAU,4BAA4B;AAC/C,QAAI,EAAE,SAAS,MAAM,EAAG,QAAO;AAAA,EACjC;AACA,SAAO;AACT;AAiBO,SAAS,eACd,QACA,QACS;AACT,MAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AACpD,SAAO,0BAA0B,MAAM;AACzC;AAuCO,SAAS,0BAA0B,SAAwC;AAChF,QAAM,SAAS,CAAC,SACd,OAAO,SAAS,YAAY,KAAK,KAAK,MAAM;AAC9C,MAAI,OAAO,QAAQ,QAAQ,KAAK,OAAO,QAAQ,KAAK,EAAG,QAAO;AAC9D,QAAM,WAAW;AAAA,IACf,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,SAAO,SAAS,KAAK,CAAC,YAAY,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,CAAC;AAChF;AAaO,SAAS,uBACd,KACA,kBACS;AAIT,MAAI,qBAAqB,SAAU,QAAO;AAC1C,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,MAAI,CAAC,IAAI,SAAS,CAAC,IAAI,WAAY,QAAO;AAK1C,SAAO,IAAI,SAAS,IAAI,2BAA2B;AACrD;AAYO,SAAS,sBACd,KACA,kBACS;AACT,MAAI,qBAAqB,SAAU,QAAO;AAC1C,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,SAAO,IAAI,SAAS,IAAI;AAC1B;AAiBO,SAAS,wBAAwB,SAGnB;AACnB,MAAI,QAAQ,qBAAqB,SAAU,QAAO;AAClD,QAAM,MAAM,QAAQ;AACpB,MAAI,KAAK,SAAS,IAAI,2BAA2B,KAAM,QAAO;AAC9D,MAAI,KAAK,SAAS,KAAK,cAAc,QAAQ,qBAAqB,UAAW,QAAO;AACpF,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/logic/org-floor.ts"],"sourcesContent":["import type { OrgProfileRecord } from '../schemas/org-profile.js';\nimport { looksLikeDomain } from './domain-detect.js';\nimport type { AccountFacetMode } from '../types/index.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/**\n * The person-facet fields that decide whether an account has a CV worth\n * keeping. A structural subset of `Profile`, so callers can pass a profile\n * straight in. Every list is optional; `positions`, `education`, and `skills`\n * are always present on a real profile but typed optional here so partial\n * fixtures and trimmed payloads work.\n */\nexport interface PersonalFacetContent {\n headline?: string | null;\n about?: string | null;\n positions?: unknown[];\n education?: unknown[];\n skills?: unknown[];\n certifications?: unknown[];\n projects?: unknown[];\n publications?: unknown[];\n volunteering?: unknown[];\n involvement?: unknown[];\n honors?: unknown[];\n courses?: unknown[];\n}\n\n/**\n * Does this account have a personal profile worth keeping visible?\n *\n * Decides the claim-flow default when an account claims its domain as an\n * organization. An empty account claiming a domain is a plain company signup:\n * present solely as an org, ask nothing. An account that already carries a CV\n * is the sole-trader case: keeping both facets is the default, and hiding the\n * person facet must be a deliberate choice rather than a silent side effect of\n * claiming.\n *\n * True when any profile section holds at least one record, or when the headline\n * is non-blank. Whitespace-only text does not count. The about text is ignored:\n * it is seeded from the Bluesky bio at sign-in, so a plain organization account\n * carries one too, and counting it would make every such claim keep a personal\n * profile the account never had.\n *\n * Pure: no network, no I/O.\n */\nexport function hasPersonalProfileContent(profile: PersonalFacetContent): boolean {\n const filled = (text: string | null | undefined): boolean =>\n typeof text === 'string' && text.trim() !== '';\n if (filled(profile.headline)) return true;\n const sections = [\n profile.positions,\n profile.education,\n profile.skills,\n profile.certifications,\n profile.projects,\n profile.publications,\n profile.volunteering,\n profile.involvement,\n profile.honors,\n profile.courses,\n ];\n return sections.some((section) => Array.isArray(section) && section.length > 0);\n}\n\n/**\n * Should this account's personal profile render at `/p/`, given the org verdict?\n *\n * The single routing predicate behind the freelancer dual-identity case: a\n * claimed org that set `personalProfileVisible` renders both facets, so `/p/`\n * serves the person instead of redirecting to `/c/`. Every other account keeps\n * the exclusive behaviour -- an org (claimed or merely recognized) redirects\n * `/p/` to `/c/`, and a plain person renders at `/p/` as always.\n *\n * Pure: no network, no I/O.\n */\nexport function rendersPersonalProfile(\n org: { isOrg: boolean; recognized: boolean; personalProfileVisible?: boolean } | null | undefined,\n renderPreference?: 'person' | 'company' | null,\n): boolean {\n // An explicit 'person' choice is the owner's own override and wins outright:\n // it is what makes \"Person\" mean person, even for an account holding an org\n // record (which stays in the PDS, inert).\n if (renderPreference === 'person') return true;\n if (org === null || org === undefined) return true;\n if (!org.isOrg && !org.recognized) return true;\n // Gated on isOrg, not merely on the flag: `personalProfileVisible` lives in\n // the `id.sifa.org.profile` record, so an account that is only RECOGNIZED\n // (known company domain, never claimed) has no record to carry it and keeps\n // the redirect. Claiming is the way in.\n return org.isOrg && org.personalProfileVisible === true;\n}\n\n/**\n * Should this account's company page render at `/c/`?\n *\n * The mirror of {@link rendersPersonalProfile}. True for any company account --\n * claimed or merely recognized -- EXCEPT when the owner explicitly chose to\n * present as a person, which suppresses the company page rather than deleting\n * anything. The org record stays in the PDS and the choice is reversible.\n *\n * Pure: no network, no I/O.\n */\nexport function rendersCompanyProfile(\n org: { isOrg: boolean; recognized: boolean } | null | undefined,\n renderPreference?: 'person' | 'company' | null,\n): boolean {\n if (renderPreference === 'person') return false;\n if (org === null || org === undefined) return false;\n return org.isOrg || org.recognized;\n}\n\n/**\n * Resolve the three-way \"are you a person, a company, or both?\" answer that the\n * account settings switch presents, from the two places the answer is stored.\n *\n * Precedence, highest first:\n * 1. `renderPreference === 'person'` -- the owner's explicit local override.\n * Wins even over a claimed org record, which stays inert in the PDS.\n * 2. A claimed org that declared `personalProfileVisible` -- `'both'`, the\n * sole trader. Read from the PDS record, so it is portable.\n * 3. Any other company account (claimed, recognized, or `renderPreference`\n * `'company'`) -- `'company'`.\n * 4. Everything else -- `'person'`.\n *\n * Pure: no network, no I/O.\n */\nexport function resolveAccountFacetMode(profile: {\n org?: { isOrg: boolean; recognized: boolean; personalProfileVisible?: boolean } | null;\n renderPreference?: 'person' | 'company' | null;\n}): AccountFacetMode {\n if (profile.renderPreference === 'person') return 'person';\n const org = profile.org;\n if (org?.isOrg && org.personalProfileVisible === true) return 'both';\n if (org?.isOrg || org?.recognized || profile.renderPreference === 'company') return 'company';\n return 'person';\n}\n"],"mappings":";AACA,SAAS,uBAAuB;AAUhC,IAAM,6BAA6B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA0BO,SAAS,0BAA0B,QAAyB;AACjE,QAAM,IAAI,OAAO,KAAK,EAAE,YAAY;AACpC,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,EAAE,WAAW,MAAM,EAAG,QAAO;AAEjC,MAAI,CAAC,gBAAgB,CAAC,EAAG,QAAO;AAChC,aAAW,UAAU,4BAA4B;AAC/C,QAAI,EAAE,SAAS,MAAM,EAAG,QAAO;AAAA,EACjC;AACA,SAAO;AACT;AAiBO,SAAS,eACd,QACA,QACS;AACT,MAAI,WAAW,QAAQ,WAAW,OAAW,QAAO;AACpD,SAAO,0BAA0B,MAAM;AACzC;AA0CO,SAAS,0BAA0B,SAAwC;AAChF,QAAM,SAAS,CAAC,SACd,OAAO,SAAS,YAAY,KAAK,KAAK,MAAM;AAC9C,MAAI,OAAO,QAAQ,QAAQ,EAAG,QAAO;AACrC,QAAM,WAAW;AAAA,IACf,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,SAAO,SAAS,KAAK,CAAC,YAAY,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,CAAC;AAChF;AAaO,SAAS,uBACd,KACA,kBACS;AAIT,MAAI,qBAAqB,SAAU,QAAO;AAC1C,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,MAAI,CAAC,IAAI,SAAS,CAAC,IAAI,WAAY,QAAO;AAK1C,SAAO,IAAI,SAAS,IAAI,2BAA2B;AACrD;AAYO,SAAS,sBACd,KACA,kBACS;AACT,MAAI,qBAAqB,SAAU,QAAO;AAC1C,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,SAAO,IAAI,SAAS,IAAI;AAC1B;AAiBO,SAAS,wBAAwB,SAGnB;AACnB,MAAI,QAAQ,qBAAqB,SAAU,QAAO;AAClD,QAAM,MAAM,QAAQ;AACpB,MAAI,KAAK,SAAS,IAAI,2BAA2B,KAAM,QAAO;AAC9D,MAAI,KAAK,SAAS,KAAK,cAAc,QAAQ,qBAAqB,UAAW,QAAO;AACpF,SAAO;AACT;","names":[]}
@@ -402,6 +402,7 @@ declare const RpgItemStatusSchema: z.ZodObject<{
402
402
  locked: "locked";
403
403
  given: "given";
404
404
  }>;
405
+ worn: z.ZodDefault<z.ZodBoolean>;
405
406
  iconUrl: z.ZodNullable<z.ZodString>;
406
407
  }, z.core.$strip>;
407
408
  type RpgItemStatus = z.infer<typeof RpgItemStatusSchema>;
@@ -421,6 +422,7 @@ declare const RpgStatusResponseSchema: z.ZodObject<{
421
422
  locked: "locked";
422
423
  given: "given";
423
424
  }>;
425
+ worn: z.ZodDefault<z.ZodBoolean>;
424
426
  iconUrl: z.ZodNullable<z.ZodString>;
425
427
  }, z.core.$strip>>;
426
428
  }, z.core.$strip>;
@@ -402,6 +402,7 @@ declare const RpgItemStatusSchema: z.ZodObject<{
402
402
  locked: "locked";
403
403
  given: "given";
404
404
  }>;
405
+ worn: z.ZodDefault<z.ZodBoolean>;
405
406
  iconUrl: z.ZodNullable<z.ZodString>;
406
407
  }, z.core.$strip>;
407
408
  type RpgItemStatus = z.infer<typeof RpgItemStatusSchema>;
@@ -421,6 +422,7 @@ declare const RpgStatusResponseSchema: z.ZodObject<{
421
422
  locked: "locked";
422
423
  given: "given";
423
424
  }>;
425
+ worn: z.ZodDefault<z.ZodBoolean>;
424
426
  iconUrl: z.ZodNullable<z.ZodString>;
425
427
  }, z.core.$strip>>;
426
428
  }, z.core.$strip>;
@@ -1345,6 +1345,11 @@ var RpgItemStatusSchema = zod.z.object({
1345
1345
  category: zod.z.string(),
1346
1346
  earned: zod.z.boolean(),
1347
1347
  state: zod.z.enum(["locked", "earned", "given", "claimed"]),
1348
+ /**
1349
+ * True when the viewer's rpg.actor character wears this (claimed) item.
1350
+ * Defaults to false for an older API that does not send it.
1351
+ */
1352
+ worn: zod.z.boolean().default(false),
1348
1353
  iconUrl: zod.z.string().url().nullable()
1349
1354
  });
1350
1355
  var RpgStatusResponseSchema = zod.z.object({