{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/decoder.ts","../src/model-loader.ts","../src/runtime/capability.ts","../src/runtime/ort-web-loader.ts"],"sourcesContent":["import { decodeBioTokenSpans } from \"./decoder\";\nimport { loadTokenClassificationPipeline } from \"./model-loader\";\nimport {\n  OPENMED_SPAN_SCHEMA_VERSION,\n  type DeidentifyOptions,\n  type ExtractPiiOptions,\n  type OpenMedDeidentifyResult,\n  type OpenMedSpan,\n  type SpanAction,\n} from \"./types\";\n\nexport {\n  CANONICAL_LABELS,\n  OPENMED_SPAN_SCHEMA_VERSION,\n  POLICY_LABELS,\n  SPAN_ACTIONS,\n} from \"./types\";\nexport type {\n  CanonicalLabel,\n  DecodedEntitySpan,\n  DeidentifyOptions,\n  ExtractPiiOptions,\n  LoadModelOptions,\n  LoadOnnxModelOptions,\n  ModelLoader,\n  OpenMedOnnxVariant,\n  OpenMedDeidentifyResult,\n  OpenMedSpan,\n  PolicyLabel,\n  SpanAction,\n  TextHash,\n  TokenClassificationCallOptions,\n  TokenClassificationEntity,\n  TokenClassificationOutput,\n  TokenClassificationPipeline,\n  TransformersRuntime,\n} from \"./types\";\nexport {\n  decodeBioTokenSpans,\n  flattenTokenClassificationOutput,\n  normalizeLabel,\n  policyLabelFor,\n  refinePrivacyFilterSpan,\n  trimSpanWhitespace,\n} from \"./decoder\";\nexport {\n  isLocalModelReference,\n  loadOnnxModel,\n  loadTokenClassificationPipeline,\n} from \"./model-loader\";\nexport {\n  detectOrtWebCapabilities,\n  selectOrtWebBackend,\n} from \"./runtime/capability\";\nexport type {\n  CapabilityDetectionOptions,\n  OrtCapabilityGlobalScope,\n  OrtWebBackend,\n  OrtWebBackendChoice,\n  OrtWebCapabilityProfile,\n} from \"./runtime/capability\";\nexport {\n  assertOfflineAssetPath,\n  clearOrtWebSessionCache,\n  configureOrtWebRuntime,\n  loadOrtWebSession,\n  loadOrtWebTokenClassificationPipeline,\n  normalizeOrtAssetPath,\n} from \"./runtime/ort-web-loader\";\nexport type {\n  OrtExecutionProvider,\n  OrtFeeds,\n  OrtInferenceSession,\n  OrtResults,\n  OrtSessionCreateOptions,\n  OrtTensorLike,\n  OrtTokenClassificationDecodeContext,\n  OrtWebLoadedSession,\n  OrtWebLoaderOptions,\n  OrtWebRuntime,\n  OrtWebRuntimeProvider,\n  OrtWebSessionCache,\n  OrtWebTokenClassificationPipelineOptions,\n} from \"./runtime/ort-web-loader\";\n\nconst DEFAULT_MODEL_ID = \"OpenMed/privacy-filter-transformersjs\";\nconst DEFAULT_HASH_SECRET = \"openmedkit-web\";\n\nexport async function extractPii(\n  text: string,\n  options: ExtractPiiOptions = {},\n): Promise<OpenMedSpan[]> {\n  const pipeline =\n    options.pipeline ??\n    (await (options.modelLoader ?? loadTokenClassificationPipeline)(\n      options.model ?? DEFAULT_MODEL_ID,\n      options.loaderOptions,\n    ));\n  const rawOutput = await pipeline(text, {\n    aggregation_strategy: \"none\",\n    ...(options.pipelineOptions ?? {}),\n  });\n  const decoded = decodeBioTokenSpans(text, rawOutput, {\n    threshold: options.threshold ?? 0,\n  });\n\n  const spans: OpenMedSpan[] = [];\n  for (const entity of decoded) {\n    const surface = text.slice(entity.start, entity.end);\n    spans.push({\n      schema_version: OPENMED_SPAN_SCHEMA_VERSION,\n      doc_id: options.docId ?? \"document\",\n      start: entity.start,\n      end: entity.end,\n      text_hash: await hmacTextHash(\n        surface,\n        options.hashSecret ?? DEFAULT_HASH_SECRET,\n      ),\n      entity_type: entity.entity_type,\n      canonical_label: entity.canonical_label,\n      policy_label: entity.policy_label,\n      regulatory_tags: [...(options.regulatoryTags ?? [])],\n      score: entity.score,\n      detector: options.detector ?? \"transformersjs\",\n      evidence: {\n        token_count: entity.token_count,\n      },\n      action: \"keep\",\n      replacement: null,\n      reversible_id: null,\n      section: options.section ?? null,\n      metadata: {\n        ...(options.model ? { model: options.model } : {}),\n        ...(options.metadata ?? {}),\n      },\n    });\n  }\n  return spans;\n}\n\nexport async function deidentify(\n  text: string,\n  options: DeidentifyOptions = {},\n): Promise<OpenMedDeidentifyResult> {\n  const spans = await extractPii(text, options);\n  const redactionSpans = spans.map((span) => {\n    const replacement = options.replacement?.(span) ?? `[${span.canonical_label}]`;\n    return {\n      ...span,\n      action: \"redact\" as SpanAction,\n      replacement,\n    };\n  });\n  return {\n    text,\n    deidentifiedText: spansToRedactedText(text, redactionSpans),\n    spans: redactionSpans,\n  };\n}\n\nexport function spansToRedactedText(text: string, spans: OpenMedSpan[]): string {\n  let redacted = text;\n  for (const span of [...spans].sort((left, right) => right.start - left.start)) {\n    redacted =\n      redacted.slice(0, span.start) +\n      (span.replacement ?? `[${span.canonical_label}]`) +\n      redacted.slice(span.end);\n  }\n  return redacted;\n}\n\nexport async function hmacTextHash(\n  surface: string | Uint8Array,\n  secret: string | Uint8Array,\n): Promise<`hmac-sha256:${string}`> {\n  const payload = toBytes(surface);\n  const key = toBytes(secret);\n  const subtle = globalThis.crypto?.subtle;\n  if (subtle) {\n    const cryptoKey = await subtle.importKey(\n      \"raw\",\n      toArrayBuffer(key),\n      { name: \"HMAC\", hash: \"SHA-256\" },\n      false,\n      [\"sign\"],\n    );\n    const signature = await subtle.sign(\"HMAC\", cryptoKey, toArrayBuffer(payload));\n    return `hmac-sha256:${toHex(new Uint8Array(signature))}`;\n  }\n\n  const { createHmac } = await import(\"node:crypto\");\n  const digest = createHmac(\"sha256\", key).update(payload).digest(\"hex\");\n  return `hmac-sha256:${digest}`;\n}\n\nfunction toBytes(value: string | Uint8Array): Uint8Array {\n  return typeof value === \"string\" ? new TextEncoder().encode(value) : value;\n}\n\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n  const copy = new Uint8Array(bytes.byteLength);\n  copy.set(bytes);\n  return copy.buffer;\n}\n\nfunction toHex(bytes: Uint8Array): string {\n  return Array.from(bytes, (value) => value.toString(16).padStart(2, \"0\")).join(\n    \"\",\n  );\n}\n","export const OPENMED_SPAN_SCHEMA_VERSION = 1 as const;\n\nexport const CANONICAL_LABELS = [\n  \"ACCOUNT_NUMBER\",\n  \"AGE\",\n  \"AMOUNT\",\n  \"API_KEY\",\n  \"BIC\",\n  \"BITCOIN_ADDRESS\",\n  \"BUILDING_NUMBER\",\n  \"CREDIT_CARD\",\n  \"CREDIT_CARD_ISSUER\",\n  \"CURRENCY\",\n  \"CVV\",\n  \"DATE\",\n  \"DATE_OF_BIRTH\",\n  \"EMAIL\",\n  \"ETHEREUM_ADDRESS\",\n  \"EYE_COLOR\",\n  \"FIRST_NAME\",\n  \"GENDER\",\n  \"GPS_COORDINATES\",\n  \"HEIGHT\",\n  \"IBAN\",\n  \"ID_NUM\",\n  \"IMEI\",\n  \"IP_ADDRESS\",\n  \"JOB_DEPARTMENT\",\n  \"JOB_TITLE\",\n  \"LAST_NAME\",\n  \"LITECOIN_ADDRESS\",\n  \"LOCATION\",\n  \"MAC_ADDRESS\",\n  \"MASKED_NUMBER\",\n  \"MIDDLE_NAME\",\n  \"OCCUPATION\",\n  \"ORDINAL_DIRECTION\",\n  \"ORGANIZATION\",\n  \"OTHER\",\n  \"PASSWORD\",\n  \"PERSON\",\n  \"PHONE\",\n  \"PIN\",\n  \"PREFIX\",\n  \"SSN\",\n  \"STREET_ADDRESS\",\n  \"TIME\",\n  \"URL\",\n  \"USER_AGENT\",\n  \"USERNAME\",\n  \"VEHICLE_REGISTRATION\",\n  \"VIN\",\n  \"ZIPCODE\"\n] as const;\n\nexport type CanonicalLabel = (typeof CANONICAL_LABELS)[number];\n\nexport const POLICY_LABELS = [\n  \"DIRECT_IDENTIFIER\",\n  \"QUASI_IDENTIFIER\",\n  \"CLINICAL_CONCEPT\"\n] as const;\n\nexport type PolicyLabel = (typeof POLICY_LABELS)[number];\n\nexport const SPAN_ACTIONS = [\n  \"keep\",\n  \"redact\",\n  \"replace\",\n  \"mask\",\n  \"hash\",\n  \"format_preserve\"\n] as const;\n\nexport type SpanAction = (typeof SPAN_ACTIONS)[number];\n\nexport type TextHash = `hmac-sha256:${string}`;\n\nexport interface OpenMedSpan {\n  schema_version: typeof OPENMED_SPAN_SCHEMA_VERSION;\n  doc_id: string;\n  start: number;\n  end: number;\n  text_hash: TextHash;\n  entity_type: string;\n  canonical_label: CanonicalLabel;\n  policy_label: PolicyLabel;\n  regulatory_tags: string[];\n  score: number | null;\n  detector: string | null;\n  evidence: Record<string, unknown>;\n  action: SpanAction;\n  replacement: string | null;\n  reversible_id: string | null;\n  section: string | null;\n  metadata: Record<string, unknown>;\n}\n\nexport interface TokenClassificationEntity {\n  entity?: string;\n  entity_group?: string;\n  score?: number;\n  word?: string;\n  start: number;\n  end: number;\n  index?: number;\n}\n\nexport type TokenClassificationOutput =\n  | TokenClassificationEntity[]\n  | TokenClassificationEntity[][];\n\nexport interface TokenClassificationCallOptions {\n  aggregation_strategy?: \"none\" | \"simple\" | \"first\" | \"average\" | \"max\";\n  ignore_labels?: string[];\n  [key: string]: unknown;\n}\n\nexport type TokenClassificationPipeline = (\n  text: string,\n  options?: TokenClassificationCallOptions,\n) => TokenClassificationOutput | Promise<TokenClassificationOutput>;\n\nexport interface DecodedEntitySpan {\n  entity_type: string;\n  canonical_label: CanonicalLabel;\n  policy_label: PolicyLabel;\n  start: number;\n  end: number;\n  score: number | null;\n  token_count: number;\n}\n\nexport interface ExtractPiiOptions {\n  pipeline?: TokenClassificationPipeline;\n  model?: string;\n  modelLoader?: ModelLoader;\n  loaderOptions?: LoadModelOptions;\n  threshold?: number;\n  docId?: string;\n  hashSecret?: string | Uint8Array;\n  detector?: string | null;\n  lang?: string;\n  section?: string | null;\n  regulatoryTags?: string[];\n  metadata?: Record<string, unknown>;\n  pipelineOptions?: TokenClassificationCallOptions;\n}\n\nexport interface DeidentifyOptions extends ExtractPiiOptions {\n  replacement?: (span: OpenMedSpan) => string;\n}\n\nexport interface OpenMedDeidentifyResult {\n  text: string;\n  deidentifiedText: string;\n  spans: OpenMedSpan[];\n}\n\nexport interface LoadModelOptions {\n  localFilesOnly?: boolean;\n  allowRemoteModels?: boolean;\n  revision?: string;\n  quantized?: boolean;\n  dtype?: string;\n  device?: string;\n  runtime?: TransformersRuntime | (() => Promise<TransformersRuntime>);\n  pipelineOptions?: Record<string, unknown>;\n}\n\nexport type OpenMedOnnxVariant = \"int8\" | \"fp32\" | \"fp16\";\n\nexport interface LoadOnnxModelOptions extends LoadModelOptions {\n  variant?: OpenMedOnnxVariant;\n}\n\nexport interface TransformersRuntime {\n  pipeline: (\n    task: \"token-classification\",\n    model: string,\n    options?: Record<string, unknown>,\n  ) => Promise<TokenClassificationPipeline> | TokenClassificationPipeline;\n  env?: {\n    allowRemoteModels?: boolean;\n    allowLocalModels?: boolean;\n    [key: string]: unknown;\n  };\n}\n\nexport type ModelLoader = (\n  model: string,\n  options?: LoadModelOptions,\n) => Promise<TokenClassificationPipeline>;\n","import {\n  CANONICAL_LABELS,\n  type CanonicalLabel,\n  type DecodedEntitySpan,\n  type PolicyLabel,\n  type TokenClassificationEntity,\n  type TokenClassificationOutput,\n} from \"./types\";\n\nconst CANONICAL_LABEL_SET = new Set<string>(CANONICAL_LABELS);\n\nconst POLICY_LABEL_BY_CANONICAL: Record<CanonicalLabel, PolicyLabel> = {\n  ACCOUNT_NUMBER: \"DIRECT_IDENTIFIER\",\n  AGE: \"QUASI_IDENTIFIER\",\n  AMOUNT: \"QUASI_IDENTIFIER\",\n  API_KEY: \"DIRECT_IDENTIFIER\",\n  BIC: \"DIRECT_IDENTIFIER\",\n  BITCOIN_ADDRESS: \"DIRECT_IDENTIFIER\",\n  BUILDING_NUMBER: \"DIRECT_IDENTIFIER\",\n  CREDIT_CARD: \"DIRECT_IDENTIFIER\",\n  CREDIT_CARD_ISSUER: \"QUASI_IDENTIFIER\",\n  CURRENCY: \"QUASI_IDENTIFIER\",\n  CVV: \"DIRECT_IDENTIFIER\",\n  DATE: \"QUASI_IDENTIFIER\",\n  DATE_OF_BIRTH: \"DIRECT_IDENTIFIER\",\n  EMAIL: \"DIRECT_IDENTIFIER\",\n  ETHEREUM_ADDRESS: \"DIRECT_IDENTIFIER\",\n  EYE_COLOR: \"QUASI_IDENTIFIER\",\n  FIRST_NAME: \"DIRECT_IDENTIFIER\",\n  GENDER: \"QUASI_IDENTIFIER\",\n  GPS_COORDINATES: \"DIRECT_IDENTIFIER\",\n  HEIGHT: \"QUASI_IDENTIFIER\",\n  IBAN: \"DIRECT_IDENTIFIER\",\n  ID_NUM: \"DIRECT_IDENTIFIER\",\n  IMEI: \"DIRECT_IDENTIFIER\",\n  IP_ADDRESS: \"DIRECT_IDENTIFIER\",\n  JOB_DEPARTMENT: \"QUASI_IDENTIFIER\",\n  JOB_TITLE: \"QUASI_IDENTIFIER\",\n  LAST_NAME: \"DIRECT_IDENTIFIER\",\n  LITECOIN_ADDRESS: \"DIRECT_IDENTIFIER\",\n  LOCATION: \"QUASI_IDENTIFIER\",\n  MAC_ADDRESS: \"DIRECT_IDENTIFIER\",\n  MASKED_NUMBER: \"DIRECT_IDENTIFIER\",\n  MIDDLE_NAME: \"DIRECT_IDENTIFIER\",\n  OCCUPATION: \"QUASI_IDENTIFIER\",\n  ORDINAL_DIRECTION: \"QUASI_IDENTIFIER\",\n  ORGANIZATION: \"QUASI_IDENTIFIER\",\n  OTHER: \"CLINICAL_CONCEPT\",\n  PASSWORD: \"DIRECT_IDENTIFIER\",\n  PERSON: \"DIRECT_IDENTIFIER\",\n  PHONE: \"DIRECT_IDENTIFIER\",\n  PIN: \"DIRECT_IDENTIFIER\",\n  PREFIX: \"DIRECT_IDENTIFIER\",\n  SSN: \"DIRECT_IDENTIFIER\",\n  STREET_ADDRESS: \"DIRECT_IDENTIFIER\",\n  TIME: \"QUASI_IDENTIFIER\",\n  URL: \"DIRECT_IDENTIFIER\",\n  USER_AGENT: \"DIRECT_IDENTIFIER\",\n  USERNAME: \"DIRECT_IDENTIFIER\",\n  VEHICLE_REGISTRATION: \"DIRECT_IDENTIFIER\",\n  VIN: \"DIRECT_IDENTIFIER\",\n  ZIPCODE: \"QUASI_IDENTIFIER\",\n};\n\nconst ALIAS_MAP: Record<string, CanonicalLabel> = {\n  accountname: \"ACCOUNT_NUMBER\",\n  accountnumber: \"ACCOUNT_NUMBER\",\n  address: \"STREET_ADDRESS\",\n  aadhaar: \"ID_NUM\",\n  age: \"AGE\",\n  amount: \"AMOUNT\",\n  apikey: \"API_KEY\",\n  bankaccount: \"ACCOUNT_NUMBER\",\n  bic: \"BIC\",\n  birthdate: \"DATE_OF_BIRTH\",\n  bitcoinaddress: \"BITCOIN_ADDRESS\",\n  buildingnumber: \"BUILDING_NUMBER\",\n  city: \"LOCATION\",\n  cnpj: \"ID_NUM\",\n  codicefiscale: \"ID_NUM\",\n  company: \"ORGANIZATION\",\n  country: \"LOCATION\",\n  county: \"LOCATION\",\n  cpf: \"ID_NUM\",\n  creditcard: \"CREDIT_CARD\",\n  creditcardissuer: \"CREDIT_CARD_ISSUER\",\n  creditcardnumber: \"CREDIT_CARD\",\n  creditdebitcard: \"CREDIT_CARD\",\n  currency: \"CURRENCY\",\n  currencycode: \"CURRENCY\",\n  currencyname: \"CURRENCY\",\n  currencysymbol: \"CURRENCY\",\n  cvv: \"CVV\",\n  date: \"DATE\",\n  dateofbirth: \"DATE_OF_BIRTH\",\n  department: \"JOB_DEPARTMENT\",\n  dni: \"ID_NUM\",\n  dob: \"DATE_OF_BIRTH\",\n  doctor: \"PERSON\",\n  email: \"EMAIL\",\n  emailaddress: \"EMAIL\",\n  employer: \"ORGANIZATION\",\n  ethereumaddress: \"ETHEREUM_ADDRESS\",\n  eyecolor: \"EYE_COLOR\",\n  familyname: \"LAST_NAME\",\n  fax: \"PHONE\",\n  firstname: \"FIRST_NAME\",\n  fullname: \"PERSON\",\n  gender: \"GENDER\",\n  givenname: \"FIRST_NAME\",\n  gps: \"GPS_COORDINATES\",\n  gpscoordinates: \"GPS_COORDINATES\",\n  height: \"HEIGHT\",\n  iban: \"IBAN\",\n  id: \"ID_NUM\",\n  identifier: \"ID_NUM\",\n  idnum: \"ID_NUM\",\n  imei: \"IMEI\",\n  ip: \"IP_ADDRESS\",\n  ipaddress: \"IP_ADDRESS\",\n  jobdepartment: \"JOB_DEPARTMENT\",\n  jobtitle: \"JOB_TITLE\",\n  lastname: \"LAST_NAME\",\n  licenseplate: \"VEHICLE_REGISTRATION\",\n  litecoinaddress: \"LITECOIN_ADDRESS\",\n  location: \"LOCATION\",\n  macaddress: \"MAC_ADDRESS\",\n  maskednumber: \"MASKED_NUMBER\",\n  medicalrecordnumber: \"ID_NUM\",\n  middlename: \"MIDDLE_NAME\",\n  mrn: \"ID_NUM\",\n  name: \"PERSON\",\n  nationalid: \"ID_NUM\",\n  nhs: \"ID_NUM\",\n  nhsnumber: \"ID_NUM\",\n  nie: \"ID_NUM\",\n  npi: \"ID_NUM\",\n  occupation: \"OCCUPATION\",\n  ordinaldirection: \"ORDINAL_DIRECTION\",\n  organization: \"ORGANIZATION\",\n  password: \"PASSWORD\",\n  patient: \"PERSON\",\n  person: \"PERSON\",\n  personalurl: \"URL\",\n  phone: \"PHONE\",\n  phonenumber: \"PHONE\",\n  pin: \"PIN\",\n  place: \"LOCATION\",\n  postalcode: \"ZIPCODE\",\n  postcode: \"ZIPCODE\",\n  prefix: \"PREFIX\",\n  profession: \"OCCUPATION\",\n  region: \"LOCATION\",\n  secondaryaddress: \"STREET_ADDRESS\",\n  sex: \"GENDER\",\n  socialsecuritynumber: \"SSN\",\n  ssn: \"SSN\",\n  state: \"LOCATION\",\n  steuerid: \"ID_NUM\",\n  street: \"STREET_ADDRESS\",\n  streetaddress: \"STREET_ADDRESS\",\n  surname: \"LAST_NAME\",\n  swift: \"BIC\",\n  telephone: \"PHONE\",\n  teudatzehut: \"ID_NUM\",\n  time: \"TIME\",\n  title: \"PREFIX\",\n  tz: \"ID_NUM\",\n  url: \"URL\",\n  urlpersonal: \"URL\",\n  useragent: \"USER_AGENT\",\n  userhandle: \"USERNAME\",\n  username: \"USERNAME\",\n  vin: \"VIN\",\n  vrm: \"VEHICLE_REGISTRATION\",\n  website: \"URL\",\n  zip: \"ZIPCODE\",\n  zipcode: \"ZIPCODE\",\n};\n\ntype BoundaryTag = \"B\" | \"I\" | \"E\" | \"S\" | null;\n\ninterface PreparedToken {\n  label: string;\n  boundary: BoundaryTag;\n  baseLabel: string;\n  canonicalLabel: CanonicalLabel;\n  policyLabel: PolicyLabel;\n  start: number;\n  end: number;\n  score: number | null;\n  index: number;\n}\n\ninterface ActiveSpan {\n  baseLabel: string;\n  canonicalLabel: CanonicalLabel;\n  policyLabel: PolicyLabel;\n  start: number;\n  end: number;\n  scores: number[];\n  tokenCount: number;\n}\n\nexport function normalizeLabel(label: string): CanonicalLabel {\n  if (!label) {\n    return \"OTHER\";\n  }\n  const key = labelKey(label);\n  if (!key) {\n    return \"OTHER\";\n  }\n  const alias = ALIAS_MAP[key];\n  if (alias) {\n    return alias;\n  }\n  const upper = label\n    .toUpperCase()\n    .replace(/[-\\s]+/g, \"_\")\n    .replace(/[^A-Z0-9_]/g, \"\");\n  return CANONICAL_LABEL_SET.has(upper) ? (upper as CanonicalLabel) : \"OTHER\";\n}\n\nexport function policyLabelFor(label: string): PolicyLabel {\n  return POLICY_LABEL_BY_CANONICAL[normalizeLabel(label)];\n}\n\nexport function decodeBioTokenSpans(\n  text: string,\n  output: TokenClassificationOutput,\n  options: { threshold?: number } = {},\n): DecodedEntitySpan[] {\n  const threshold = options.threshold ?? 0;\n  const tokens = flattenTokenClassificationOutput(output)\n    .map((token, fallbackIndex) => prepareToken(token, fallbackIndex))\n    .filter((token): token is PreparedToken => token !== null)\n    .sort((left, right) => left.index - right.index || left.start - right.start);\n\n  const spans: DecodedEntitySpan[] = [];\n  let current: ActiveSpan | null = null;\n  let previousIndex: number | null = null;\n\n  for (const token of tokens) {\n    if (previousIndex !== null && token.index !== previousIndex + 1) {\n      if (current !== null) {\n        pushDecodedSpan(spans, current, text, threshold);\n        current = null;\n      }\n    }\n\n    if (token.boundary === null) {\n      if (current !== null) {\n        pushDecodedSpan(spans, current, text, threshold);\n        current = null;\n      }\n      previousIndex = token.index;\n      continue;\n    }\n\n    if (token.boundary === \"S\") {\n      if (current !== null) {\n        pushDecodedSpan(spans, current, text, threshold);\n      }\n      pushDecodedSpan(spans, activeSpanFromToken(token), text, threshold);\n      current = null;\n    } else if (token.boundary === \"B\") {\n      if (current !== null) {\n        pushDecodedSpan(spans, current, text, threshold);\n      }\n      current = activeSpanFromToken(token);\n    } else if (\n      token.boundary === \"I\" &&\n      current !== null &&\n      current.baseLabel === token.baseLabel\n    ) {\n      appendTokenToActiveSpan(current, token);\n    } else if (\n      token.boundary === \"E\" &&\n      current !== null &&\n      current.baseLabel === token.baseLabel\n    ) {\n      appendTokenToActiveSpan(current, token);\n      pushDecodedSpan(spans, current, text, threshold);\n      current = null;\n    } else {\n      if (current !== null) {\n        pushDecodedSpan(spans, current, text, threshold);\n      }\n      current = activeSpanFromToken(token);\n      if (token.boundary === \"E\") {\n        pushDecodedSpan(spans, current, text, threshold);\n        current = null;\n      }\n    }\n\n    previousIndex = token.index;\n  }\n\n  if (current !== null) {\n    pushDecodedSpan(spans, current, text, threshold);\n  }\n  return mergeAdjacentSpans(spans, text);\n}\n\nexport function flattenTokenClassificationOutput(\n  output: TokenClassificationOutput,\n): TokenClassificationEntity[] {\n  if (output.length === 0) {\n    return [];\n  }\n  const first = output[0];\n  if (Array.isArray(first)) {\n    return (output as TokenClassificationEntity[][]).flat();\n  }\n  return output as TokenClassificationEntity[];\n}\n\nexport function trimSpanWhitespace(\n  start: number,\n  end: number,\n  text: string,\n): { start: number; end: number } {\n  let nextStart = Math.max(0, Math.min(start, text.length));\n  let nextEnd = Math.max(nextStart, Math.min(end, text.length));\n  while (nextStart < nextEnd && /\\s/.test(text[nextStart] ?? \"\")) {\n    nextStart += 1;\n  }\n  while (nextEnd > nextStart && /\\s/.test(text[nextEnd - 1] ?? \"\")) {\n    nextEnd -= 1;\n  }\n  return { start: nextStart, end: nextEnd };\n}\n\nexport function refinePrivacyFilterSpan(\n  label: string,\n  start: number,\n  end: number,\n  text: string,\n): { start: number; end: number } {\n  const trimmed = trimSpanWhitespace(start, end, text);\n  const spanText = text.slice(trimmed.start, trimmed.end);\n  const normalized = label.toLowerCase();\n  const structuredPatterns: Array<[string, RegExp]> = [\n    [\"email\", /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/],\n    [\"url\", /\\b(?:https?:\\/\\/|www\\.)[^\\s,;)\\]]+/],\n    [\"phone\", /(?:\\+?1[\\s.-]?)?(?:\\(?\\d{3}\\)?[\\s.-]?)\\d{3}[\\s.-]?\\d{4}/],\n  ];\n\n  for (const [hint, pattern] of structuredPatterns) {\n    if (!normalized.includes(hint)) {\n      continue;\n    }\n    const match = pattern.exec(spanText);\n    if (match?.index !== undefined) {\n      return {\n        start: trimmed.start + match.index,\n        end: trimmed.start + match.index + match[0].length,\n      };\n    }\n  }\n\n  let nextEnd = trimmed.end;\n  const lowerSpan = spanText.toLowerCase();\n  for (const suffix of [\" and\", \" or\"]) {\n    if (lowerSpan.endsWith(suffix)) {\n      nextEnd -= suffix.length;\n      break;\n    }\n  }\n  return trimSpanWhitespace(trimmed.start, nextEnd, text);\n}\n\nfunction prepareToken(\n  token: TokenClassificationEntity,\n  fallbackIndex: number,\n): PreparedToken | null {\n  const label = token.entity_group ?? token.entity ?? \"\";\n  const start = Number(token.start);\n  const end = Number(token.end);\n  if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) {\n    return null;\n  }\n  const parsed = parseBoundaryLabel(label);\n  const canonicalLabel = normalizeLabel(parsed.baseLabel);\n  return {\n    label,\n    boundary: parsed.boundary,\n    baseLabel: parsed.baseLabel,\n    canonicalLabel,\n    policyLabel: POLICY_LABEL_BY_CANONICAL[canonicalLabel],\n    start,\n    end,\n    score: token.score === undefined ? null : Number(token.score),\n    index: token.index ?? fallbackIndex,\n  };\n}\n\nfunction activeSpanFromToken(token: PreparedToken): ActiveSpan {\n  return {\n    baseLabel: token.baseLabel,\n    canonicalLabel: token.canonicalLabel,\n    policyLabel: token.policyLabel,\n    start: token.start,\n    end: token.end,\n    scores: token.score === null ? [] : [token.score],\n    tokenCount: 1,\n  };\n}\n\nfunction appendTokenToActiveSpan(span: ActiveSpan, token: PreparedToken): void {\n  span.end = token.end;\n  if (token.score !== null) {\n    span.scores.push(token.score);\n  }\n  span.tokenCount += 1;\n}\n\nfunction pushDecodedSpan(\n  spans: DecodedEntitySpan[],\n  span: ActiveSpan,\n  text: string,\n  threshold: number,\n): void {\n  const refined = refinePrivacyFilterSpan(span.baseLabel, span.start, span.end, text);\n  if (refined.end <= refined.start) {\n    return;\n  }\n  const score =\n    span.scores.length > 0\n      ? span.scores.reduce((total, value) => total + value, 0) /\n        span.scores.length\n      : null;\n  if (score !== null && score < threshold) {\n    return;\n  }\n  spans.push({\n    entity_type: span.baseLabel,\n    canonical_label: span.canonicalLabel,\n    policy_label: span.policyLabel,\n    start: refined.start,\n    end: refined.end,\n    score,\n    token_count: span.tokenCount,\n  });\n}\n\nfunction parseBoundaryLabel(label: string): {\n  boundary: BoundaryTag;\n  baseLabel: string;\n} {\n  if (label === \"O\") {\n    return { boundary: null, baseLabel: \"O\" };\n  }\n  if (/^[BIES]-/.test(label)) {\n    return {\n      boundary: label[0] as Exclude<BoundaryTag, null>,\n      baseLabel: label.slice(2),\n    };\n  }\n  return { boundary: \"B\", baseLabel: label };\n}\n\nfunction labelKey(label: string): string {\n  const stripped = label.trim().replace(/^[BIES]-/, \"\");\n  return stripped.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nfunction mergeAdjacentSpans(\n  spans: DecodedEntitySpan[],\n  text: string,\n): DecodedEntitySpan[] {\n  const merged: DecodedEntitySpan[] = [];\n  for (const span of spans) {\n    const previous = merged.at(-1);\n    if (\n      previous &&\n      previous.entity_type === span.entity_type &&\n      previous.end <= span.start &&\n      text.slice(previous.end, span.start).trim() === \"\"\n    ) {\n      previous.end = span.end;\n      previous.token_count += span.token_count;\n      if (previous.score !== null && span.score !== null) {\n        previous.score =\n          (previous.score + span.score) / 2;\n      } else {\n        previous.score = previous.score ?? span.score;\n      }\n      continue;\n    }\n    merged.push({ ...span });\n  }\n  return merged;\n}\n","import type {\n  LoadModelOptions,\n  LoadOnnxModelOptions,\n  TokenClassificationPipeline,\n  TransformersRuntime,\n} from \"./types\";\n\nconst TRANSFORMERS_JS_MODULE = \"@huggingface/transformers\";\nconst ONNX_MODEL_FILENAMES = {\n  int8: \"model_int8\",\n  fp32: \"model\",\n  fp16: \"model_fp16\",\n} as const;\n\nexport async function loadOnnxModel(\n  model: string,\n  options: LoadOnnxModelOptions = {},\n): Promise<TokenClassificationPipeline> {\n  const { variant = \"int8\", pipelineOptions, ...loaderOptions } = options;\n  return loadTokenClassificationPipeline(model, {\n    ...loaderOptions,\n    quantized: false,\n    pipelineOptions: {\n      subfolder: \"\",\n      model_file_name: ONNX_MODEL_FILENAMES[variant],\n      ...pipelineOptions,\n    },\n  });\n}\n\nexport async function loadTokenClassificationPipeline(\n  model: string,\n  options: LoadModelOptions = {},\n): Promise<TokenClassificationPipeline> {\n  const runtime = await resolveRuntime(options.runtime);\n  const localReference = isLocalModelReference(model);\n  const localFilesOnly = options.localFilesOnly ?? localReference;\n  const allowRemoteModels = options.allowRemoteModels ?? !localFilesOnly;\n  const previousAllowRemote = runtime.env?.allowRemoteModels;\n  const previousAllowLocal = runtime.env?.allowLocalModels;\n\n  if (runtime.env) {\n    runtime.env.allowLocalModels = true;\n    runtime.env.allowRemoteModels = allowRemoteModels;\n  }\n\n  try {\n    const pipelineOptions: Record<string, unknown> = {\n      ...(options.revision === undefined ? {} : { revision: options.revision }),\n      ...(options.quantized === undefined ? {} : { quantized: options.quantized }),\n      ...(options.dtype === undefined ? {} : { dtype: options.dtype }),\n      ...(options.device === undefined ? {} : { device: options.device }),\n      ...(options.pipelineOptions ?? {}),\n      local_files_only: localFilesOnly,\n      localFilesOnly,\n    };\n    return await runtime.pipeline(\n      \"token-classification\",\n      model,\n      pipelineOptions,\n    );\n  } finally {\n    if (runtime.env) {\n      if (previousAllowRemote === undefined) {\n        delete runtime.env.allowRemoteModels;\n      } else {\n        runtime.env.allowRemoteModels = previousAllowRemote;\n      }\n      if (previousAllowLocal === undefined) {\n        delete runtime.env.allowLocalModels;\n      } else {\n        runtime.env.allowLocalModels = previousAllowLocal;\n      }\n    }\n  }\n}\n\nexport function isLocalModelReference(model: string): boolean {\n  if (model.startsWith(\"file://\")) {\n    return true;\n  }\n  if (\n    model.startsWith(\"/\") ||\n    model.startsWith(\"./\") ||\n    model.startsWith(\"../\") ||\n    model.startsWith(\"~\")\n  ) {\n    return true;\n  }\n  return /^[A-Za-z]:[\\\\/]/.test(model);\n}\n\nasync function resolveRuntime(\n  runtime?: LoadModelOptions[\"runtime\"],\n): Promise<TransformersRuntime> {\n  if (typeof runtime === \"function\") {\n    return runtime();\n  }\n  if (runtime) {\n    return runtime;\n  }\n  const moduleName = TRANSFORMERS_JS_MODULE;\n  try {\n    return (await import(moduleName)) as TransformersRuntime;\n  } catch (error) {\n    throw new Error(\n      \"Install @huggingface/transformers or pass a token-classification pipeline.\",\n      { cause: error },\n    );\n  }\n}\n","export type OrtWebBackend = \"webgpu\" | \"wasm-simd-threads\" | \"wasm-basic\";\n\nexport interface OrtWebCapabilityProfile {\n  webgpu: boolean;\n  wasm: boolean;\n  wasmSimd: boolean;\n  sharedArrayBuffer: boolean;\n  crossOriginIsolated: boolean;\n  hardwareConcurrency: number;\n}\n\nexport interface OrtWebBackendChoice {\n  backend: OrtWebBackend;\n  executionProviders: (\"webgpu\" | \"wasm\")[];\n  wasm: {\n    simd: boolean;\n    threads: boolean;\n    numThreads: number;\n  };\n  reason: string;\n}\n\nexport interface OrtCapabilityGlobalScope {\n  WebAssembly?: Pick<typeof WebAssembly, \"validate\">;\n  SharedArrayBuffer?: typeof SharedArrayBuffer;\n  crossOriginIsolated?: boolean;\n  navigator?: {\n    gpu?: unknown;\n    hardwareConcurrency?: number;\n  };\n}\n\nexport interface CapabilityDetectionOptions {\n  globalScope?: OrtCapabilityGlobalScope;\n  overrides?: Partial<OrtWebCapabilityProfile>;\n}\n\nconst MAX_WASM_THREADS = 4;\nconst MIN_THREADED_WASM_CONCURRENCY = 2;\n\nconst WASM_SIMD_PROBE = new Uint8Array([\n  0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x05, 0x01, 0x60,\n  0x00, 0x01, 0x7b, 0x03, 0x02, 0x01, 0x00, 0x0a, 0x0a, 0x01, 0x08, 0x00,\n  0x41, 0x00, 0xfd, 0x0f, 0xfd, 0x62, 0x0b,\n]);\n\nexport function detectOrtWebCapabilities(\n  options: CapabilityDetectionOptions = {},\n): OrtWebCapabilityProfile {\n  const scope = options.globalScope ?? globalThis;\n  const navigatorLike = scope.navigator as\n    | { gpu?: unknown; hardwareConcurrency?: number }\n    | undefined;\n  const wasm = scope.WebAssembly;\n  const hardwareConcurrency = Math.max(\n    1,\n    Math.floor(navigatorLike?.hardwareConcurrency ?? 1),\n  );\n  const detected: OrtWebCapabilityProfile = {\n    webgpu: navigatorLike?.gpu !== undefined,\n    wasm: wasm !== undefined,\n    wasmSimd: detectWasmSimd(wasm),\n    sharedArrayBuffer: scope.SharedArrayBuffer !== undefined,\n    crossOriginIsolated: scope.crossOriginIsolated === true,\n    hardwareConcurrency,\n  };\n\n  return {\n    ...detected,\n    ...(options.overrides ?? {}),\n  };\n}\n\nexport function selectOrtWebBackend(\n  profile: OrtWebCapabilityProfile,\n): OrtWebBackendChoice {\n  const wasmThreadsAvailable =\n    profile.wasm &&\n    profile.wasmSimd &&\n    profile.sharedArrayBuffer &&\n    profile.crossOriginIsolated &&\n    profile.hardwareConcurrency >= MIN_THREADED_WASM_CONCURRENCY;\n  const numThreads = wasmThreadsAvailable\n    ? Math.min(MAX_WASM_THREADS, profile.hardwareConcurrency)\n    : 1;\n\n  if (profile.webgpu) {\n    return {\n      backend: \"webgpu\",\n      executionProviders: profile.wasm ? [\"webgpu\", \"wasm\"] : [\"webgpu\"],\n      wasm: {\n        simd: profile.wasmSimd,\n        threads: wasmThreadsAvailable,\n        numThreads,\n      },\n      reason: \"navigator.gpu is available\",\n    };\n  }\n\n  if (!profile.wasm) {\n    throw new Error(\"ONNX Runtime Web requires WebAssembly when WebGPU is absent.\");\n  }\n\n  if (wasmThreadsAvailable) {\n    return {\n      backend: \"wasm-simd-threads\",\n      executionProviders: [\"wasm\"],\n      wasm: {\n        simd: true,\n        threads: true,\n        numThreads,\n      },\n      reason:\n        \"WebAssembly SIMD, SharedArrayBuffer, and cross-origin isolation are available\",\n    };\n  }\n\n  return {\n    backend: \"wasm-basic\",\n    executionProviders: [\"wasm\"],\n    wasm: {\n      simd: false,\n      threads: false,\n      numThreads: 1,\n    },\n    reason:\n      \"WebGPU or threaded wasm prerequisites are unavailable; using single-threaded wasm\",\n  };\n}\n\nfunction detectWasmSimd(\n  wasm: Pick<typeof WebAssembly, \"validate\"> | undefined,\n): boolean {\n  if (wasm === undefined) {\n    return false;\n  }\n  try {\n    return wasm.validate(WASM_SIMD_PROBE);\n  } catch {\n    return false;\n  }\n}\n","import type {\n  TokenClassificationCallOptions,\n  TokenClassificationOutput,\n  TokenClassificationPipeline,\n} from \"../types\";\nimport {\n  detectOrtWebCapabilities,\n  selectOrtWebBackend,\n  type CapabilityDetectionOptions,\n  type OrtWebBackendChoice,\n  type OrtWebCapabilityProfile,\n} from \"./capability\";\n\nconst ONNXRUNTIME_WEB_MODULE = \"onnxruntime-web\";\n\nexport type OrtExecutionProvider = \"webgpu\" | \"wasm\";\n\nexport type OrtTensorLike = {\n  data?: unknown;\n  dims?: readonly number[];\n  type?: string;\n  [key: string]: unknown;\n};\n\nexport type OrtFeeds = Record<string, OrtTensorLike | unknown>;\nexport type OrtResults = Record<string, OrtTensorLike | unknown>;\n\nexport interface OrtInferenceSession {\n  run(\n    feeds: OrtFeeds,\n    options?: Record<string, unknown>,\n  ): Promise<OrtResults> | OrtResults;\n}\n\nexport interface OrtSessionCreateOptions {\n  executionProviders?: OrtExecutionProvider[];\n  graphOptimizationLevel?: \"disabled\" | \"basic\" | \"extended\" | \"all\" | string;\n  [key: string]: unknown;\n}\n\nexport interface OrtWebRuntime {\n  env?: {\n    wasm?: {\n      wasmPaths?: string;\n      simd?: boolean;\n      numThreads?: number;\n      proxy?: boolean;\n      [key: string]: unknown;\n    };\n    [key: string]: unknown;\n  };\n  InferenceSession: {\n    create(\n      modelPath: string,\n      options?: OrtSessionCreateOptions,\n    ): Promise<OrtInferenceSession> | OrtInferenceSession;\n  };\n}\n\nexport type OrtWebRuntimeProvider =\n  | OrtWebRuntime\n  | (() => Promise<OrtWebRuntime> | OrtWebRuntime);\n\nexport interface OrtWebLoaderOptions {\n  modelPath: string;\n  assetPath: string;\n  runtime?: OrtWebRuntimeProvider;\n  capabilities?: Partial<OrtWebCapabilityProfile>;\n  globalScope?: CapabilityDetectionOptions[\"globalScope\"];\n  sessionOptions?: OrtSessionCreateOptions;\n  cache?: OrtWebSessionCache;\n}\n\nexport interface OrtWebLoadedSession {\n  session: OrtInferenceSession;\n  backend: OrtWebBackendChoice;\n  modelPath: string;\n  assetPath: string;\n  cacheKey: string;\n}\n\nexport type OrtWebSessionCache = Map<string, Promise<OrtWebLoadedSession>>;\n\nexport interface OrtWebTokenClassificationPipelineOptions\n  extends OrtWebLoaderOptions {\n  tokenize: (text: string) => OrtFeeds | Promise<OrtFeeds>;\n  decode: (context: OrtTokenClassificationDecodeContext) =>\n    | TokenClassificationOutput\n    | Promise<TokenClassificationOutput>;\n  runOptions?: Record<string, unknown>;\n}\n\nexport interface OrtTokenClassificationDecodeContext {\n  text: string;\n  inputs: OrtFeeds;\n  outputs: OrtResults;\n  session: OrtInferenceSession;\n  backend: OrtWebBackendChoice;\n  callOptions?: TokenClassificationCallOptions;\n}\n\nexport const DEFAULT_ORT_WEB_SESSION_CACHE: OrtWebSessionCache = new Map();\n\nexport function assertOfflineAssetPath(path: string, label = \"asset path\"): string {\n  const trimmed = path.trim();\n  if (trimmed.length === 0) {\n    throw new Error(`ONNX Runtime Web ${label} must not be empty.`);\n  }\n  if (trimmed.startsWith(\"//\")) {\n    throw new Error(`ONNX Runtime Web ${label} must be local/offline, not remote.`);\n  }\n  if (/^[A-Za-z]:[\\\\/]/.test(trimmed)) {\n    return trimmed;\n  }\n  if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(trimmed)) {\n    if (!trimmed.startsWith(\"file://\")) {\n      throw new Error(\n        `ONNX Runtime Web ${label} must be local/offline, not remote.`,\n      );\n    }\n  }\n  return trimmed;\n}\n\nexport function normalizeOrtAssetPath(path: string): string {\n  const localPath = assertOfflineAssetPath(path, \"wasm asset path\");\n  if (localPath.endsWith(\"/\") || localPath.endsWith(\"\\\\\")) {\n    return localPath;\n  }\n  return `${localPath}/`;\n}\n\nexport async function loadOrtWebSession(\n  options: OrtWebLoaderOptions,\n): Promise<OrtWebLoadedSession> {\n  const modelPath = assertOfflineAssetPath(options.modelPath, \"model path\");\n  const assetPath = normalizeOrtAssetPath(options.assetPath);\n  const capabilities = resolveCapabilities(options);\n  const backend = selectOrtWebBackend(capabilities);\n  const cache = options.cache ?? DEFAULT_ORT_WEB_SESSION_CACHE;\n  const sessionOptions: OrtSessionCreateOptions = {\n    graphOptimizationLevel: \"all\",\n    ...(options.sessionOptions ?? {}),\n    executionProviders: backend.executionProviders,\n  };\n  const cacheKey = stableStringify({\n    modelPath,\n    assetPath,\n    backend: {\n      name: backend.backend,\n      executionProviders: backend.executionProviders,\n      wasm: backend.wasm,\n    },\n    sessionOptions,\n  });\n  const cached = cache.get(cacheKey);\n  if (cached !== undefined) {\n    return cached;\n  }\n\n  const promise = createOrtWebSession({\n    ...options,\n    modelPath,\n    assetPath,\n    backend,\n    sessionOptions,\n    cacheKey,\n  }).catch((error: unknown) => {\n    if (cache.get(cacheKey) === promise) {\n      cache.delete(cacheKey);\n    }\n    throw error;\n  });\n  cache.set(cacheKey, promise);\n  return promise;\n}\n\nexport async function loadOrtWebTokenClassificationPipeline(\n  options: OrtWebTokenClassificationPipelineOptions,\n): Promise<TokenClassificationPipeline> {\n  const loaded = await loadOrtWebSession(options);\n  return async (\n    text: string,\n    callOptions?: TokenClassificationCallOptions,\n  ): Promise<TokenClassificationOutput> => {\n    const inputs = await options.tokenize(text);\n    const outputs = await loaded.session.run(inputs, options.runOptions);\n    const context: OrtTokenClassificationDecodeContext = {\n      text,\n      inputs,\n      outputs,\n      session: loaded.session,\n      backend: loaded.backend,\n    };\n    if (callOptions !== undefined) {\n      context.callOptions = callOptions;\n    }\n    return options.decode(context);\n  };\n}\n\nexport function configureOrtWebRuntime(\n  runtime: OrtWebRuntime,\n  backend: OrtWebBackendChoice,\n  assetPath: string,\n): void {\n  const env = (runtime.env ??= {});\n  const wasm = (env.wasm ??= {});\n  wasm.wasmPaths = normalizeOrtAssetPath(assetPath);\n  wasm.simd = backend.wasm.simd;\n  wasm.numThreads = backend.wasm.numThreads;\n  wasm.proxy = false;\n}\n\nexport function clearOrtWebSessionCache(cache = DEFAULT_ORT_WEB_SESSION_CACHE) {\n  cache.clear();\n}\n\nasync function createOrtWebSession(\n  options: OrtWebLoaderOptions & {\n    backend: OrtWebBackendChoice;\n    sessionOptions: OrtSessionCreateOptions;\n    cacheKey: string;\n  },\n): Promise<OrtWebLoadedSession> {\n  const runtime = await resolveOrtRuntime(options.runtime);\n  configureOrtWebRuntime(runtime, options.backend, options.assetPath);\n  const session = await runtime.InferenceSession.create(\n    options.modelPath,\n    options.sessionOptions,\n  );\n  return {\n    session,\n    backend: options.backend,\n    modelPath: options.modelPath,\n    assetPath: options.assetPath,\n    cacheKey: options.cacheKey,\n  };\n}\n\nasync function resolveOrtRuntime(\n  runtime?: OrtWebRuntimeProvider,\n): Promise<OrtWebRuntime> {\n  if (typeof runtime === \"function\") {\n    return runtime();\n  }\n  if (runtime !== undefined) {\n    return runtime;\n  }\n  try {\n    return (await import(ONNXRUNTIME_WEB_MODULE)) as OrtWebRuntime;\n  } catch (error) {\n    throw new Error(\n      \"Install onnxruntime-web or pass an ONNX Runtime Web runtime object.\",\n      { cause: error },\n    );\n  }\n}\n\nfunction resolveCapabilities(\n  options: OrtWebLoaderOptions,\n): OrtWebCapabilityProfile {\n  const detectionOptions: CapabilityDetectionOptions = {};\n  if (options.globalScope !== undefined) {\n    detectionOptions.globalScope = options.globalScope;\n  }\n  if (options.capabilities !== undefined) {\n    detectionOptions.overrides = options.capabilities;\n  }\n  return detectOrtWebCapabilities(detectionOptions);\n}\n\nfunction stableStringify(value: unknown): string {\n  if (value === null || typeof value !== \"object\") {\n    return JSON.stringify(value);\n  }\n  if (Array.isArray(value)) {\n    return `[${value.map((entry) => stableStringify(entry)).join(\",\")}]`;\n  }\n  const entries = Object.entries(value as Record<string, unknown>)\n    .filter(([, entry]) => entry !== undefined)\n    .sort(([left], [right]) => left.localeCompare(right));\n  return `{${entries\n    .map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`)\n    .join(\",\")}}`;\n}\n"],"mappings":"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","names":[]}