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)}`;