{"version":3,"sources":["../../src/protocol/scopes.ts"],"sourcesContent":["import { z } from \"zod\";\n\nconst SEGMENT_RE = /^[a-z0-9][a-z0-9_]*$/;\n\nexport const ScopeSchema = z.string().refine(\n  (scope) => {\n    const parts = scope.split(\".\");\n    return (\n      parts.length >= 2 &&\n      parts.length <= 3 &&\n      parts.every((part) => SEGMENT_RE.test(part))\n    );\n  },\n  {\n    message:\n      \"Scope must be {source}.{category}[.{subcategory}] with lowercase alphanumeric segments (may start with a letter or digit)\",\n  },\n);\n\nexport type Scope = z.infer<typeof ScopeSchema>;\n\nexport interface ParsedScope {\n  source: string;\n  category: string;\n  subcategory?: string;\n  raw: string;\n}\n\nexport function parseScope(scope: string): ParsedScope {\n  const validated = ScopeSchema.parse(scope);\n  const parts = validated.split(\".\");\n  return {\n    source: parts[0],\n    category: parts[1],\n    subcategory: parts[2],\n    raw: validated,\n  };\n}\n\nexport function scopeToPathSegments(scope: string): string[] {\n  const parsed = parseScope(scope);\n  const segments = [parsed.source, parsed.category];\n  if (parsed.subcategory) {\n    segments.push(parsed.subcategory);\n  }\n  return segments;\n}\n\nexport function scopeMatchesPattern(\n  requestedScope: string,\n  grantPattern: string,\n): boolean {\n  if (grantPattern === \"*\") return true;\n\n  if (grantPattern.endsWith(\".*\")) {\n    const prefix = grantPattern.slice(0, -1);\n    return requestedScope.startsWith(prefix);\n  }\n\n  return requestedScope === grantPattern;\n}\n\nexport function scopeCoveredByGrant(\n  requestedScope: string,\n  grantedScopes: string[],\n): boolean {\n  return grantedScopes.some((pattern) =>\n    scopeMatchesPattern(requestedScope, pattern),\n  );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAElB,MAAM,aAAa;AAEZ,MAAM,cAAc,aAAE,OAAO,EAAE;AAAA,EACpC,CAAC,UAAU;AACT,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,WACE,MAAM,UAAU,KAChB,MAAM,UAAU,KAChB,MAAM,MAAM,CAAC,SAAS,WAAW,KAAK,IAAI,CAAC;AAAA,EAE/C;AAAA,EACA;AAAA,IACE,SACE;AAAA,EACJ;AACF;AAWO,SAAS,WAAW,OAA4B;AACrD,QAAM,YAAY,YAAY,MAAM,KAAK;AACzC,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,SAAO;AAAA,IACL,QAAQ,MAAM,CAAC;AAAA,IACf,UAAU,MAAM,CAAC;AAAA,IACjB,aAAa,MAAM,CAAC;AAAA,IACpB,KAAK;AAAA,EACP;AACF;AAEO,SAAS,oBAAoB,OAAyB;AAC3D,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAM,WAAW,CAAC,OAAO,QAAQ,OAAO,QAAQ;AAChD,MAAI,OAAO,aAAa;AACtB,aAAS,KAAK,OAAO,WAAW;AAAA,EAClC;AACA,SAAO;AACT;AAEO,SAAS,oBACd,gBACA,cACS;AACT,MAAI,iBAAiB,IAAK,QAAO;AAEjC,MAAI,aAAa,SAAS,IAAI,GAAG;AAC/B,UAAM,SAAS,aAAa,MAAM,GAAG,EAAE;AACvC,WAAO,eAAe,WAAW,MAAM;AAAA,EACzC;AAEA,SAAO,mBAAmB;AAC5B;AAEO,SAAS,oBACd,gBACA,eACS;AACT,SAAO,cAAc;AAAA,IAAK,CAAC,YACzB,oBAAoB,gBAAgB,OAAO;AAAA,EAC7C;AACF;","names":[]}