import { buildWispScopes, WISP_CLI_PERMISSION_SETS, WISP_HOSTING_LXMS } from '@wispplace/constants' export const DEFAULT_WISP_SERVICE_DID = 'did:web:wisp.place' export const WISP_PROXY_SERVICE_ID = 'wisp_xrpc' /** XRPC methods the CLI reaches through the hosting service proxy. */ export const WISP_SERVICE_LXMS = WISP_HOSTING_LXMS function isDid(value: string): value is `did:${string}:${string}` { if (!value.startsWith('did:')) { return false } if (value.length < 8) { return false } if (value.includes('#') || /\s/.test(value)) { return false } const methodSeparator = value.indexOf(':', 4) if (methodSeparator <= 4 || methodSeparator >= value.length - 1) { return false } return true } export function parseServiceDid(input?: string): `did:${string}:${string}` { const value = (input?.trim() || DEFAULT_WISP_SERVICE_DID).trim() if (!isDid(value)) { throw new Error(`Invalid --service value "${value}". Expected did:...`) } return value } const WISP_CLI_SCOPES = buildWispScopes([...WISP_CLI_PERMISSION_SETS]) /** * Scope the CLI asks for: one `include:` per published permission set, so the * consent screen shows "Manage your wisp.place sites" instead of a wall of * `repo:`/`rpc:` values. */ export const WISP_OAUTH_SCOPE = WISP_CLI_SCOPES.preferred /** * The granular expansion of those sets. Authorization servers that support * granular scopes but not permission sets ignore an unknown `include:` value * and hand back a session with no permissions at all, so the login flow falls * back to this. */ export const WISP_OAUTH_LEGACY_SCOPE = WISP_CLI_SCOPES.legacy