const scopes = [ "atproto", "blob:*/*", "identity:handle", "repo:org.tangled.feed.comment", "repo:org.tangled.feed.reaction", "repo:org.tangled.feed.subscription", "repo:org.tangled.snippet.string", "repo:org.tangled.actor.profile", "repo:org.tangled.feed.star", "repo:org.tangled.graph.follow", "repo:org.tangled.graph.vouch", "repo:org.tangled.graph.attestation", "repo:org.tangled.repo.artifact", "repo:org.tangled.repo.declaration", "repo:org.tangled.key.sshKey", "repo:org.tangled.key.unspecced.gpgKey", "repo:org.tangled.git.refs", "repo:org.tangled.graph.collaborator", "repo:org.tangled.knot.member", "repo:org.tangled.knot.block", "repo:org.tangled.label.definition", "repo:org.tangled.repo.manifest", "repo:org.tangled.repo.review.unspecced.round", "repo:org.tangled.review.patch", "repo:org.tangled.track.ticket", "repo:org.tangled.track.unspecced.milestone", "rpc:com.atproto.moderation.createReport?aud=*", "rpc:com.atproto.repo.createRecord?aud=*", "rpc:com.atproto.repo.deleteRecord?aud=*", "rpc:com.atproto.repo.putRecord?aud=*", "rpc:com.atproto.repo.uploadBlob?aud=*", "rpc:com.atproto.server.describeServer?aud=*", "rpc:org.tangled.temp.account.addEmail?aud=*", "rpc:org.tangled.temp.account.deleteEmail?aud=*", "rpc:org.tangled.temp.account.listEmails?aud=*", "rpc:org.tangled.temp.account.setPrimaryEmail?aud=*", "rpc:org.tangled.temp.account.verifyEmail?aud=*", "rpc:org.tangled.temp.server.redeemInviteCode?aud=*", "rpc:com.bad-example.pocket.getPreferences?aud=*", "rpc:com.bad-example.pocket.putPreferences?aud=*", "rpc:org.tangled.temp.migrator.createTask?aud=*", "rpc:org.tangled.temp.migrator.describeSource?aud=*", "rpc:org.tangled.temp.migrator.getTask?aud=*", "rpc:org.tangled.temp.migrator.listTasks?aud=*", "rpc:org.tangled.temp.migrator.retryJob?aud=*", "rpc:org.tangled.temp.notification.getPreferences?aud=*", "rpc:org.tangled.temp.notification.getUnreadCount?aud=*", "rpc:org.tangled.temp.notification.listNotifications?aud=*", "rpc:org.tangled.temp.notification.markAllRead?aud=*", "rpc:org.tangled.temp.notification.markEntityRead?aud=*", "rpc:org.tangled.temp.notification.updatePreferences?aud=*", "rpc:org.tangled.temp.notification.updateSeen?aud=*", "rpc:org.tangled.temp.search.searchCode?aud=*", "rpc:org.tangled.secret.addSecret?aud=*", "rpc:org.tangled.secret.listSecrets?aud=*", "rpc:org.tangled.secret.removeSecret?aud=*", "rpc:org.tangled.webhook.createWebhook?aud=*", "rpc:org.tangled.webhook.deleteWebhook?aud=*", "rpc:org.tangled.webhook.listWebhookDeliveries?aud=*", "rpc:org.tangled.webhook.listWebhooks?aud=*", "rpc:org.tangled.webhook.retryWebhookDelivery?aud=*", "rpc:org.tangled.webhook.updateWebhook?aud=*", "rpc:org.tangled.temp.site.claimDomain?aud=*", "rpc:org.tangled.temp.site.getDomainClaim?aud=*", "rpc:org.tangled.temp.site.releaseDomain?aud=*", "rpc:org.tangled.temp.repo.disableSite?aud=*", "rpc:org.tangled.temp.repo.deploySite?aud=*", "rpc:org.tangled.temp.repo.getDeployHistory?aud=*", "rpc:org.tangled.temp.repo.getSiteConfig?aud=*", "rpc:org.tangled.temp.repo.updateSiteConfig?aud=*", "rpc:org.tangled.actor.getTrending?aud=*", "rpc:org.tangled.ci.approvePipeline?aud=*", "rpc:org.tangled.ci.cancelPipeline?aud=*", "rpc:org.tangled.ci.retryPipeline?aud=*", "rpc:org.tangled.event.notifyEvent?aud=*", "rpc:farm.tranquil.delegation.authorize?aud=*", "rpc:farm.tranquil.delegation.createAccount?aud=*", "rpc:farm.tranquil.delegation.listControlledAccounts?aud=*", "rpc:org.tangled.feed.getTimeline?aud=*", "rpc:org.tangled.foster.unmarkLiarAccount?aud=*", "rpc:org.tangled.graph.listNetworkVouches?aud=*", "rpc:org.tangled.repo.createRepo?aud=*", "rpc:org.tangled.repo.deleteRepo?aud=*", "rpc:org.tangled.repo.mintToken?aud=*", "rpc:org.tangled.review.submitPatch?aud=*", "rpc:org.tangled.git.setDefaultBranch?aud=*", "rpc:org.tangled.git.receivePack?aud=*" ]; export default { client_id: "https://tangled.org/oauth-client-metadata.json", client_name: "Tangled", client_uri: "https://tangled.org", redirect_uris: ["https://tangled.org/oauth/callback"], grant_types: ["authorization_code", "refresh_token"], response_types: ["code"], token_endpoint_auth_method: "none", application_type: "web", dpop_bound_access_tokens: true, scope: scopes.join(" ") }; const rpcAnyAudience = /^rpc:(.+)\?aud=\*$/; export const loopbackScope = (() => { const lxm: string[] = []; const rest: string[] = []; for (const scope of scopes) { const match = rpcAnyAudience.exec(scope); if (match) lxm.push(match[1]); else if (!scope.startsWith("repo:")) rest.push(scope); } return [...rest, "repo:*", `rpc?${lxm.map((nsid) => `lxm=${nsid}`).join("&")}&aud=*`].join(" "); })(); const queryValue = (value: string) => value.replace(/[%&=+# ]/g, (char) => (char === " " ? "+" : encodeURIComponent(char))); export const loopbackClientId = (redirectUri: string, scope: string) => `http://localhost?redirect_uri=${queryValue(redirectUri)}&scope=${queryValue(scope)}`;