@emulators/github 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/store.ts","../src/helpers.ts","../../core/src/store.ts","../../core/src/server.ts","../../core/src/webhooks.ts","../../core/src/middleware/error-handler.ts","../../core/src/middleware/auth.ts","../../core/src/debug.ts","../../core/src/fonts.ts","../../core/src/middleware/pagination.ts","../../core/src/ui.ts","../../core/src/oauth-helpers.ts","../../core/src/persistence.ts","../src/route-helpers.ts","../src/routes/users.ts","../src/routes/repos.ts","../src/routes/issues.ts","../src/routes/pulls.ts","../src/routes/comments.ts","../src/routes/reviews.ts","../src/routes/labels.ts","../src/routes/branches.ts","../src/routes/orgs.ts","../src/routes/releases.ts","../src/routes/webhooks.ts","../src/routes/search.ts","../src/routes/actions.ts","../src/routes/checks.ts","../src/routes/rate-limit.ts","../src/routes/meta.ts","../src/routes/oauth.ts","../src/routes/apps.ts"],"sourcesContent":["import { createHmac } from \"crypto\";\nimport type { Hono } from \"hono\";\nimport type { ServicePlugin, Store, WebhookDispatcher, TokenMap, AppEnv, RouteContext } from \"@emulators/core\";\nimport { getGitHubStore } from \"./store.js\";\nimport type { GitHubStore } from \"./store.js\";\nimport type { GitHubAppInstallation } from \"./entities.js\";\nimport { generateNodeId, generateSha } from \"./helpers.js\";\nimport { usersRoutes } from \"./routes/users.js\";\nimport { reposRoutes } from \"./routes/repos.js\";\nimport { issuesRoutes } from \"./routes/issues.js\";\nimport { pullsRoutes } from \"./routes/pulls.js\";\nimport { commentsRoutes } from \"./routes/comments.js\";\nimport { reviewsRoutes } from \"./routes/reviews.js\";\nimport { labelsAndMilestonesRoutes } from \"./routes/labels.js\";\nimport { branchesAndGitRoutes } from \"./routes/branches.js\";\nimport { orgsAndTeamsRoutes } from \"./routes/orgs.js\";\nimport { releasesRoutes } from \"./routes/releases.js\";\nimport { webhooksRoutes } from \"./routes/webhooks.js\";\nimport { searchRoutes } from \"./routes/search.js\";\nimport { actionsRoutes } from \"./routes/actions.js\";\nimport { checksRoutes } from \"./routes/checks.js\";\nimport { rateLimitRoutes } from \"./routes/rate-limit.js\";\nimport { metaRoutes } from \"./routes/meta.js\";\nimport { oauthRoutes } from \"./routes/oauth.js\";\nimport { appsRoutes } from \"./routes/apps.js\";\n\nexport { getGitHubStore, type GitHubStore } from \"./store.js\";\nexport * from \"./entities.js\";\n\nexport interface GitHubSeedConfig {\n port?: number;\n users?: Array<{\n login: string;\n name?: string;\n email?: string;\n bio?: string;\n company?: string;\n location?: string;\n blog?: string;\n twitter_username?: string;\n site_admin?: boolean;\n }>;\n orgs?: Array<{\n login: string;\n name?: string;\n description?: string;\n email?: string;\n }>;\n tokens?: Record<string, { login: string; scopes?: string[] }>;\n repos?: Array<{\n owner: string;\n name: string;\n description?: string;\n private?: boolean;\n language?: string;\n topics?: string[];\n default_branch?: string;\n auto_init?: boolean;\n }>;\n oauth_apps?: Array<{\n client_id: string;\n client_secret: string;\n name: string;\n redirect_uris: string[];\n }>;\n apps?: Array<{\n app_id: number;\n slug: string;\n name: string;\n private_key: string;\n permissions?: Record<string, string>;\n events?: string[];\n webhook_url?: string;\n webhook_secret?: string;\n description?: string;\n installations?: Array<{\n installation_id: number;\n account: string;\n repository_selection?: \"all\" | \"selected\";\n repositories?: string[];\n permissions?: Record<string, string>;\n events?: string[];\n }>;\n }>;\n}\n\nfunction seedDefaults(store: Store, baseUrl: string): void {\n const gh = getGitHubStore(store);\n\n const ghost = gh.users.insert({\n login: \"ghost\",\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/ghost`,\n gravatar_id: \"\",\n type: \"User\",\n site_admin: false,\n name: \"Ghost\",\n company: null,\n blog: \"\",\n location: null,\n email: null,\n hireable: null,\n bio: null,\n twitter_username: null,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n });\n gh.users.update(ghost.id, { node_id: generateNodeId(\"User\", ghost.id) });\n\n const admin = gh.users.insert({\n login: \"admin\",\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/admin`,\n gravatar_id: \"\",\n type: \"User\",\n site_admin: true,\n name: \"Admin\",\n company: null,\n blog: \"\",\n location: null,\n email: \"admin@localhost\",\n hireable: null,\n bio: \"Default admin user\",\n twitter_username: null,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n });\n gh.users.update(admin.id, { node_id: generateNodeId(\"User\", admin.id) });\n}\n\nexport function seedFromConfig(store: Store, baseUrl: string, config: GitHubSeedConfig): void {\n const gh = getGitHubStore(store);\n\n if (config.users) {\n for (const u of config.users) {\n const existing = gh.users.findOneBy(\"login\", u.login);\n if (existing) continue;\n const user = gh.users.insert({\n login: u.login,\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/${u.login}`,\n gravatar_id: \"\",\n type: \"User\",\n site_admin: u.site_admin ?? false,\n name: u.name ?? null,\n company: u.company ?? null,\n blog: u.blog ?? \"\",\n location: u.location ?? null,\n email: u.email ?? null,\n hireable: null,\n bio: u.bio ?? null,\n twitter_username: u.twitter_username ?? null,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n });\n gh.users.update(user.id, { node_id: generateNodeId(\"User\", user.id) });\n }\n }\n\n if (config.orgs) {\n for (const o of config.orgs) {\n const existing = gh.orgs.findOneBy(\"login\", o.login);\n if (existing) continue;\n const org = gh.orgs.insert({\n login: o.login,\n node_id: \"\",\n description: o.description ?? null,\n name: o.name ?? null,\n company: null,\n blog: \"\",\n location: null,\n email: o.email ?? null,\n twitter_username: null,\n is_verified: false,\n has_organization_projects: true,\n has_repository_projects: true,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n members_can_create_repositories: true,\n default_repository_permission: \"read\",\n billing_email: null,\n });\n gh.orgs.update(org.id, { node_id: generateNodeId(\"Org\", org.id) });\n }\n }\n\n if (config.repos) {\n for (const r of config.repos) {\n const ownerUser = gh.users.findOneBy(\"login\", r.owner);\n const owner = ownerUser ?? gh.orgs.findOneBy(\"login\", r.owner);\n if (!owner) continue;\n\n const fullName = `${r.owner}/${r.name}`;\n const existing = gh.repos.findOneBy(\"full_name\", fullName);\n if (existing) continue;\n\n const ownerType = ownerUser ? \"User\" : \"Organization\";\n const defaultBranch = r.default_branch ?? \"main\";\n\n const repo = gh.repos.insert({\n node_id: \"\",\n name: r.name,\n full_name: fullName,\n owner_id: owner.id,\n owner_type: ownerType,\n private: r.private ?? false,\n description: r.description ?? null,\n fork: false,\n forked_from_id: null,\n homepage: null,\n language: r.language ?? null,\n languages: r.language ? { [r.language]: 10000 } : {},\n forks_count: 0,\n stargazers_count: 0,\n watchers_count: 0,\n size: 0,\n default_branch: defaultBranch,\n open_issues_count: 0,\n topics: r.topics ?? [],\n has_issues: true,\n has_projects: true,\n has_wiki: true,\n has_pages: false,\n has_downloads: true,\n has_discussions: false,\n archived: false,\n disabled: false,\n visibility: r.private ? \"private\" : \"public\",\n pushed_at: null,\n allow_rebase_merge: true,\n allow_squash_merge: true,\n allow_merge_commit: true,\n allow_auto_merge: false,\n delete_branch_on_merge: false,\n allow_forking: true,\n is_template: false,\n license: null,\n });\n gh.repos.update(repo.id, { node_id: generateNodeId(\"Repository\", repo.id) });\n\n if (r.auto_init !== false) {\n const sha = generateSha();\n const treeSha = generateSha();\n\n const commit = gh.commits.insert({\n repo_id: repo.id,\n sha,\n node_id: \"\",\n message: \"Initial commit\",\n author_name: r.owner,\n author_email: `${r.owner}@localhost`,\n author_date: repo.created_at,\n committer_name: r.owner,\n committer_email: `${r.owner}@localhost`,\n committer_date: repo.created_at,\n tree_sha: treeSha,\n parent_shas: [],\n user_id: owner.id,\n });\n gh.commits.update(commit.id, { node_id: generateNodeId(\"Commit\", commit.id) });\n\n const tree = gh.trees.insert({\n repo_id: repo.id,\n sha: treeSha,\n node_id: \"\",\n tree: [{ path: \"README.md\", mode: \"100644\", type: \"blob\", sha: generateSha(), size: 20 }],\n truncated: false,\n });\n gh.trees.update(tree.id, { node_id: generateNodeId(\"Tree\", tree.id) });\n\n gh.branches.insert({\n repo_id: repo.id,\n name: defaultBranch,\n sha,\n protected: false,\n });\n\n const refRow = gh.refs.insert({\n repo_id: repo.id,\n ref: `refs/heads/${defaultBranch}`,\n sha,\n node_id: \"\",\n });\n gh.refs.update(refRow.id, { node_id: generateNodeId(\"Ref\", refRow.id) });\n\n gh.repos.update(repo.id, { pushed_at: repo.created_at, size: 1 });\n }\n\n if (ownerType === \"User\") {\n const user = gh.users.findOneBy(\"login\", r.owner);\n if (user && !r.private) {\n gh.users.update(user.id, { public_repos: user.public_repos + 1 });\n }\n } else {\n const org = gh.orgs.findOneBy(\"login\", r.owner);\n if (org && !r.private) {\n gh.orgs.update(org.id, { public_repos: org.public_repos + 1 });\n }\n }\n }\n }\n\n if (config.oauth_apps) {\n for (const oa of config.oauth_apps) {\n const existing = gh.oauthApps.findOneBy(\"client_id\", oa.client_id);\n if (existing) continue;\n gh.oauthApps.insert({\n client_id: oa.client_id,\n client_secret: oa.client_secret,\n name: oa.name,\n redirect_uris: oa.redirect_uris,\n });\n }\n }\n\n if (config.apps) {\n for (const a of config.apps) {\n const existingApp = gh.apps.findOneBy(\"slug\", a.slug);\n if (existingApp) continue;\n\n gh.apps.insert({\n app_id: a.app_id,\n slug: a.slug,\n name: a.name,\n private_key: a.private_key,\n permissions: a.permissions ?? {},\n events: a.events ?? [],\n webhook_url: a.webhook_url ?? null,\n webhook_secret: a.webhook_secret ?? null,\n description: a.description ?? null,\n });\n\n if (a.installations) {\n for (const inst of a.installations) {\n const account =\n gh.users.findOneBy(\"login\", inst.account) ??\n gh.orgs.findOneBy(\"login\", inst.account);\n if (!account) continue;\n\n const accountType = gh.users.findOneBy(\"login\", inst.account)\n ? \"User\" as const\n : \"Organization\" as const;\n\n const repoIds: number[] = [];\n if (inst.repositories) {\n for (const repoFullName of inst.repositories) {\n const fullName = repoFullName.includes(\"/\")\n ? repoFullName\n : `${inst.account}/${repoFullName}`;\n const repo = gh.repos.findOneBy(\"full_name\", fullName);\n if (repo) repoIds.push(repo.id);\n }\n }\n\n gh.appInstallations.insert({\n installation_id: inst.installation_id,\n app_id: a.app_id,\n account_type: accountType,\n account_id: account.id,\n account_login: inst.account,\n repository_selection: inst.repository_selection ?? \"all\",\n repository_ids: repoIds,\n permissions: inst.permissions ?? a.permissions ?? {},\n events: inst.events ?? a.events ?? [],\n suspended_at: null,\n });\n }\n }\n }\n }\n}\n\nfunction findInstallationsForRepo(\n gh: GitHubStore,\n ownerLogin: string,\n repoName: string | undefined,\n event: string,\n): GitHubAppInstallation[] {\n const ownerEntity =\n gh.users.findOneBy(\"login\", ownerLogin) ?? gh.orgs.findOneBy(\"login\", ownerLogin);\n if (!ownerEntity) return [];\n\n const repoEntity = repoName\n ? gh.repos.findOneBy(\"full_name\", `${ownerLogin}/${repoName}`)\n : null;\n\n const results: GitHubAppInstallation[] = [];\n for (const inst of gh.appInstallations.all()) {\n if (inst.account_id !== ownerEntity.id) continue;\n if (inst.suspended_at) continue;\n\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n if (!ghApp) continue;\n if (!ghApp.events.includes(event) && !ghApp.events.includes(\"*\")) continue;\n\n if (repoEntity && inst.repository_selection === \"selected\") {\n if (!inst.repository_ids.includes(repoEntity.id)) continue;\n }\n\n results.push(inst);\n }\n return results;\n}\n\nfunction enrichPayloadWithInstallation(\n payload: unknown,\n installation: GitHubAppInstallation,\n): unknown {\n if (!payload || typeof payload !== \"object\") return payload;\n return {\n ...(payload as Record<string, unknown>),\n installation: {\n id: installation.installation_id,\n node_id: generateNodeId(\"Installation\", installation.installation_id),\n },\n };\n}\n\nasync function deliverToAppWebhookUrls(\n gh: GitHubStore,\n event: string,\n action: string | undefined,\n payload: unknown,\n ownerLogin: string,\n repoName: string | undefined,\n): Promise<void> {\n const installations = findInstallationsForRepo(gh, ownerLogin, repoName, event);\n\n for (const inst of installations) {\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n if (!ghApp?.webhook_url) continue;\n\n const enriched = enrichPayloadWithInstallation(payload, inst);\n const body = JSON.stringify(enriched);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Event\": event,\n \"X-GitHub-Delivery\": String(Date.now()),\n };\n if (ghApp.webhook_secret) {\n const hmac = createHmac(\"sha256\", ghApp.webhook_secret).update(body).digest(\"hex\");\n headers[\"X-Hub-Signature-256\"] = `sha256=${hmac}`;\n }\n\n try {\n await fetch(ghApp.webhook_url, {\n method: \"POST\",\n headers,\n body,\n signal: AbortSignal.timeout(10000),\n });\n } catch {\n // Best-effort delivery\n }\n }\n}\n\nexport const githubPlugin: ServicePlugin = {\n name: \"github\",\n register(app: Hono<AppEnv>, store: Store, webhooks: WebhookDispatcher, baseUrl: string, tokenMap?: TokenMap): void {\n const gh = getGitHubStore(store);\n\n const originalDispatch = webhooks.dispatch.bind(webhooks);\n webhooks.dispatch = async (\n event: string,\n action: string | undefined,\n payload: unknown,\n owner: string,\n repo?: string,\n ): Promise<void> => {\n const installations = findInstallationsForRepo(gh, owner, repo, event);\n\n const enrichedPayload = installations.length > 0\n ? enrichPayloadWithInstallation(payload, installations[0])\n : payload;\n\n await originalDispatch(event, action, enrichedPayload, owner, repo);\n await deliverToAppWebhookUrls(gh, event, action, payload, owner, repo);\n };\n\n const ctx: RouteContext = { app, store, webhooks, baseUrl, tokenMap };\n usersRoutes(ctx);\n reposRoutes(ctx);\n issuesRoutes(ctx);\n pullsRoutes(ctx);\n commentsRoutes(ctx);\n reviewsRoutes(ctx);\n labelsAndMilestonesRoutes(ctx);\n branchesAndGitRoutes(ctx);\n orgsAndTeamsRoutes(ctx);\n releasesRoutes(ctx);\n webhooksRoutes(ctx);\n searchRoutes(ctx);\n actionsRoutes(ctx);\n checksRoutes(ctx);\n rateLimitRoutes(ctx);\n metaRoutes(ctx);\n oauthRoutes(ctx);\n appsRoutes(ctx);\n },\n seed(store: Store, baseUrl: string): void {\n seedDefaults(store, baseUrl);\n },\n};\n\nexport default githubPlugin;\n","import { Store, type Collection } from \"@emulators/core\";\nimport type {\n GitHubUser, GitHubOrg, GitHubTeam, GitHubTeamMember, GitHubTeamRepo, GitHubRepo, GitHubCollaborator,\n GitHubIssue, GitHubPullRequest, GitHubLabel, GitHubMilestone, GitHubComment,\n GitHubReview, GitHubIssueEvent, GitHubBranch, GitHubBranchProtection, GitHubRef,\n GitHubCommit, GitHubTree, GitHubBlob, GitHubTag, GitHubRelease, GitHubReleaseAsset,\n GitHubWebhook, GitHubWorkflow, GitHubWorkflowRun, GitHubJob, GitHubArtifact,\n GitHubSecret, GitHubCheckRun, GitHubCheckSuite,\n GitHubOAuthApp, GitHubApp, GitHubAppInstallation, GitHubOAuthGrant,\n} from \"./entities.js\";\n\nexport interface GitHubStore {\n users: Collection<GitHubUser>;\n orgs: Collection<GitHubOrg>;\n teams: Collection<GitHubTeam>;\n teamMembers: Collection<GitHubTeamMember>;\n teamRepos: Collection<GitHubTeamRepo>;\n repos: Collection<GitHubRepo>;\n collaborators: Collection<GitHubCollaborator>;\n issues: Collection<GitHubIssue>;\n pullRequests: Collection<GitHubPullRequest>;\n labels: Collection<GitHubLabel>;\n milestones: Collection<GitHubMilestone>;\n comments: Collection<GitHubComment>;\n reviews: Collection<GitHubReview>;\n issueEvents: Collection<GitHubIssueEvent>;\n branches: Collection<GitHubBranch>;\n branchProtections: Collection<GitHubBranchProtection>;\n refs: Collection<GitHubRef>;\n commits: Collection<GitHubCommit>;\n trees: Collection<GitHubTree>;\n blobs: Collection<GitHubBlob>;\n tags: Collection<GitHubTag>;\n releases: Collection<GitHubRelease>;\n releaseAssets: Collection<GitHubReleaseAsset>;\n webhooks: Collection<GitHubWebhook>;\n workflows: Collection<GitHubWorkflow>;\n workflowRuns: Collection<GitHubWorkflowRun>;\n jobs: Collection<GitHubJob>;\n artifacts: Collection<GitHubArtifact>;\n secrets: Collection<GitHubSecret>;\n checkRuns: Collection<GitHubCheckRun>;\n checkSuites: Collection<GitHubCheckSuite>;\n oauthApps: Collection<GitHubOAuthApp>;\n apps: Collection<GitHubApp>;\n appInstallations: Collection<GitHubAppInstallation>;\n oauthGrants: Collection<GitHubOAuthGrant>;\n}\n\nexport function getGitHubStore(store: Store): GitHubStore {\n return {\n users: store.collection<GitHubUser>(\"github.users\", [\"login\"]),\n orgs: store.collection<GitHubOrg>(\"github.orgs\", [\"login\"]),\n teams: store.collection<GitHubTeam>(\"github.teams\", [\"org_id\", \"slug\"]),\n teamMembers: store.collection<GitHubTeamMember>(\"github.team_members\", [\"team_id\", \"user_id\"]),\n teamRepos: store.collection<GitHubTeamRepo>(\"github.team_repos\", [\"team_id\", \"repo_id\"]),\n repos: store.collection<GitHubRepo>(\"github.repos\", [\"owner_id\", \"full_name\"]),\n collaborators: store.collection<GitHubCollaborator>(\"github.collaborators\", [\"repo_id\", \"user_id\"]),\n issues: store.collection<GitHubIssue>(\"github.issues\", [\"repo_id\", \"number\"]),\n pullRequests: store.collection<GitHubPullRequest>(\"github.pull_requests\", [\"repo_id\", \"number\"]),\n labels: store.collection<GitHubLabel>(\"github.labels\", [\"repo_id\"]),\n milestones: store.collection<GitHubMilestone>(\"github.milestones\", [\"repo_id\", \"number\"]),\n comments: store.collection<GitHubComment>(\"github.comments\", [\"repo_id\"]),\n reviews: store.collection<GitHubReview>(\"github.reviews\", [\"repo_id\", \"pull_number\"]),\n issueEvents: store.collection<GitHubIssueEvent>(\"github.issue_events\", [\"repo_id\", \"issue_number\"]),\n branches: store.collection<GitHubBranch>(\"github.branches\", [\"repo_id\"]),\n branchProtections: store.collection<GitHubBranchProtection>(\"github.branch_protections\", [\"repo_id\"]),\n refs: store.collection<GitHubRef>(\"github.refs\", [\"repo_id\"]),\n commits: store.collection<GitHubCommit>(\"github.commits\", [\"repo_id\", \"sha\"]),\n trees: store.collection<GitHubTree>(\"github.trees\", [\"repo_id\", \"sha\"]),\n blobs: store.collection<GitHubBlob>(\"github.blobs\", [\"repo_id\", \"sha\"]),\n tags: store.collection<GitHubTag>(\"github.tags\", [\"repo_id\"]),\n releases: store.collection<GitHubRelease>(\"github.releases\", [\"repo_id\"]),\n releaseAssets: store.collection<GitHubReleaseAsset>(\"github.release_assets\", [\"release_id\", \"repo_id\"]),\n webhooks: store.collection<GitHubWebhook>(\"github.webhooks\", [\"repo_id\", \"org_id\"]),\n workflows: store.collection<GitHubWorkflow>(\"github.workflows\", [\"repo_id\"]),\n workflowRuns: store.collection<GitHubWorkflowRun>(\"github.workflow_runs\", [\"repo_id\", \"workflow_id\"]),\n jobs: store.collection<GitHubJob>(\"github.jobs\", [\"run_id\"]),\n artifacts: store.collection<GitHubArtifact>(\"github.artifacts\", [\"run_id\", \"repo_id\"]),\n secrets: store.collection<GitHubSecret>(\"github.secrets\", [\"repo_id\", \"org_id\"]),\n checkRuns: store.collection<GitHubCheckRun>(\"github.check_runs\", [\"repo_id\", \"head_sha\"]),\n checkSuites: store.collection<GitHubCheckSuite>(\"github.check_suites\", [\"repo_id\", \"head_sha\"]),\n oauthApps: store.collection<GitHubOAuthApp>(\"github.oauth_apps\", [\"client_id\"]),\n apps: store.collection<GitHubApp>(\"github.apps\", [\"slug\"]),\n appInstallations: store.collection<GitHubAppInstallation>(\"github.app_installations\", [\"app_id\", \"installation_id\"]),\n oauthGrants: store.collection<GitHubOAuthGrant>(\"github.oauth_grants\", [\"user_id\", \"client_id\"]),\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { GitHubUser, GitHubOrg, GitHubRepo, GitHubIssue, GitHubPullRequest, GitHubLabel, GitHubMilestone, GitHubComment, GitHubRelease, GitHubTeam, GitHubBranch, GitHubCommit, GitHubCheckRun, GitHubCheckSuite, GitHubReview, GitHubWorkflow, GitHubWorkflowRun, GitHubJob, GitHubArtifact, GitHubReleaseAsset, GitHubWebhook, GitHubRef, GitHubTag, GitHubBlob, GitHubTree } from \"./entities.js\";\nimport type { GitHubStore } from \"./store.js\";\n\nexport function generateNodeId(type: string, id: number): string {\n return Buffer.from(`0:${type}${id}`).toString(\"base64\").replace(/=+$/, \"\");\n}\n\nexport function generateSha(): string {\n return randomBytes(20).toString(\"hex\");\n}\n\nexport function timestamp(): string {\n return new Date().toISOString();\n}\n\nexport function userUrl(baseUrl: string, login: string) {\n return {\n url: `${baseUrl}/users/${login}`,\n html_url: `${baseUrl}/${login}`,\n repos_url: `${baseUrl}/users/${login}/repos`,\n followers_url: `${baseUrl}/users/${login}/followers`,\n following_url: `${baseUrl}/users/${login}/following{/other_user}`,\n gists_url: `${baseUrl}/users/${login}/gists{/gist_id}`,\n starred_url: `${baseUrl}/users/${login}/starred{/owner}{/repo}`,\n subscriptions_url: `${baseUrl}/users/${login}/subscriptions`,\n organizations_url: `${baseUrl}/users/${login}/orgs`,\n events_url: `${baseUrl}/users/${login}/events{/privacy}`,\n received_events_url: `${baseUrl}/users/${login}/received_events`,\n avatar_url: `${baseUrl}/avatars/u/${login}`,\n };\n}\n\nexport function formatUser(user: GitHubUser, baseUrl: string) {\n const urls = userUrl(baseUrl, user.login);\n return {\n login: user.login,\n id: user.id,\n node_id: user.node_id,\n avatar_url: urls.avatar_url,\n gravatar_id: user.gravatar_id,\n url: urls.url,\n html_url: urls.html_url,\n followers_url: urls.followers_url,\n following_url: urls.following_url,\n gists_url: urls.gists_url,\n starred_url: urls.starred_url,\n subscriptions_url: urls.subscriptions_url,\n organizations_url: urls.organizations_url,\n repos_url: urls.repos_url,\n events_url: urls.events_url,\n received_events_url: urls.received_events_url,\n type: user.type,\n site_admin: user.site_admin,\n user_view_type: \"public\",\n };\n}\n\nexport function formatUserFull(user: GitHubUser, baseUrl: string) {\n return {\n ...formatUser(user, baseUrl),\n name: user.name,\n company: user.company,\n blog: user.blog,\n location: user.location,\n email: user.email,\n hireable: user.hireable,\n bio: user.bio,\n twitter_username: user.twitter_username,\n public_repos: user.public_repos,\n public_gists: user.public_gists,\n followers: user.followers,\n following: user.following,\n created_at: user.created_at,\n updated_at: user.updated_at,\n };\n}\n\nexport function formatOwner(store: GitHubStore, ownerId: number, ownerType: string, baseUrl: string) {\n if (ownerType === \"Organization\") {\n const org = store.orgs.get(ownerId);\n if (!org) return null;\n return formatOrgBrief(org, baseUrl);\n }\n const user = store.users.get(ownerId);\n if (!user) return null;\n return formatUser(user, baseUrl);\n}\n\nexport function formatOrgBrief(org: GitHubOrg, baseUrl: string) {\n return {\n login: org.login,\n id: org.id,\n node_id: org.node_id,\n url: `${baseUrl}/orgs/${org.login}`,\n html_url: `${baseUrl}/${org.login}`,\n repos_url: `${baseUrl}/orgs/${org.login}/repos`,\n events_url: `${baseUrl}/orgs/${org.login}/events`,\n hooks_url: `${baseUrl}/orgs/${org.login}/hooks`,\n issues_url: `${baseUrl}/orgs/${org.login}/issues`,\n members_url: `${baseUrl}/orgs/${org.login}/members{/member}`,\n public_members_url: `${baseUrl}/orgs/${org.login}/public_members{/member}`,\n avatar_url: `${baseUrl}/avatars/o/${org.login}`,\n description: org.description,\n type: \"Organization\",\n site_admin: false,\n user_view_type: \"public\",\n };\n}\n\nfunction permissionsFromLevel(level: string) {\n const levels = [\"pull\", \"triage\", \"push\", \"maintain\", \"admin\"];\n const idx = levels.indexOf(level);\n return {\n admin: idx >= 4,\n maintain: idx >= 3,\n push: idx >= 2,\n triage: idx >= 1,\n pull: idx >= 0,\n };\n}\n\nfunction computeRepoPermissions(store: GitHubStore, repo: GitHubRepo, authUserId: number) {\n if (repo.owner_type === \"User\" && repo.owner_id === authUserId) {\n return { admin: true, maintain: true, push: true, triage: true, pull: true };\n }\n if (repo.owner_type === \"Organization\") {\n for (const team of store.teams.all()) {\n if (team.org_id !== repo.owner_id) continue;\n const member = store.teamMembers.findBy(\"team_id\", team.id).find((m) => m.user_id === authUserId);\n if (member) {\n return { admin: true, maintain: true, push: true, triage: true, pull: true };\n }\n }\n }\n const collab = store.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === authUserId);\n if (collab) {\n return permissionsFromLevel(collab.permission);\n }\n if (!repo.private) {\n return { admin: false, maintain: false, push: false, triage: false, pull: true };\n }\n return { admin: false, maintain: false, push: false, triage: false, pull: false };\n}\n\nexport function computeAuthorAssociation(store: GitHubStore, userId: number, repoId: number): string {\n const repo = store.repos.get(repoId);\n if (!repo) return \"NONE\";\n\n if (repo.owner_type === \"User\" && repo.owner_id === userId) return \"OWNER\";\n\n if (repo.owner_type === \"Organization\") {\n for (const team of store.teams.all()) {\n if (team.org_id !== repo.owner_id) continue;\n const member = store.teamMembers.findBy(\"team_id\", team.id).find((m) => m.user_id === userId);\n if (member) return \"MEMBER\";\n }\n }\n\n const collab = store.collaborators.findBy(\"repo_id\", repoId).find((c) => c.user_id === userId);\n if (collab) return \"COLLABORATOR\";\n\n return \"NONE\";\n}\n\nexport function formatOrgFull(org: GitHubOrg, baseUrl: string) {\n return {\n ...formatOrgBrief(org, baseUrl),\n name: org.name,\n company: org.company,\n blog: org.blog,\n location: org.location,\n email: org.email,\n twitter_username: org.twitter_username,\n is_verified: org.is_verified,\n has_organization_projects: org.has_organization_projects,\n has_repository_projects: org.has_repository_projects,\n public_repos: org.public_repos,\n public_gists: org.public_gists,\n followers: org.followers,\n following: org.following,\n created_at: org.created_at,\n updated_at: org.updated_at,\n members_can_create_repositories: org.members_can_create_repositories,\n default_repository_permission: org.default_repository_permission,\n billing_email: org.billing_email ?? null,\n };\n}\n\nexport function formatRepo(repo: GitHubRepo, store: GitHubStore, baseUrl: string, authUserId?: number) {\n const owner = formatOwner(store, repo.owner_id, repo.owner_type, baseUrl);\n const ownerLogin = owner?.login ?? \"unknown\";\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const htmlUrl = `${baseUrl}/${repo.full_name}`;\n\n return {\n id: repo.id,\n node_id: repo.node_id,\n name: repo.name,\n full_name: repo.full_name,\n private: repo.private,\n owner,\n html_url: htmlUrl,\n description: repo.description,\n fork: repo.fork,\n url: repoUrl,\n forks_url: `${repoUrl}/forks`,\n keys_url: `${repoUrl}/keys{/key_id}`,\n collaborators_url: `${repoUrl}/collaborators{/collaborator}`,\n teams_url: `${repoUrl}/teams`,\n hooks_url: `${repoUrl}/hooks`,\n issue_events_url: `${repoUrl}/issues/events{/number}`,\n events_url: `${repoUrl}/events`,\n assignees_url: `${repoUrl}/assignees{/user}`,\n branches_url: `${repoUrl}/branches{/branch}`,\n tags_url: `${repoUrl}/tags`,\n blobs_url: `${repoUrl}/git/blobs{/sha}`,\n git_tags_url: `${repoUrl}/git/tags{/sha}`,\n git_refs_url: `${repoUrl}/git/ref{/sha}`,\n trees_url: `${repoUrl}/git/trees{/sha}`,\n statuses_url: `${repoUrl}/statuses/{sha}`,\n languages_url: `${repoUrl}/languages`,\n stargazers_url: `${repoUrl}/stargazers`,\n contributors_url: `${repoUrl}/contributors`,\n subscribers_url: `${repoUrl}/subscribers`,\n subscription_url: `${repoUrl}/subscription`,\n commits_url: `${repoUrl}/commits{/sha}`,\n git_commits_url: `${repoUrl}/git/commits{/sha}`,\n comments_url: `${repoUrl}/comments{/number}`,\n issue_comment_url: `${repoUrl}/issues/comments{/number}`,\n contents_url: `${repoUrl}/contents/{+path}`,\n compare_url: `${repoUrl}/compare/{base}...{head}`,\n merges_url: `${repoUrl}/merges`,\n archive_url: `${repoUrl}/{archive_format}{/ref}`,\n downloads_url: `${repoUrl}/downloads`,\n issues_url: `${repoUrl}/issues{/number}`,\n pulls_url: `${repoUrl}/pulls{/number}`,\n milestones_url: `${repoUrl}/milestones{/number}`,\n notifications_url: `${repoUrl}/notifications{?since,all,participating}`,\n labels_url: `${repoUrl}/labels{/name}`,\n releases_url: `${repoUrl}/releases{/id}`,\n deployments_url: `${repoUrl}/deployments`,\n created_at: repo.created_at,\n updated_at: repo.updated_at,\n pushed_at: repo.pushed_at,\n git_url: `git://${baseUrl.replace(/^https?:\\/\\//, \"\")}/${repo.full_name}.git`,\n ssh_url: `git@${baseUrl.replace(/^https?:\\/\\//, \"\")}:${repo.full_name}.git`,\n clone_url: `${htmlUrl}.git`,\n svn_url: htmlUrl,\n homepage: repo.homepage,\n size: repo.size,\n stargazers_count: repo.stargazers_count,\n watchers_count: repo.watchers_count,\n language: repo.language,\n has_issues: repo.has_issues,\n has_projects: repo.has_projects,\n has_downloads: repo.has_downloads,\n has_wiki: repo.has_wiki,\n has_pages: repo.has_pages,\n has_discussions: repo.has_discussions,\n forks_count: repo.forks_count,\n mirror_url: null,\n archived: repo.archived,\n disabled: repo.disabled,\n open_issues_count: repo.open_issues_count,\n license: repo.license,\n allow_forking: repo.allow_forking,\n is_template: repo.is_template,\n topics: repo.topics,\n visibility: repo.visibility,\n forks: repo.forks_count,\n open_issues: repo.open_issues_count,\n watchers: repo.watchers_count,\n default_branch: repo.default_branch,\n permissions:\n authUserId !== undefined\n ? computeRepoPermissions(store, repo, authUserId)\n : {\n admin: true,\n maintain: true,\n push: true,\n triage: true,\n pull: true,\n },\n allow_rebase_merge: repo.allow_rebase_merge,\n allow_squash_merge: repo.allow_squash_merge,\n allow_merge_commit: repo.allow_merge_commit,\n allow_auto_merge: repo.allow_auto_merge,\n delete_branch_on_merge: repo.delete_branch_on_merge,\n };\n}\n\nexport function formatIssue(\n issue: GitHubIssue,\n store: GitHubStore,\n baseUrl: string\n) {\n const repo = store.repos.get(issue.repo_id);\n if (!repo) return null;\n const user = store.users.get(issue.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n\n const labels = issue.label_ids\n .map((id) => store.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n\n const assignees = issue.assignee_ids\n .map((id) => store.users.get(id))\n .filter(Boolean)\n .map((u) => formatUser(u!, baseUrl));\n\n const milestone = issue.milestone_id ? store.milestones.get(issue.milestone_id) : null;\n const closedBy = issue.closed_by_id ? store.users.get(issue.closed_by_id) : null;\n\n return {\n url: `${repoUrl}/issues/${issue.number}`,\n repository_url: repoUrl,\n labels_url: `${repoUrl}/issues/${issue.number}/labels{/name}`,\n comments_url: `${repoUrl}/issues/${issue.number}/comments`,\n events_url: `${repoUrl}/issues/${issue.number}/events`,\n html_url: `${baseUrl}/${repo.full_name}/issues/${issue.number}`,\n id: issue.id,\n node_id: issue.node_id,\n number: issue.number,\n title: issue.title,\n user: user ? formatUser(user, baseUrl) : null,\n labels,\n state: issue.state,\n state_reason: issue.state_reason,\n locked: issue.locked,\n active_lock_reason: issue.active_lock_reason,\n assignee: assignees[0] ?? null,\n assignees,\n milestone: milestone ? formatMilestone(milestone, repo, store, baseUrl) : null,\n comments: issue.comments,\n created_at: issue.created_at,\n updated_at: issue.updated_at,\n closed_at: issue.closed_at,\n closed_by: closedBy ? formatUser(closedBy, baseUrl) : null,\n body: issue.body,\n reactions: defaultReactions(`${repoUrl}/issues/${issue.number}`),\n timeline_url: `${repoUrl}/issues/${issue.number}/timeline`,\n performed_via_github_app: null,\n author_association: computeAuthorAssociation(store, issue.user_id, issue.repo_id),\n };\n}\n\nexport function formatPullRequest(\n pr: GitHubPullRequest,\n store: GitHubStore,\n baseUrl: string\n) {\n const repo = store.repos.get(pr.repo_id);\n if (!repo) return null;\n const user = store.users.get(pr.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const headRepo = store.repos.get(pr.head_repo_id);\n const baseRepo = store.repos.get(pr.base_repo_id);\n\n const labels = pr.label_ids\n .map((id) => store.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n\n const assignees = pr.assignee_ids\n .map((id) => store.users.get(id))\n .filter(Boolean)\n .map((u) => formatUser(u!, baseUrl));\n\n const requestedReviewers = pr.requested_reviewer_ids\n .map((id) => store.users.get(id))\n .filter(Boolean)\n .map((u) => formatUser(u!, baseUrl));\n\n const requestedTeams = pr.requested_team_ids\n .map((id) => store.teams.get(id))\n .filter(Boolean)\n .map((t) => formatTeamBrief(t!, store, baseUrl));\n\n const milestone = pr.milestone_id ? store.milestones.get(pr.milestone_id) : null;\n const mergedBy = pr.merged_by_id ? store.users.get(pr.merged_by_id) : null;\n\n return {\n url: `${repoUrl}/pulls/${pr.number}`,\n id: pr.id,\n node_id: pr.node_id,\n html_url: `${baseUrl}/${repo.full_name}/pull/${pr.number}`,\n diff_url: `${baseUrl}/${repo.full_name}/pull/${pr.number}.diff`,\n patch_url: `${baseUrl}/${repo.full_name}/pull/${pr.number}.patch`,\n issue_url: `${repoUrl}/issues/${pr.number}`,\n number: pr.number,\n state: pr.state,\n locked: pr.locked,\n title: pr.title,\n user: user ? formatUser(user, baseUrl) : null,\n body: pr.body,\n created_at: pr.created_at,\n updated_at: pr.updated_at,\n closed_at: pr.closed_at,\n merged_at: pr.merged_at,\n merge_commit_sha: pr.merge_commit_sha,\n assignee: assignees[0] ?? null,\n assignees,\n requested_reviewers: requestedReviewers,\n requested_teams: requestedTeams,\n labels,\n milestone: milestone ? formatMilestone(milestone, repo, store, baseUrl) : null,\n draft: pr.draft,\n commits_url: `${repoUrl}/pulls/${pr.number}/commits`,\n review_comments_url: `${repoUrl}/pulls/${pr.number}/comments`,\n review_comment_url: `${repoUrl}/pulls/comments{/number}`,\n comments_url: `${repoUrl}/issues/${pr.number}/comments`,\n statuses_url: `${repoUrl}/statuses/${pr.head_sha}`,\n head: {\n label: `${headRepo?.full_name?.split(\"/\")[0] ?? \"unknown\"}:${pr.head_ref}`,\n ref: pr.head_ref,\n sha: pr.head_sha,\n user: headRepo ? formatOwner(store, headRepo.owner_id, headRepo.owner_type, baseUrl) : null,\n repo: headRepo ? formatRepo(headRepo, store, baseUrl) : null,\n },\n base: {\n label: `${baseRepo?.full_name?.split(\"/\")[0] ?? \"unknown\"}:${pr.base_ref}`,\n ref: pr.base_ref,\n sha: pr.base_sha,\n user: baseRepo ? formatOwner(store, baseRepo.owner_id, baseRepo.owner_type, baseUrl) : null,\n repo: baseRepo ? formatRepo(baseRepo, store, baseUrl) : null,\n },\n _links: {\n self: { href: `${repoUrl}/pulls/${pr.number}` },\n html: { href: `${baseUrl}/${repo.full_name}/pull/${pr.number}` },\n issue: { href: `${repoUrl}/issues/${pr.number}` },\n comments: { href: `${repoUrl}/issues/${pr.number}/comments` },\n review_comments: { href: `${repoUrl}/pulls/${pr.number}/comments` },\n review_comment: { href: `${repoUrl}/pulls/comments{/number}` },\n commits: { href: `${repoUrl}/pulls/${pr.number}/commits` },\n statuses: { href: `${repoUrl}/statuses/${pr.head_sha}` },\n },\n author_association: computeAuthorAssociation(store, pr.user_id, pr.repo_id),\n auto_merge: pr.auto_merge,\n merged: pr.merged,\n mergeable: pr.mergeable,\n rebaseable: true,\n mergeable_state: pr.mergeable_state,\n merged_by: mergedBy ? formatUser(mergedBy, baseUrl) : null,\n comments: pr.comments,\n review_comments: pr.review_comments,\n maintainer_can_modify: true,\n commits: pr.commits,\n additions: pr.additions,\n deletions: pr.deletions,\n changed_files: pr.changed_files,\n };\n}\n\nexport function formatLabel(label: GitHubLabel, repo: GitHubRepo, baseUrl: string) {\n return {\n id: label.id,\n node_id: label.node_id,\n url: `${baseUrl}/repos/${repo.full_name}/labels/${encodeURIComponent(label.name)}`,\n name: label.name,\n description: label.description,\n color: label.color,\n default: label.default,\n };\n}\n\nexport function formatMilestone(\n m: GitHubMilestone,\n repo: GitHubRepo,\n store: GitHubStore,\n baseUrl: string\n) {\n const creator = store.users.get(m.creator_id);\n return {\n url: `${baseUrl}/repos/${repo.full_name}/milestones/${m.number}`,\n html_url: `${baseUrl}/${repo.full_name}/milestone/${m.number}`,\n labels_url: `${baseUrl}/repos/${repo.full_name}/milestones/${m.number}/labels`,\n id: m.id,\n node_id: m.node_id,\n number: m.number,\n title: m.title,\n description: m.description,\n creator: creator ? formatUser(creator, baseUrl) : null,\n open_issues: m.open_issues,\n closed_issues: m.closed_issues,\n state: m.state,\n created_at: m.created_at,\n updated_at: m.updated_at,\n due_on: m.due_on,\n closed_at: m.closed_at,\n };\n}\n\nexport function formatComment(\n comment: GitHubComment,\n store: GitHubStore,\n baseUrl: string\n) {\n const repo = store.repos.get(comment.repo_id);\n if (!repo) return null;\n const user = store.users.get(comment.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n\n if (comment.comment_type === \"issue\") {\n return {\n url: `${repoUrl}/issues/comments/${comment.id}`,\n html_url: `${baseUrl}/${repo.full_name}/issues/${comment.issue_number}#issuecomment-${comment.id}`,\n issue_url: `${repoUrl}/issues/${comment.issue_number}`,\n id: comment.id,\n node_id: comment.node_id,\n user: user ? formatUser(user, baseUrl) : null,\n created_at: comment.created_at,\n updated_at: comment.updated_at,\n author_association: computeAuthorAssociation(store, comment.user_id, comment.repo_id),\n body: comment.body,\n reactions: defaultReactions(`${repoUrl}/issues/comments/${comment.id}`),\n performed_via_github_app: null,\n };\n }\n\n if (comment.comment_type === \"review\") {\n return {\n url: `${repoUrl}/pulls/comments/${comment.id}`,\n html_url: `${baseUrl}/${repo.full_name}/pull/${comment.pull_number}#discussion_r${comment.id}`,\n pull_request_url: `${repoUrl}/pulls/${comment.pull_number}`,\n id: comment.id,\n node_id: comment.node_id,\n diff_hunk: \"\",\n path: comment.path ?? \"\",\n position: comment.position,\n original_position: comment.position,\n commit_id: comment.commit_sha ?? \"\",\n original_commit_id: comment.commit_sha ?? \"\",\n in_reply_to_id: comment.in_reply_to_id,\n user: user ? formatUser(user, baseUrl) : null,\n body: comment.body,\n created_at: comment.created_at,\n updated_at: comment.updated_at,\n author_association: computeAuthorAssociation(store, comment.user_id, comment.repo_id),\n reactions: defaultReactions(`${repoUrl}/pulls/comments/${comment.id}`),\n line: comment.line,\n side: comment.side ?? \"RIGHT\",\n subject_type: comment.subject_type ?? \"line\",\n pull_request_review_id: comment.review_id,\n };\n }\n\n return {\n url: `${repoUrl}/comments/${comment.id}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${comment.commit_sha}#commitcomment-${comment.id}`,\n id: comment.id,\n node_id: comment.node_id,\n user: user ? formatUser(user, baseUrl) : null,\n body: comment.body,\n path: comment.path,\n position: comment.position,\n line: comment.line,\n commit_id: comment.commit_sha,\n created_at: comment.created_at,\n updated_at: comment.updated_at,\n author_association: computeAuthorAssociation(store, comment.user_id, comment.repo_id),\n reactions: defaultReactions(`${repoUrl}/comments/${comment.id}`),\n };\n}\n\nexport function formatReview(\n review: GitHubReview,\n store: GitHubStore,\n baseUrl: string\n) {\n const repo = store.repos.get(review.repo_id);\n if (!repo) return null;\n const user = store.users.get(review.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n\n return {\n id: review.id,\n node_id: review.node_id,\n user: user ? formatUser(user, baseUrl) : null,\n body: review.body ?? \"\",\n state: review.state,\n html_url: `${baseUrl}/${repo.full_name}/pull/${review.pull_number}#pullrequestreview-${review.id}`,\n pull_request_url: `${repoUrl}/pulls/${review.pull_number}`,\n _links: {\n html: { href: `${baseUrl}/${repo.full_name}/pull/${review.pull_number}#pullrequestreview-${review.id}` },\n pull_request: { href: `${repoUrl}/pulls/${review.pull_number}` },\n },\n submitted_at: review.submitted_at,\n commit_id: review.commit_id,\n author_association: computeAuthorAssociation(store, review.user_id, review.repo_id),\n created_at: review.created_at,\n updated_at: review.updated_at,\n };\n}\n\nexport function formatTeamBrief(team: GitHubTeam, store: GitHubStore, baseUrl: string) {\n const org = store.orgs.get(team.org_id);\n return {\n id: team.id,\n node_id: team.node_id,\n url: `${baseUrl}/teams/${team.id}`,\n html_url: `${baseUrl}/orgs/${org?.login}/teams/${team.slug}`,\n name: team.name,\n slug: team.slug,\n description: team.description,\n privacy: team.privacy,\n permission: team.permission,\n members_url: `${baseUrl}/teams/${team.id}/members{/member}`,\n repositories_url: `${baseUrl}/teams/${team.id}/repos`,\n };\n}\n\nexport function formatBranch(branch: GitHubBranch, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n name: branch.name,\n commit: {\n sha: branch.sha,\n url: `${repoUrl}/commits/${branch.sha}`,\n },\n protected: branch.protected,\n protection_url: `${repoUrl}/branches/${branch.name}/protection`,\n };\n}\n\nexport function formatRelease(\n release: GitHubRelease,\n store: GitHubStore,\n baseUrl: string\n) {\n const repo = store.repos.get(release.repo_id);\n if (!repo) return null;\n const author = store.users.get(release.author_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const assets = store.releaseAssets.findBy(\"release_id\", release.id);\n\n return {\n url: `${repoUrl}/releases/${release.id}`,\n html_url: `${baseUrl}/${repo.full_name}/releases/tag/${release.tag_name}`,\n assets_url: `${repoUrl}/releases/${release.id}/assets`,\n upload_url: `${repoUrl}/releases/${release.id}/assets{?name,label}`,\n tarball_url: `${repoUrl}/tarball/${release.tag_name}`,\n zipball_url: `${repoUrl}/zipball/${release.tag_name}`,\n id: release.id,\n node_id: release.node_id,\n tag_name: release.tag_name,\n target_commitish: release.target_commitish,\n name: release.name,\n draft: release.draft,\n prerelease: release.prerelease,\n created_at: release.created_at,\n published_at: release.published_at,\n author: author ? formatUser(author, baseUrl) : null,\n assets: assets.map((a) => formatReleaseAsset(a, repo, baseUrl)),\n body: release.body,\n };\n}\n\nexport function formatReleaseAsset(asset: GitHubReleaseAsset, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const uploader = null;\n return {\n url: `${repoUrl}/releases/assets/${asset.id}`,\n id: asset.id,\n node_id: asset.node_id,\n name: asset.name,\n label: asset.label,\n uploader,\n content_type: asset.content_type,\n state: asset.state,\n size: asset.size,\n download_count: asset.download_count,\n created_at: asset.created_at,\n updated_at: asset.updated_at,\n browser_download_url: `${baseUrl}/${repo.full_name}/releases/download/${asset.name}`,\n };\n}\n\nexport function formatWebhook(wh: GitHubWebhook, baseUrl: string, ownerPath: string) {\n const pathPrefix = wh.repo_id != null ? `repos/${ownerPath}` : `orgs/${ownerPath}`;\n return {\n type: wh.repo_id ? \"Repository\" : \"Organization\",\n id: wh.id,\n name: wh.name,\n active: wh.active,\n events: wh.events,\n config: {\n content_type: wh.config.content_type,\n insecure_ssl: wh.config.insecure_ssl,\n url: wh.config.url,\n },\n updated_at: wh.updated_at,\n created_at: wh.created_at,\n url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}`,\n test_url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}/tests`,\n ping_url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}/pings`,\n deliveries_url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}/deliveries`,\n last_response: wh.last_response,\n };\n}\n\nfunction defaultReactions(url: string) {\n return {\n url: `${url}/reactions`,\n total_count: 0,\n \"+1\": 0,\n \"-1\": 0,\n laugh: 0,\n hooray: 0,\n confused: 0,\n heart: 0,\n rocket: 0,\n eyes: 0,\n };\n}\n\nexport function lookupRepo(store: GitHubStore, owner: string, repoName: string) {\n const fullName = `${owner}/${repoName}`;\n return store.repos.findOneBy(\"full_name\", fullName);\n}\n\nexport function lookupOwner(store: GitHubStore, login: string) {\n const user = store.users.findOneBy(\"login\", login);\n if (user) return { type: \"User\" as const, id: user.id, login: user.login };\n const org = store.orgs.findOneBy(\"login\", login);\n if (org) return { type: \"Organization\" as const, id: org.id, login: org.login };\n return null;\n}\n\nexport function getNextIssueNumber(store: GitHubStore, repoId: number): number {\n const issues = store.issues.findBy(\"repo_id\", repoId);\n const prs = store.pullRequests.findBy(\"repo_id\", repoId);\n const maxIssue = issues.reduce((max, i) => Math.max(max, i.number), 0);\n const maxPr = prs.reduce((max, p) => Math.max(max, p.number), 0);\n return Math.max(maxIssue, maxPr) + 1;\n}\n\nexport function getNextMilestoneNumber(store: GitHubStore, repoId: number): number {\n const milestones = store.milestones.findBy(\"repo_id\", repoId);\n return milestones.reduce((max, m) => Math.max(max, m.number), 0) + 1;\n}\n","export interface Entity {\n id: number;\n created_at: string;\n updated_at: string;\n}\n\nexport type InsertInput<T extends Entity> = Omit<T, \"id\" | \"created_at\" | \"updated_at\"> & { id?: number };\n\nexport type FilterFn<T> = (item: T) => boolean;\nexport type SortFn<T> = (a: T, b: T) => number;\n\nexport interface QueryOptions<T> {\n filter?: FilterFn<T>;\n sort?: SortFn<T>;\n page?: number;\n per_page?: number;\n}\n\nexport interface PaginatedResult<T> {\n items: T[];\n total_count: number;\n page: number;\n per_page: number;\n has_next: boolean;\n has_prev: boolean;\n}\n\nexport interface CollectionSnapshot<T extends Entity = Entity> {\n items: T[];\n autoId: number;\n indexFields: string[];\n}\n\nexport interface StoreSnapshot {\n collections: Record<string, CollectionSnapshot>;\n data: Record<string, unknown>;\n}\n\nexport function serializeValue(value: unknown): unknown {\n if (value instanceof Map) {\n return { __type: \"Map\" as const, entries: [...value.entries()].map(([k, v]) => [k, serializeValue(v)]) };\n }\n if (value instanceof Set) {\n return { __type: \"Set\" as const, values: [...value.values()] };\n }\n return value;\n}\n\nexport function deserializeValue(value: unknown): unknown {\n if (value !== null && typeof value === \"object\" && \"__type\" in value) {\n const tagged = value as Record<string, unknown>;\n if (tagged.__type === \"Map\") {\n const entries = tagged.entries as [unknown, unknown][];\n return new Map(entries.map(([k, v]) => [k, deserializeValue(v)]));\n }\n if (tagged.__type === \"Set\") {\n return new Set(tagged.values as unknown[]);\n }\n }\n return value;\n}\n\nexport class Collection<T extends Entity> {\n private items = new Map<number, T>();\n private indexes = new Map<string, Map<string | number, Set<number>>>();\n private autoId = 1;\n readonly fieldNames: string[];\n\n constructor(private indexFields: (keyof T)[] = []) {\n this.fieldNames = indexFields.map(String).sort();\n for (const field of indexFields) {\n this.indexes.set(String(field), new Map());\n }\n }\n\n private addToIndex(item: T): void {\n for (const field of this.indexFields) {\n const value = item[field];\n if (value === undefined || value === null) continue;\n const indexMap = this.indexes.get(String(field))!;\n const key = String(value);\n if (!indexMap.has(key)) {\n indexMap.set(key, new Set());\n }\n indexMap.get(key)!.add(item.id);\n }\n }\n\n private removeFromIndex(item: T): void {\n for (const field of this.indexFields) {\n const value = item[field];\n if (value === undefined || value === null) continue;\n const indexMap = this.indexes.get(String(field))!;\n const key = String(value);\n indexMap.get(key)?.delete(item.id);\n }\n }\n\n insert(data: InsertInput<T>): T {\n const now = new Date().toISOString();\n const explicitId = data.id != null && data.id > 0 ? data.id : undefined;\n const id = explicitId ?? this.autoId++;\n if (id >= this.autoId) {\n this.autoId = id + 1;\n }\n const item = {\n ...data,\n id,\n created_at: now,\n updated_at: now,\n } as unknown as T;\n this.items.set(id, item);\n this.addToIndex(item);\n return item;\n }\n\n get(id: number): T | undefined {\n return this.items.get(id);\n }\n\n findBy(field: keyof T, value: T[keyof T] | string | number): T[] {\n if (this.indexes.has(String(field))) {\n const ids = this.indexes.get(String(field))!.get(String(value));\n if (!ids) return [];\n return Array.from(ids).map((id) => this.items.get(id)!).filter(Boolean);\n }\n return this.all().filter((item) => item[field] === value);\n }\n\n findOneBy(field: keyof T, value: T[keyof T] | string | number): T | undefined {\n return this.findBy(field, value)[0];\n }\n\n update(id: number, data: Partial<T>): T | undefined {\n const existing = this.items.get(id);\n if (!existing) return undefined;\n this.removeFromIndex(existing);\n const updated = {\n ...existing,\n ...data,\n id,\n updated_at: new Date().toISOString(),\n } as T;\n this.items.set(id, updated);\n this.addToIndex(updated);\n return updated;\n }\n\n delete(id: number): boolean {\n const existing = this.items.get(id);\n if (!existing) return false;\n this.removeFromIndex(existing);\n return this.items.delete(id);\n }\n\n all(): T[] {\n return Array.from(this.items.values());\n }\n\n query(options: QueryOptions<T> = {}): PaginatedResult<T> {\n let results = this.all();\n\n if (options.filter) {\n results = results.filter(options.filter);\n }\n\n const total_count = results.length;\n\n if (options.sort) {\n results.sort(options.sort);\n }\n\n const page = options.page ?? 1;\n const per_page = Math.min(options.per_page ?? 30, 100);\n const start = (page - 1) * per_page;\n const paged = results.slice(start, start + per_page);\n\n return {\n items: paged,\n total_count,\n page,\n per_page,\n has_next: start + per_page < total_count,\n has_prev: page > 1,\n };\n }\n\n count(filter?: FilterFn<T>): number {\n if (!filter) return this.items.size;\n return this.all().filter(filter).length;\n }\n\n clear(): void {\n this.items.clear();\n for (const indexMap of this.indexes.values()) {\n indexMap.clear();\n }\n this.autoId = 1;\n }\n\n snapshot(): CollectionSnapshot<T> {\n return {\n items: this.all(),\n autoId: this.autoId,\n indexFields: this.fieldNames,\n };\n }\n\n restore(snap: CollectionSnapshot<T>): void {\n this.clear();\n this.autoId = snap.autoId;\n for (const item of snap.items) {\n this.items.set(item.id, item);\n this.addToIndex(item);\n }\n }\n}\n\nexport class Store {\n private collections = new Map<string, Collection<any>>();\n private _data = new Map<string, unknown>();\n\n collection<T extends Entity>(name: string, indexFields: (keyof T)[] = []): Collection<T> {\n const existing = this.collections.get(name);\n if (existing) {\n if (indexFields.length > 0) {\n const requested = indexFields.map(String).sort();\n if (existing.fieldNames.length !== requested.length || existing.fieldNames.some((f, i) => f !== requested[i])) {\n throw new Error(\n `Collection \"${name}\" already exists with indexes [${existing.fieldNames}] but was requested with [${requested}]`\n );\n }\n }\n return existing as Collection<T>;\n }\n const col = new Collection<T>(indexFields);\n this.collections.set(name, col);\n return col;\n }\n\n getData<V>(key: string): V | undefined {\n return this._data.get(key) as V | undefined;\n }\n\n setData<V>(key: string, value: V): void {\n this._data.set(key, value);\n }\n\n reset(): void {\n for (const collection of this.collections.values()) {\n collection.clear();\n }\n this._data.clear();\n }\n\n snapshot(): StoreSnapshot {\n const collections: Record<string, CollectionSnapshot> = {};\n for (const [name, col] of this.collections) {\n collections[name] = col.snapshot();\n }\n const data: Record<string, unknown> = {};\n for (const [key, value] of this._data) {\n data[key] = serializeValue(value);\n }\n return { collections, data };\n }\n\n restore(snap: StoreSnapshot): void {\n const snapshotNames = new Set(Object.keys(snap.collections));\n for (const name of this.collections.keys()) {\n if (!snapshotNames.has(name)) {\n this.collections.delete(name);\n }\n }\n for (const [name, colSnap] of Object.entries(snap.collections)) {\n const indexFields = colSnap.indexFields as (keyof Entity)[];\n const col = this.collection(name, indexFields);\n col.restore(colSnap as CollectionSnapshot<any>);\n }\n this._data.clear();\n for (const [key, value] of Object.entries(snap.data)) {\n this._data.set(key, deserializeValue(value));\n }\n }\n}\n","import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { Store } from \"./store.js\";\nimport { WebhookDispatcher } from \"./webhooks.js\";\nimport { createApiErrorHandler, createErrorHandler } from \"./middleware/error-handler.js\";\nimport { authMiddleware, type AuthFallback, type TokenMap, type AppKeyResolver, type AppEnv } from \"./middleware/auth.js\";\nimport type { ServicePlugin } from \"./plugin.js\";\nimport { registerFontRoutes } from \"./fonts.js\";\n\nexport interface ServerOptions {\n port?: number;\n baseUrl?: string;\n docsUrl?: string;\n tokens?: Record<string, { login: string; id: number; scopes?: string[] }>;\n appKeyResolver?: AppKeyResolver;\n fallbackUser?: AuthFallback;\n}\n\nexport function createServer(plugin: ServicePlugin, options: ServerOptions = {}) {\n const port = options.port ?? 4000;\n const baseUrl = options.baseUrl ?? `http://localhost:${port}`;\n\n const app = new Hono<AppEnv>();\n const store = new Store();\n const webhooks = new WebhookDispatcher();\n\n const tokenMap: TokenMap = new Map();\n if (options.tokens) {\n for (const [token, user] of Object.entries(options.tokens)) {\n tokenMap.set(token, {\n login: user.login,\n id: user.id,\n scopes: user.scopes ?? [\"repo\", \"user\", \"admin:org\", \"admin:repo_hook\"],\n });\n }\n }\n\n const docsUrl = options.docsUrl ?? `https://emulate.dev/${plugin.name}`;\n\n registerFontRoutes(app);\n\n app.onError(createApiErrorHandler(docsUrl));\n app.use(\"*\", cors());\n app.use(\"*\", createErrorHandler(docsUrl));\n app.use(\"*\", authMiddleware(tokenMap, options.appKeyResolver, options.fallbackUser));\n\n const rateLimitCounters = new Map<string, { remaining: number; resetAt: number }>();\n let lastPruneAt = Math.floor(Date.now() / 1000);\n\n app.use(\"*\", async (c, next) => {\n const token = c.get(\"authToken\") ?? \"__anonymous__\";\n const now = Math.floor(Date.now() / 1000);\n\n if (now - lastPruneAt > 3600) {\n for (const [key, val] of rateLimitCounters) {\n if (val.resetAt <= now) rateLimitCounters.delete(key);\n }\n lastPruneAt = now;\n }\n\n let counter = rateLimitCounters.get(token);\n if (!counter || counter.resetAt <= now) {\n counter = { remaining: 5000, resetAt: now + 3600 };\n rateLimitCounters.set(token, counter);\n }\n\n counter.remaining = Math.max(0, counter.remaining - 1);\n\n c.header(\"X-RateLimit-Limit\", \"5000\");\n c.header(\"X-RateLimit-Remaining\", String(counter.remaining));\n c.header(\"X-RateLimit-Reset\", String(counter.resetAt));\n c.header(\"X-RateLimit-Resource\", \"core\");\n\n if (counter.remaining === 0) {\n return c.json(\n {\n message: \"API rate limit exceeded\",\n documentation_url: docsUrl,\n },\n 403\n );\n }\n\n await next();\n });\n\n plugin.register(app, store, webhooks, baseUrl, tokenMap);\n\n app.notFound((c) =>\n c.json(\n {\n message: \"Not Found\",\n documentation_url: docsUrl,\n },\n 404\n )\n );\n\n return { app, store, webhooks, port, baseUrl, tokenMap };\n}\n","import { createHmac } from \"crypto\";\n\nexport interface WebhookSubscription {\n id: number;\n url: string;\n events: string[];\n active: boolean;\n secret?: string;\n owner: string;\n repo?: string;\n}\n\nexport interface WebhookDelivery {\n id: number;\n hook_id: number;\n event: string;\n action?: string;\n payload: unknown;\n status_code: number | null;\n delivered_at: string;\n duration: number | null;\n success: boolean;\n}\n\nconst MAX_DELIVERIES = 1000;\n\nexport class WebhookDispatcher {\n private subscriptions: WebhookSubscription[] = [];\n private deliveries: WebhookDelivery[] = [];\n private subscriptionIdCounter = 1;\n private deliveryIdCounter = 1;\n\n register(sub: Omit<WebhookSubscription, \"id\"> & { id?: number }): WebhookSubscription {\n const { id: explicitId, ...rest } = sub;\n const id = explicitId !== undefined ? explicitId : this.subscriptionIdCounter++;\n if (id >= this.subscriptionIdCounter) {\n this.subscriptionIdCounter = id + 1;\n }\n const subscription: WebhookSubscription = { ...rest, id };\n this.subscriptions.push(subscription);\n return subscription;\n }\n\n unregister(id: number): boolean {\n const idx = this.subscriptions.findIndex((s) => s.id === id);\n if (idx === -1) return false;\n this.subscriptions.splice(idx, 1);\n return true;\n }\n\n getSubscription(id: number): WebhookSubscription | undefined {\n return this.subscriptions.find((s) => s.id === id);\n }\n\n getSubscriptions(owner?: string, repo?: string): WebhookSubscription[] {\n return this.subscriptions.filter((s) => {\n if (owner && s.owner !== owner) return false;\n if (repo !== undefined && s.repo !== repo) return false;\n return true;\n });\n }\n\n updateSubscription(\n id: number,\n data: Partial<Pick<WebhookSubscription, \"url\" | \"events\" | \"active\" | \"secret\">>\n ): WebhookSubscription | undefined {\n const sub = this.subscriptions.find((s) => s.id === id);\n if (!sub) return undefined;\n Object.assign(sub, data);\n return sub;\n }\n\n async dispatch(event: string, action: string | undefined, payload: unknown, owner: string, repo?: string): Promise<void> {\n const matchingSubs = this.subscriptions.filter((s) => {\n if (!s.active) return false;\n if (s.owner !== owner) return false;\n if (repo !== undefined) {\n if (s.repo !== repo) return false;\n } else if (s.repo !== undefined) {\n return false;\n }\n return (\n event === \"ping\" ||\n s.events.includes(\"*\") ||\n s.events.includes(event)\n );\n });\n\n for (const sub of matchingSubs) {\n const delivery: WebhookDelivery = {\n id: this.deliveryIdCounter++,\n hook_id: sub.id,\n event,\n action,\n payload,\n status_code: null,\n delivered_at: new Date().toISOString(),\n duration: null,\n success: false,\n };\n\n const body = JSON.stringify(payload);\n\n const signatureHeaders: Record<string, string> = {};\n if (sub.secret) {\n const hmac = createHmac(\"sha256\", sub.secret).update(body).digest(\"hex\");\n signatureHeaders[\"X-Hub-Signature-256\"] = `sha256=${hmac}`;\n }\n\n try {\n const start = Date.now();\n const response = await fetch(sub.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Event\": event,\n \"X-GitHub-Delivery\": String(delivery.id),\n ...signatureHeaders,\n },\n body,\n signal: AbortSignal.timeout(10000),\n });\n delivery.duration = Date.now() - start;\n delivery.status_code = response.status;\n delivery.success = response.ok;\n } catch {\n delivery.duration = 0;\n delivery.success = false;\n }\n\n this.deliveries.push(delivery);\n if (this.deliveries.length > MAX_DELIVERIES) {\n this.deliveries.splice(0, this.deliveries.length - MAX_DELIVERIES);\n }\n }\n }\n\n getDeliveries(hookId?: number): WebhookDelivery[] {\n if (hookId !== undefined) {\n return this.deliveries.filter((d) => d.hook_id === hookId);\n }\n return [...this.deliveries];\n }\n\n clear(): void {\n this.subscriptions.length = 0;\n this.deliveries.length = 0;\n this.subscriptionIdCounter = 1;\n this.deliveryIdCounter = 1;\n }\n}\n","import type { Context, ErrorHandler, MiddlewareHandler } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst DEFAULT_DOCS_URL = \"https://emulate.dev\";\n\nfunction getDocsUrl(c: Context): string {\n return (c.get(\"docsUrl\") as string | undefined) ?? DEFAULT_DOCS_URL;\n}\n\nfunction errorStatus(err: unknown): number {\n if (err && typeof err === \"object\" && \"status\" in err) {\n const s = (err as { status: unknown }).status;\n if (typeof s === \"number\" && Number.isFinite(s)) return s;\n }\n return 500;\n}\n\n/**\n * Use with `app.onError(...)`. Hono routes handler throws to the app error handler, not to outer middleware try/catch.\n */\nexport function createApiErrorHandler(documentationUrl?: string): ErrorHandler {\n return (err, c) => {\n if (documentationUrl) {\n c.set(\"docsUrl\", documentationUrl);\n }\n const status = errorStatus(err);\n const message = err instanceof Error ? err.message : \"Internal Server Error\";\n return c.json(\n {\n message,\n documentation_url: getDocsUrl(c),\n },\n status as ContentfulStatusCode\n );\n };\n}\n\n/** Sets `docsUrl` on the context for successful responses; register `createApiErrorHandler` for thrown `ApiError`s. */\nexport function createErrorHandler(documentationUrl?: string): MiddlewareHandler {\n return async (c, next) => {\n if (documentationUrl) {\n c.set(\"docsUrl\", documentationUrl);\n }\n await next();\n };\n}\n\nexport const errorHandler: MiddlewareHandler = createErrorHandler();\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n message: string,\n public errors?: Array<{ resource: string; field: string; code: string }>\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport function notFound(resource?: string): ApiError {\n return new ApiError(404, resource ? `${resource} not found` : \"Not Found\");\n}\n\nexport function validationError(message: string, errors?: ApiError[\"errors\"]): ApiError {\n return new ApiError(422, message, errors);\n}\n\nexport function unauthorized(): ApiError {\n return new ApiError(401, \"Requires authentication\");\n}\n\nexport function forbidden(): ApiError {\n return new ApiError(403, \"Forbidden\");\n}\n\nexport async function parseJsonBody(c: Context): Promise<Record<string, unknown>> {\n try {\n const body = await c.req.json();\n if (body && typeof body === \"object\" && !Array.isArray(body)) {\n return body as Record<string, unknown>;\n }\n return {};\n } catch {\n throw new ApiError(400, \"Problems parsing JSON\");\n }\n}\n","import type { Context, Next } from \"hono\";\nimport { jwtVerify, importPKCS8 } from \"jose\";\nimport { debug } from \"../debug.js\";\n\nexport interface AuthUser {\n login: string;\n id: number;\n scopes: string[];\n}\n\nexport interface AuthApp {\n appId: number;\n slug: string;\n name: string;\n}\n\nexport interface AuthInstallation {\n installationId: number;\n appId: number;\n permissions: Record<string, string>;\n repositoryIds: number[];\n repositorySelection: \"all\" | \"selected\";\n}\n\nexport type TokenMap = Map<string, AuthUser>;\n\nexport interface TokenEntry {\n token: string;\n login: string;\n id: number;\n scopes: string[];\n}\n\nexport function serializeTokenMap(tokenMap: TokenMap): TokenEntry[] {\n return [...tokenMap.entries()].map(([token, user]) => ({\n token,\n login: user.login,\n id: user.id,\n scopes: user.scopes,\n }));\n}\n\nexport function restoreTokenMap(tokenMap: TokenMap, tokens: TokenEntry[]): void {\n tokenMap.clear();\n for (const t of tokens) {\n tokenMap.set(t.token, { login: t.login, id: t.id, scopes: t.scopes });\n }\n}\n\nexport type AppEnv = {\n Variables: {\n authUser?: AuthUser;\n authApp?: AuthApp;\n authToken?: string;\n authScopes?: string[];\n docsUrl?: string;\n };\n};\n\nexport interface AppKeyResolver {\n (appId: number): { privateKey: string; slug: string; name: string } | null;\n}\n\nexport interface AuthFallback {\n login: string;\n id: number;\n scopes: string[];\n}\n\nexport function authMiddleware(tokens: TokenMap, appKeyResolver?: AppKeyResolver, fallbackUser?: AuthFallback) {\n return async (c: Context, next: Next) => {\n const authHeader = c.req.header(\"Authorization\");\n if (authHeader) {\n const token = authHeader.replace(/^(Bearer|token)\\s+/i, \"\").trim();\n\n if (token.startsWith(\"eyJ\") && appKeyResolver) {\n try {\n const [, payloadB64] = token.split(\".\");\n const payload = JSON.parse(\n Buffer.from(payloadB64, \"base64url\").toString()\n );\n const appId = typeof payload.iss === \"string\" ? parseInt(payload.iss, 10) : payload.iss;\n\n if (typeof appId === \"number\" && !isNaN(appId)) {\n const appInfo = appKeyResolver(appId);\n if (appInfo) {\n const key = await importPKCS8(appInfo.privateKey, \"RS256\");\n await jwtVerify(token, key, { algorithms: [\"RS256\"] });\n c.set(\"authApp\", {\n appId,\n slug: appInfo.slug,\n name: appInfo.name,\n } satisfies AuthApp);\n }\n }\n } catch {\n // JWT verification failed\n }\n } else {\n let user = tokens.get(token);\n if (!user && fallbackUser && token.length > 0) {\n debug(\"auth\", \"fallback user for unknown token\", { login: fallbackUser.login, id: fallbackUser.id });\n user = { login: fallbackUser.login, id: fallbackUser.id, scopes: fallbackUser.scopes };\n }\n if (user) {\n c.set(\"authUser\", user);\n c.set(\"authToken\", token);\n c.set(\"authScopes\", user.scopes);\n }\n }\n }\n await next();\n };\n}\n\nexport function requireAuth() {\n return async (c: Context, next: Next) => {\n if (!c.get(\"authUser\")) {\n const docsUrl = (c.get(\"docsUrl\") as string | undefined) ?? \"https://emulate.dev\";\n return c.json(\n {\n message: \"Requires authentication\",\n documentation_url: docsUrl,\n },\n 401\n );\n }\n await next();\n };\n}\n\nexport function requireAppAuth() {\n return async (c: Context, next: Next) => {\n if (!c.get(\"authApp\")) {\n const docsUrl = (c.get(\"docsUrl\") as string | undefined) ?? \"https://emulate.dev\";\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: docsUrl,\n },\n 401\n );\n }\n await next();\n };\n}\n","const isDebug = typeof process !== \"undefined\" && (process.env.DEBUG === \"1\" || process.env.DEBUG === \"true\" || process.env.EMULATE_DEBUG === \"1\");\n\nexport function debug(label: string, ...args: unknown[]): void {\n if (isDebug) {\n console.log(`[${label}]`, ...args);\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport type { Hono } from \"hono\";\nimport type { AppEnv } from \"./middleware/auth.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst FONTS: Record<string, Buffer> = {\n \"geist-sans.woff2\": readFileSync(join(__dirname, \"fonts\", \"geist-sans.woff2\")),\n \"GeistPixel-Square.woff2\": readFileSync(join(__dirname, \"fonts\", \"GeistPixel-Square.woff2\")),\n};\n\nexport function registerFontRoutes(app: Hono<AppEnv>): void {\n app.get(\"/_emulate/fonts/:name\", (c) => {\n const name = c.req.param(\"name\");\n const buf = FONTS[name];\n if (!buf) return c.notFound();\n return new Response(buf, {\n headers: {\n \"Content-Type\": \"font/woff2\",\n \"Cache-Control\": \"public, max-age=31536000, immutable\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n });\n}\n","import type { Context } from \"hono\";\n\nexport interface PaginationParams {\n page: number;\n per_page: number;\n}\n\nexport function parsePagination(c: Context): PaginationParams {\n const page = Math.max(1, parseInt(c.req.query(\"page\") ?? \"1\", 10) || 1);\n const per_page = Math.min(100, Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30));\n return { page, per_page };\n}\n\nexport function setLinkHeader(\n c: Context,\n totalCount: number,\n page: number,\n perPage: number\n): void {\n const lastPage = Math.max(1, Math.ceil(totalCount / perPage));\n const baseUrl = new URL(c.req.url);\n const links: string[] = [];\n\n const makeLink = (p: number, rel: string) => {\n baseUrl.searchParams.set(\"page\", String(p));\n baseUrl.searchParams.set(\"per_page\", String(perPage));\n return `<${baseUrl.toString()}>; rel=\"${rel}\"`;\n };\n\n if (page < lastPage) {\n links.push(makeLink(page + 1, \"next\"));\n links.push(makeLink(lastPage, \"last\"));\n }\n if (page > 1) {\n links.push(makeLink(1, \"first\"));\n links.push(makeLink(page - 1, \"prev\"));\n }\n\n if (links.length > 0) {\n c.header(\"Link\", links.join(\", \"));\n }\n}\n","export function escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nexport function escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, \"&#39;\");\n}\n\nconst CSS = `\n@font-face{\n font-family:'Geist';font-style:normal;font-weight:100 900;font-display:swap;\n src:url('/_emulate/fonts/geist-sans.woff2') format('woff2');\n}\n@font-face{\n font-family:'Geist Pixel';font-style:normal;font-weight:400;font-display:swap;\n src:url('/_emulate/fonts/GeistPixel-Square.woff2') format('woff2');\n}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{\n font-family:'Geist',-apple-system,BlinkMacSystemFont,sans-serif;\n background:#000;color:#33ff00;min-height:100vh;\n -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;\n}\n.emu-bar{\n border-bottom:1px solid #0a3300;padding:10px 20px;\n display:flex;align-items:center;gap:10px;font-size:.8125rem;color:#1a8c00;\n}\n.emu-bar-title{font-weight:600;color:#33ff00;font-family:'Geist Pixel',monospace;}\n.emu-bar-links{margin-left:auto;display:flex;gap:16px;}\n.emu-bar-links a{\n color:#1a8c00;font-size:.75rem;text-decoration:none;transition:color .15s;\n}\n.emu-bar-links a:hover{color:#33ff00;}\n.emu-bar-links a .full{display:inline;}\n.emu-bar-links a .short{display:none;}\n@media(max-width:600px){\n .emu-bar-links a .full{display:none;}\n .emu-bar-links a .short{display:inline;}\n}\n\n.content{\n display:flex;align-items:center;justify-content:center;\n min-height:calc(100vh - 42px);padding:24px 16px;\n}\n.content-inner{width:100%;max-width:420px;}\n.card-title{\n font-family:'Geist Pixel',monospace;\n font-size:1.125rem;font-weight:600;margin-bottom:4px;color:#33ff00;\n}\n.card-subtitle{color:#1a8c00;font-size:.8125rem;margin-bottom:18px;line-height:1.45;}\n.powered-by{\n position:fixed;bottom:0;left:0;right:0;\n text-align:center;padding:12px;font-size:.6875rem;color:#0a3300;\n font-family:'Geist Pixel',monospace;\n}\n.powered-by a{color:#1a8c00;text-decoration:none;transition:color .15s;}\n.powered-by a:hover{color:#33ff00;}\n\n.error-title{\n font-family:'Geist Pixel',monospace;\n color:#ff4444;font-size:1.125rem;font-weight:600;margin-bottom:8px;\n}\n.error-msg{color:#1a8c00;font-size:.875rem;line-height:1.5;}\n.error-card{text-align:center;}\n\n.user-form{margin-bottom:8px;}\n.user-form:last-of-type{margin-bottom:0;}\n.user-btn{\n width:100%;display:flex;align-items:center;gap:12px;\n padding:10px 12px;border:1px solid #0a3300;border-radius:8px;\n background:#000;color:inherit;cursor:pointer;text-align:left;\n font:inherit;transition:border-color .15s;\n}\n.user-btn:hover{border-color:#33ff00;}\n.avatar{\n width:36px;height:36px;border-radius:50%;\n background:#0a3300;color:#33ff00;font-weight:600;font-size:.875rem;\n display:flex;align-items:center;justify-content:center;flex-shrink:0;\n font-family:'Geist Pixel',monospace;\n}\n.user-text{min-width:0;}\n.user-login{font-weight:600;font-size:.875rem;display:block;color:#33ff00;}\n.user-meta{color:#1a8c00;font-size:.75rem;margin-top:1px;}\n.user-email{font-size:.6875rem;color:#116600;word-break:break-all;margin-top:1px;}\n\n.settings-layout{\n max-width:920px;margin:0 auto;padding:28px 20px;\n display:flex;gap:28px;\n}\n.settings-sidebar{width:200px;flex-shrink:0;}\n.settings-sidebar a{\n display:block;padding:6px 10px;border-radius:6px;color:#1a8c00;\n text-decoration:none;font-size:.8125rem;transition:color .15s;\n}\n.settings-sidebar a:hover{color:#33ff00;}\n.settings-sidebar a.active{color:#33ff00;font-weight:600;}\n.settings-main{flex:1;min-width:0;}\n\n.s-card{\n padding:18px 0;margin-bottom:14px;border-bottom:1px solid #0a3300;\n}\n.s-card:last-child{border-bottom:none;}\n.s-card-header{display:flex;align-items:center;gap:14px;margin-bottom:14px;}\n.s-icon{\n width:42px;height:42px;border-radius:8px;\n background:#0a3300;display:flex;align-items:center;justify-content:center;\n font-size:1.125rem;font-weight:700;color:#116600;flex-shrink:0;\n font-family:'Geist Pixel',monospace;\n}\n.s-title{\n font-family:'Geist Pixel',monospace;\n font-size:1.25rem;font-weight:600;color:#33ff00;\n}\n.s-subtitle{font-size:.75rem;color:#1a8c00;margin-top:2px;}\n.section-heading{\n font-size:.9375rem;font-weight:600;margin-bottom:10px;color:#33ff00;\n display:flex;align-items:center;justify-content:space-between;\n}\n.perm-list{list-style:none;}\n.perm-list li{padding:5px 0;font-size:.8125rem;display:flex;align-items:center;gap:6px;color:#1a8c00;}\n.check{color:#33ff00;}\n.org-row{\n display:flex;align-items:center;gap:8px;padding:7px 0;\n border-bottom:1px solid #0a3300;font-size:.8125rem;\n}\n.org-row:last-child{border-bottom:none;}\n.org-icon{\n width:22px;height:22px;border-radius:4px;background:#0a3300;\n display:flex;align-items:center;justify-content:center;\n font-size:.625rem;font-weight:700;color:#116600;flex-shrink:0;\n font-family:'Geist Pixel',monospace;\n}\n.org-name{font-weight:600;color:#33ff00;}\n.badge{font-size:.6875rem;padding:1px 7px;border-radius:999px;font-weight:500;}\n.badge-granted{background:#0a3300;color:#33ff00;}\n.badge-denied{background:#1a0a0a;color:#ff4444;}\n.badge-requested{background:#0a3300;color:#1a8c00;}\n.btn-revoke{\n display:inline-block;padding:5px 14px;border-radius:6px;\n border:1px solid #0a3300;background:transparent;color:#ff4444;\n font-size:.75rem;font-weight:600;cursor:pointer;transition:border-color .15s;\n}\n.btn-revoke:hover{border-color:#ff4444;}\n.info-text{color:#1a8c00;font-size:.75rem;line-height:1.5;margin-top:10px;}\n.app-link{\n display:flex;align-items:center;gap:12px;padding:12px;\n border:1px solid #0a3300;border-radius:8px;background:#000;\n text-decoration:none;color:inherit;margin-bottom:8px;transition:border-color .15s;\n}\n.app-link:hover{border-color:#33ff00;}\n.app-link-name{font-weight:600;font-size:.875rem;color:#33ff00;}\n.app-link-scopes{font-size:.6875rem;color:#1a8c00;margin-top:1px;}\n.empty{color:#1a8c00;text-align:center;padding:28px 0;font-size:.875rem;}\n`;\n\nconst POWERED_BY = `<div class=\"powered-by\">Powered by <a href=\"https://emulate.dev\" target=\"_blank\" rel=\"noopener\">emulate</a></div>`;\n\nfunction emuBar(service?: string): string {\n const title = service ? `${escapeHtml(service)} Emulator` : \"Emulator\";\n return `<div class=\"emu-bar\">\n <span class=\"emu-bar-title\">${title}</span>\n <nav class=\"emu-bar-links\">\n <a href=\"https://github.com/vercel-labs/emulate/issues\" target=\"_blank\" rel=\"noopener\"><span class=\"full\">Report Issue</span><span class=\"short\">Report</span></a>\n <a href=\"https://github.com/vercel-labs/emulate\" target=\"_blank\" rel=\"noopener\"><span class=\"full\">Source Code</span><span class=\"short\">Source</span></a>\n <a href=\"https://emulate.dev\" target=\"_blank\" rel=\"noopener\"><span class=\"full\">Learn More</span><span class=\"short\">Learn</span></a>\n </nav>\n</div>`;\n}\n\nfunction head(title: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"/>\n<title>${escapeHtml(title)} | emulate</title>\n<style>${CSS}</style>\n</head>`;\n}\n\nexport function renderCardPage(\n title: string,\n subtitle: string,\n body: string,\n service?: string\n): string {\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"content\">\n <div class=\"content-inner\">\n <div class=\"card-title\">${escapeHtml(title)}</div>\n <div class=\"card-subtitle\">${subtitle}</div>\n ${body}\n </div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport function renderErrorPage(title: string, message: string, service?: string): string {\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"content\">\n <div class=\"content-inner error-card\">\n <div class=\"error-title\">${escapeHtml(title)}</div>\n <div class=\"error-msg\">${escapeHtml(message)}</div>\n </div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport function renderSettingsPage(\n title: string,\n sidebarHtml: string,\n bodyHtml: string,\n service?: string\n): string {\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"settings-layout\">\n <nav class=\"settings-sidebar\">${sidebarHtml}</nav>\n <div class=\"settings-main\">${bodyHtml}</div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport interface UserButtonOptions {\n letter: string;\n login: string;\n name?: string;\n email?: string;\n formAction: string;\n hiddenFields: Record<string, string>;\n}\n\nexport function renderUserButton(opts: UserButtonOptions): string {\n const hiddens = Object.entries(opts.hiddenFields)\n .map(([k, v]) => `<input type=\"hidden\" name=\"${escapeAttr(k)}\" value=\"${escapeAttr(v)}\"/>`)\n .join(\"\");\n\n const nameLine = opts.name\n ? `<div class=\"user-meta\">${escapeHtml(opts.name)}</div>`\n : \"\";\n const emailLine = opts.email\n ? `<div class=\"user-email\">${escapeHtml(opts.email)}</div>`\n : \"\";\n\n return `<form class=\"user-form\" method=\"post\" action=\"${escapeAttr(opts.formAction)}\">\n${hiddens}\n<button type=\"submit\" class=\"user-btn\">\n <span class=\"avatar\">${escapeHtml(opts.letter)}</span>\n <span class=\"user-text\">\n <span class=\"user-login\">${escapeHtml(opts.login)}</span>\n ${nameLine}${emailLine}\n </span>\n</button>\n</form>`;\n}\n","import { timingSafeEqual } from \"crypto\";\n\nexport function normalizeUri(uri: string): string {\n try {\n const u = new URL(uri);\n return `${u.origin}${u.pathname.replace(/\\/+$/, \"\")}`;\n } catch {\n return uri.replace(/\\/+$/, \"\").split(\"?\")[0];\n }\n}\n\nexport function matchesRedirectUri(incoming: string, registered: string[]): boolean {\n const normalized = normalizeUri(incoming);\n return registered.some((r) => normalizeUri(r) === normalized);\n}\n\nexport function constantTimeSecretEqual(a: string, b: string): boolean {\n const bufA = Buffer.from(a, \"utf-8\");\n const bufB = Buffer.from(b, \"utf-8\");\n if (bufA.length !== bufB.length) return false;\n return timingSafeEqual(bufA, bufB);\n}\n\nexport function bodyStr(v: unknown): string {\n if (typeof v === \"string\") return v;\n if (Array.isArray(v) && typeof v[0] === \"string\") return v[0];\n return \"\";\n}\n\nexport function parseCookies(header: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const part of header.split(\";\")) {\n const [k, ...v] = part.split(\"=\");\n if (k) cookies[k.trim()] = v.join(\"=\").trim();\n }\n return cookies;\n}\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nexport interface PersistenceAdapter {\n load(): Promise<string | null>;\n save(data: string): Promise<void>;\n}\n\nexport function filePersistence(path: string): PersistenceAdapter {\n return {\n async load() {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return null;\n }\n },\n async save(data: string) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, data, \"utf-8\");\n },\n };\n}\n","import type { AuthUser } from \"@emulators/core\";\nimport { notFound, unauthorized, forbidden } from \"@emulators/core\";\nimport type { GitHubStore } from \"./store.js\";\nimport type { GitHubRepo, GitHubUser } from \"./entities.js\";\n\nexport { notFound as notFoundResponse };\n\nexport function ownerLoginOf(gh: GitHubStore, repo: GitHubRepo): string {\n if (repo.owner_type === \"User\") {\n return gh.users.get(repo.owner_id)?.login ?? \"unknown\";\n }\n return gh.orgs.get(repo.owner_id)?.login ?? \"unknown\";\n}\n\nexport function isOrgMember(gh: GitHubStore, userId: number, orgId: number): boolean {\n for (const team of gh.teams.all()) {\n if (team.org_id !== orgId) continue;\n const m = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .find((x) => x.user_id === userId);\n if (m) return true;\n }\n return false;\n}\n\nexport function getActorUser(gh: GitHubStore, authUser: AuthUser): GitHubUser | undefined {\n return gh.users.findOneBy(\"login\", authUser.login);\n}\n\nexport function canAccessRepo(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): boolean {\n if (!repo.private) return true;\n if (!authUser) return false;\n const user = getActorUser(gh, authUser);\n if (!user) return false;\n if (repo.owner_type === \"User\" && repo.owner_id === user.id) return true;\n if (repo.owner_type === \"Organization\" && isOrgMember(gh, user.id, repo.owner_id)) return true;\n return Boolean(\n gh.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === user.id)\n );\n}\n\nexport function assertRepoRead(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): void {\n if (canAccessRepo(gh, authUser, repo)) return;\n if (!authUser) throw unauthorized();\n throw forbidden();\n}\n\nexport function assertAuthenticatedUser(gh: GitHubStore, authUser: AuthUser | undefined): GitHubUser {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n return user;\n}\n\nexport function hasRepoAdmin(gh: GitHubStore, user: GitHubUser, repo: GitHubRepo): boolean {\n if (repo.owner_type === \"User\" && repo.owner_id === user.id) return true;\n if (repo.owner_type === \"Organization\" && isOrgMember(gh, user.id, repo.owner_id)) return true;\n const collab = gh.collaborators\n .findBy(\"repo_id\", repo.id)\n .find((c) => c.user_id === user.id);\n return collab?.permission === \"admin\" || collab?.permission === \"maintain\";\n}\n\nexport function assertRepoAdmin(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): GitHubUser {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n if (hasRepoAdmin(gh, user, repo)) return user;\n throw forbidden();\n}\n\nexport function assertRepoWrite(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): GitHubUser {\n const user = assertAuthenticatedUser(gh, authUser);\n if (!repo.private) return user;\n if (!canAccessRepo(gh, authUser, repo)) throw forbidden();\n return user;\n}\n\nexport function assertIssueWrite(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): GitHubUser {\n const user = assertAuthenticatedUser(gh, authUser);\n if (!repo.private) return user;\n if (!canAccessRepo(gh, authUser, repo)) throw forbidden();\n return user;\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport {\n ApiError,\n parseJsonBody,\n parsePagination,\n setLinkHeader,\n unauthorized,\n} from \"@emulators/core\";\nimport { assertAuthenticatedUser, canAccessRepo, notFoundResponse } from \"../route-helpers.js\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubRepo, GitHubUser } from \"../entities.js\";\nimport { formatOrgBrief, formatRepo, formatUser, formatUserFull } from \"../helpers.js\";\n\nfunction listReposForUser(\n gh: GitHubStore,\n user: GitHubUser,\n type: \"all\" | \"owner\" | \"member\"\n): GitHubRepo[] {\n const owned = gh.repos.all().filter(\n (r) => r.owner_id === user.id && r.owner_type === \"User\"\n );\n const member = gh.collaborators\n .findBy(\"user_id\", user.id)\n .map((c) => gh.repos.get(c.repo_id))\n .filter((r): r is GitHubRepo => Boolean(r))\n .filter((r) => !(r.owner_id === user.id && r.owner_type === \"User\"));\n\n if (type === \"owner\") return owned;\n if (type === \"member\") return member;\n\n const map = new Map<number, GitHubRepo>();\n for (const r of owned) map.set(r.id, r);\n for (const r of member) map.set(r.id, r);\n return Array.from(map.values());\n}\n\nfunction sortRepos(\n repos: GitHubRepo[],\n sort: \"created\" | \"updated\" | \"pushed\" | \"full_name\",\n direction: \"asc\" | \"desc\"\n): GitHubRepo[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const sorted = [...repos];\n sorted.sort((a, b) => {\n if (sort === \"full_name\") {\n return a.full_name.localeCompare(b.full_name) * mul;\n }\n const field =\n sort === \"created\"\n ? \"created_at\"\n : sort === \"updated\"\n ? \"updated_at\"\n : \"pushed_at\";\n const av = a[field] ?? \"\";\n const bv = b[field] ?? \"\";\n if (av < bv) return -1 * mul;\n if (av > bv) return 1 * mul;\n return 0;\n });\n return sorted;\n}\n\nfunction orgsForUser(gh: GitHubStore, userId: number) {\n const memberships = gh.teamMembers.findBy(\"user_id\", userId);\n const orgIds = new Set<number>();\n for (const m of memberships) {\n const team = gh.teams.get(m.team_id);\n if (team) orgIds.add(team.org_id);\n }\n const orgs = [...orgIds]\n .map((id) => gh.orgs.get(id))\n .filter((o): o is NonNullable<typeof o> => Boolean(o));\n orgs.sort((a, b) => a.login.localeCompare(b.login));\n return orgs;\n}\n\nexport function usersRoutes({ app, store, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/user\", (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n throw unauthorized();\n }\n const user = gh.users.findOneBy(\"login\", authUser.login);\n if (!user) {\n throw notFoundResponse();\n }\n return c.json(formatUserFull(user, baseUrl));\n });\n\n app.patch(\"/user\", async (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n throw unauthorized();\n }\n const existing = gh.users.findOneBy(\"login\", authUser.login);\n if (!existing) {\n throw notFoundResponse();\n }\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubUser> = {};\n\n if (\"name\" in body) {\n if (body.name === null) patch.name = null;\n else if (typeof body.name === \"string\") patch.name = body.name;\n }\n if (\"email\" in body) {\n if (body.email === null) patch.email = null;\n else if (typeof body.email === \"string\") patch.email = body.email;\n }\n if (\"blog\" in body && typeof body.blog === \"string\") {\n patch.blog = body.blog;\n }\n if (\"twitter_username\" in body) {\n if (body.twitter_username === null) patch.twitter_username = null;\n else if (typeof body.twitter_username === \"string\") {\n patch.twitter_username = body.twitter_username;\n }\n }\n if (\"company\" in body) {\n if (body.company === null) patch.company = null;\n else if (typeof body.company === \"string\") patch.company = body.company;\n }\n if (\"location\" in body) {\n if (body.location === null) patch.location = null;\n else if (typeof body.location === \"string\") patch.location = body.location;\n }\n if (\"hireable\" in body) {\n if (body.hireable === null) patch.hireable = null;\n else if (typeof body.hireable === \"boolean\") patch.hireable = body.hireable;\n }\n if (\"bio\" in body) {\n if (body.bio === null) patch.bio = null;\n else if (typeof body.bio === \"string\") patch.bio = body.bio;\n }\n\n const updated = gh.users.update(existing.id, patch);\n if (!updated) {\n throw notFoundResponse();\n }\n return c.json(formatUserFull(updated, baseUrl));\n });\n\n app.get(\"/user/repos\", (c) => {\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n\n const typeRaw = (c.req.query(\"type\") ?? \"all\").toLowerCase();\n if (typeRaw !== \"all\" && typeRaw !== \"owner\" && typeRaw !== \"member\") {\n throw new ApiError(422, \"Invalid type parameter\");\n }\n const type = typeRaw as \"all\" | \"owner\" | \"member\";\n\n const sortRaw = (c.req.query(\"sort\") ?? \"full_name\").toLowerCase();\n if (\n sortRaw !== \"created\" &&\n sortRaw !== \"updated\" &&\n sortRaw !== \"pushed\" &&\n sortRaw !== \"full_name\"\n ) {\n throw new ApiError(422, \"Invalid sort parameter\");\n }\n const sort = sortRaw as \"created\" | \"updated\" | \"pushed\" | \"full_name\";\n\n const direction =\n (c.req.query(\"direction\")?.toLowerCase() as \"asc\" | \"desc\" | undefined) ??\n (sort === \"full_name\" ? \"asc\" : \"desc\");\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw new ApiError(422, \"Invalid direction parameter\");\n }\n\n const { page, per_page } = parsePagination(c);\n const allRepos = sortRepos(listReposForUser(gh, user, type), sort, direction).filter((r) =>\n canAccessRepo(gh, authUser, r)\n );\n const total = allRepos.length;\n const start = (page - 1) * per_page;\n const items = allRepos.slice(start, start + per_page).map((r) => formatRepo(r, gh, baseUrl));\n\n setLinkHeader(c, total, page, per_page);\n return c.json(items);\n });\n\n app.get(\"/users\", (c) => {\n const since = Math.max(0, parseInt(c.req.query(\"since\") ?? \"0\", 10) || 0);\n const perPage = Math.min(\n 100,\n Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30)\n );\n\n const ordered = gh.users\n .all()\n .filter((u) => u.id > since)\n .sort((a, b) => a.id - b.id);\n const page = ordered.slice(0, perPage);\n\n if (page.length === perPage && ordered.length > perPage) {\n const lastId = page[page.length - 1]!.id;\n const nextUrl = new URL(c.req.url);\n nextUrl.searchParams.set(\"since\", String(lastId));\n nextUrl.searchParams.set(\"per_page\", String(perPage));\n c.header(\"Link\", `<${nextUrl.toString()}>; rel=\"next\"`);\n }\n\n return c.json(page.map((u) => formatUser(u, baseUrl)));\n });\n\n app.get(\"/users/:username/repos\", (c) => {\n const username = c.req.param(\"username\")!;\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n throw notFoundResponse();\n }\n\n const typeRaw = (c.req.query(\"type\") ?? \"owner\").toLowerCase();\n if (typeRaw !== \"all\" && typeRaw !== \"owner\" && typeRaw !== \"member\") {\n throw new ApiError(422, \"Invalid type parameter\");\n }\n const type = typeRaw as \"all\" | \"owner\" | \"member\";\n\n const sortRaw = (c.req.query(\"sort\") ?? \"full_name\").toLowerCase();\n if (\n sortRaw !== \"created\" &&\n sortRaw !== \"updated\" &&\n sortRaw !== \"pushed\" &&\n sortRaw !== \"full_name\"\n ) {\n throw new ApiError(422, \"Invalid sort parameter\");\n }\n const sort = sortRaw as \"created\" | \"updated\" | \"pushed\" | \"full_name\";\n\n const direction =\n (c.req.query(\"direction\")?.toLowerCase() as \"asc\" | \"desc\" | undefined) ??\n (sort === \"full_name\" ? \"asc\" : \"desc\");\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw new ApiError(422, \"Invalid direction parameter\");\n }\n\n const { page, per_page } = parsePagination(c);\n const allRepos = sortRepos(listReposForUser(gh, user, type), sort, direction);\n const total = allRepos.length;\n const start = (page - 1) * per_page;\n const items = allRepos.slice(start, start + per_page).map((r) => formatRepo(r, gh, baseUrl));\n\n setLinkHeader(c, total, page, per_page);\n return c.json(items);\n });\n\n app.get(\"/users/:username/orgs\", (c) => {\n const username = c.req.param(\"username\")!;\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n throw notFoundResponse();\n }\n\n const orgs = orgsForUser(gh, user.id);\n return c.json(orgs.map((o) => formatOrgBrief(o, baseUrl)));\n });\n\n app.get(\"/users/:username/followers\", (c) => {\n const username = c.req.param(\"username\")!;\n if (!gh.users.findOneBy(\"login\", username)) {\n throw notFoundResponse();\n }\n\n const { page, per_page } = parsePagination(c);\n setLinkHeader(c, 0, page, per_page);\n return c.json([]);\n });\n\n app.get(\"/users/:username/following\", (c) => {\n const username = c.req.param(\"username\")!;\n if (!gh.users.findOneBy(\"login\", username)) {\n throw notFoundResponse();\n }\n\n const { page, per_page } = parsePagination(c);\n setLinkHeader(c, 0, page, per_page);\n return c.json([]);\n });\n\n app.get(\"/users/:username/hovercard\", (c) => {\n const username = c.req.param(\"username\")!;\n if (!gh.users.findOneBy(\"login\", username)) {\n throw notFoundResponse();\n }\n\n return c.json({ contexts: [] });\n });\n\n app.get(\"/users/:username\", (c) => {\n const username = c.req.param(\"username\")!;\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n throw notFoundResponse();\n }\n return c.json(formatUserFull(user, baseUrl));\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport {\n ApiError,\n forbidden,\n parseJsonBody,\n parsePagination,\n setLinkHeader,\n} from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoRead,\n hasRepoAdmin,\n isOrgMember,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBlob,\n GitHubBranch,\n GitHubCollaborator,\n GitHubCommit,\n GitHubRef,\n GitHubRepo,\n GitHubTag,\n GitHubTree,\n GitHubUser,\n} from \"../entities.js\";\nimport type { Collection, Entity } from \"@emulators/core\";\nimport {\n formatRepo,\n formatUser,\n generateNodeId,\n generateSha,\n lookupOwner,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\n\nconst LICENSE_TEMPLATES: Record<string, { key: string; name: string; spdx_id: string }> = {\n mit: { key: \"mit\", name: \"MIT License\", spdx_id: \"MIT\" },\n \"apache-2.0\": { key: \"apache-2.0\", name: \"Apache License 2.0\", spdx_id: \"Apache-2.0\" },\n \"gpl-3.0\": { key: \"gpl-3.0\", name: \"GNU General Public License v3.0\", spdx_id: \"GPL-3.0\" },\n \"bsd-3-clause\": {\n key: \"bsd-3-clause\",\n name: 'BSD 3-Clause \"New\" or \"Revised\" License',\n spdx_id: \"BSD-3-Clause\",\n },\n unlicense: { key: \"unlicense\", name: \"The Unlicense\", spdx_id: \"Unlicense\" },\n};\n\nfunction resolveLicenseTemplate(template: string) {\n const key = template.trim().toLowerCase();\n return LICENSE_TEMPLATES[key] ?? null;\n}\n\nfunction validateRepoName(name: unknown): string {\n if (typeof name !== \"string\" || !name.trim()) {\n throw new ApiError(422, \"Invalid repository name\");\n }\n const trimmed = name.trim();\n if (trimmed.length > 100 || !/^[a-zA-Z0-9._-]+$/.test(trimmed)) {\n throw new ApiError(422, \"Invalid repository name\");\n }\n return trimmed;\n}\n\nfunction seedInitialGit(\n gh: GitHubStore,\n repo: GitHubRepo,\n actor: GitHubUser | null,\n readmeTitle?: string\n) {\n const repoId = repo.id;\n const readme = `# ${readmeTitle ?? repo.name}\\n`;\n const size = Buffer.byteLength(readme, \"utf8\");\n\n const blob = gh.blobs.insert({\n repo_id: repoId,\n sha: generateSha(),\n node_id: \"\",\n content: readme,\n encoding: \"utf-8\",\n size,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n\n const tree = gh.trees.insert({\n repo_id: repoId,\n sha: generateSha(),\n node_id: \"\",\n tree: [{ path: \"README.md\", mode: \"100644\", type: \"blob\", sha: blob.sha }],\n truncated: false,\n } as Omit<GitHubTree, \"id\" | \"created_at\" | \"updated_at\">);\n gh.trees.update(tree.id, { node_id: generateNodeId(\"Tree\", tree.id) });\n\n const authorName = actor?.name ?? actor?.login ?? \"User\";\n const login = actor?.login ?? \"user\";\n const email = actor?.email ?? `${login}@users.noreply.github.com`;\n const now = timestamp();\n\n const commit = gh.commits.insert({\n repo_id: repoId,\n sha: generateSha(),\n node_id: \"\",\n message: \"Initial commit\",\n author_name: authorName,\n author_email: email,\n author_date: now,\n committer_name: authorName,\n committer_email: email,\n committer_date: now,\n tree_sha: tree.sha,\n parent_shas: [],\n user_id: actor?.id ?? null,\n } as Omit<GitHubCommit, \"id\" | \"created_at\" | \"updated_at\">);\n gh.commits.update(commit.id, { node_id: generateNodeId(\"Commit\", commit.id) });\n\n gh.branches.insert({\n repo_id: repoId,\n name: repo.default_branch,\n sha: commit.sha,\n protected: false,\n } as Omit<GitHubBranch, \"id\" | \"created_at\" | \"updated_at\">);\n\n const ref = gh.refs.insert({\n repo_id: repoId,\n ref: `refs/heads/${repo.default_branch}`,\n sha: commit.sha,\n node_id: \"\",\n } as Omit<GitHubRef, \"id\" | \"created_at\" | \"updated_at\">);\n gh.refs.update(ref.id, { node_id: generateNodeId(\"Ref\", ref.id) });\n\n gh.repos.update(repo.id, {\n size,\n pushed_at: now,\n language: \"Markdown\",\n languages: { Markdown: size },\n });\n}\n\nfunction bumpPublicRepos(gh: GitHubStore, ownerId: number, ownerType: \"User\" | \"Organization\", delta: number) {\n if (delta === 0) return;\n if (ownerType === \"User\") {\n const u = gh.users.get(ownerId);\n if (u) gh.users.update(ownerId, { public_repos: Math.max(0, u.public_repos + delta) });\n } else {\n const o = gh.orgs.get(ownerId);\n if (o) gh.orgs.update(ownerId, { public_repos: Math.max(0, o.public_repos + delta) });\n }\n}\n\ntype CreateRepoRecordParams = {\n name: unknown;\n description: string | null;\n private: boolean;\n homepage: string | null;\n has_issues: boolean;\n has_wiki: boolean;\n has_projects: boolean;\n auto_init: boolean;\n license_template: string | null | undefined;\n gitignore_template: string | null | undefined;\n owner_id: number;\n owner_type: \"User\" | \"Organization\";\n owner_login: string;\n default_branch: string;\n baseUrl: string;\n allow_rebase_merge?: boolean;\n allow_squash_merge?: boolean;\n allow_merge_commit?: boolean;\n delete_branch_on_merge?: boolean;\n};\n\nfunction createRepoRecord(\n gh: GitHubStore,\n params: CreateRepoRecordParams,\n actor: GitHubUser\n): GitHubRepo {\n const name = validateRepoName(params.name);\n const fullName = `${params.owner_login}/${name}`;\n if (gh.repos.findOneBy(\"full_name\", fullName)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n\n const isPrivate = params.private;\n const visibility = isPrivate\n ? \"private\"\n : (\"public\" as GitHubRepo[\"visibility\"]);\n\n const license =\n typeof params.license_template === \"string\"\n ? resolveLicenseTemplate(params.license_template)\n : null;\n\n const repo = gh.repos.insert({\n node_id: \"\",\n name,\n full_name: fullName,\n owner_id: params.owner_id,\n owner_type: params.owner_type,\n private: isPrivate,\n description: params.description,\n fork: false,\n forked_from_id: null,\n homepage: params.homepage,\n language: null,\n languages: {},\n forks_count: 0,\n stargazers_count: 0,\n watchers_count: 0,\n size: 0,\n default_branch: params.default_branch,\n open_issues_count: 0,\n topics: [],\n has_issues: params.has_issues,\n has_projects: params.has_projects,\n has_wiki: params.has_wiki,\n has_pages: false,\n has_downloads: true,\n has_discussions: false,\n archived: false,\n disabled: false,\n visibility,\n pushed_at: null,\n allow_rebase_merge: params.allow_rebase_merge ?? true,\n allow_squash_merge: params.allow_squash_merge ?? true,\n allow_merge_commit: params.allow_merge_commit ?? true,\n allow_auto_merge: false,\n delete_branch_on_merge: params.delete_branch_on_merge ?? false,\n allow_forking: true,\n is_template: false,\n license,\n } as Omit<GitHubRepo, \"id\" | \"created_at\" | \"updated_at\">);\n\n gh.repos.update(repo.id, { node_id: generateNodeId(\"Repository\", repo.id) });\n\n if (!isPrivate) {\n bumpPublicRepos(gh, params.owner_id, params.owner_type, 1);\n }\n\n const updated = gh.repos.get(repo.id)!;\n if (params.auto_init) {\n seedInitialGit(gh, updated, actor);\n }\n\n return gh.repos.get(repo.id)!;\n}\n\nfunction deleteRepoCascade(gh: GitHubStore, repo: GitHubRepo) {\n const repoId = repo.id;\n const wasPublic = !repo.private;\n\n const delByRepo = <T extends Entity>(col: Collection<T>) => {\n for (const item of col.findBy(\"repo_id\" as keyof T, repoId as T[keyof T])) {\n col.delete(item.id);\n }\n };\n\n delByRepo(gh.collaborators);\n delByRepo(gh.issues);\n delByRepo(gh.pullRequests);\n delByRepo(gh.labels);\n delByRepo(gh.milestones);\n delByRepo(gh.comments);\n delByRepo(gh.reviews);\n delByRepo(gh.issueEvents);\n delByRepo(gh.branches);\n delByRepo(gh.branchProtections);\n delByRepo(gh.refs);\n delByRepo(gh.commits);\n delByRepo(gh.trees);\n delByRepo(gh.blobs);\n delByRepo(gh.tags);\n\n for (const rel of gh.releases.findBy(\"repo_id\", repoId)) {\n for (const a of gh.releaseAssets.findBy(\"release_id\", rel.id)) {\n gh.releaseAssets.delete(a.id);\n }\n gh.releases.delete(rel.id);\n }\n\n delByRepo(gh.webhooks);\n delByRepo(gh.workflows);\n for (const run of gh.workflowRuns.findBy(\"repo_id\", repoId)) {\n for (const j of gh.jobs.findBy(\"run_id\", run.id)) {\n gh.jobs.delete(j.id);\n }\n for (const a of gh.artifacts.findBy(\"run_id\", run.id)) {\n gh.artifacts.delete(a.id);\n }\n gh.workflowRuns.delete(run.id);\n }\n\n delByRepo(gh.secrets);\n delByRepo(gh.checkRuns);\n delByRepo(gh.checkSuites);\n\n gh.repos.delete(repoId);\n\n if (wasPublic) {\n bumpPublicRepos(gh, repo.owner_id, repo.owner_type, -1);\n }\n\n if (repo.forked_from_id) {\n const parent = gh.repos.get(repo.forked_from_id);\n if (parent && parent.forks_count > 0) {\n gh.repos.update(parent.id, { forks_count: parent.forks_count - 1 });\n }\n }\n}\n\nfunction formatTagItem(tag: GitHubTag, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n name: tag.tag,\n zipball_url: `${repoUrl}/zipball/${encodeURIComponent(tag.tag)}`,\n tarball_url: `${repoUrl}/tarball/${encodeURIComponent(tag.tag)}`,\n commit: {\n sha: tag.sha,\n url: `${repoUrl}/commits/${tag.sha}`,\n },\n node_id: tag.node_id,\n };\n}\n\nfunction parsePermission(\n raw: unknown\n): \"pull\" | \"triage\" | \"push\" | \"maintain\" | \"admin\" | undefined {\n if (raw === undefined) return undefined;\n if (\n raw === \"pull\" ||\n raw === \"triage\" ||\n raw === \"push\" ||\n raw === \"maintain\" ||\n raw === \"admin\"\n ) {\n return raw;\n }\n return undefined;\n}\n\nexport function reposRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n return c.json(formatRepo(repo, gh, baseUrl));\n });\n\n app.post(\"/user/repos\", async (c) => {\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n const body = await parseJsonBody(c);\n\n const finalRepo = createRepoRecord(\n gh,\n {\n name: body.name,\n description: typeof body.description === \"string\" ? body.description : null,\n private: typeof body.private === \"boolean\" ? body.private : false,\n homepage: typeof body.homepage === \"string\" ? body.homepage : null,\n has_issues: typeof body.has_issues === \"boolean\" ? body.has_issues : true,\n has_projects: typeof body.has_projects === \"boolean\" ? body.has_projects : true,\n has_wiki: typeof body.has_wiki === \"boolean\" ? body.has_wiki : true,\n auto_init: body.auto_init === true,\n license_template:\n typeof body.license_template === \"string\" ? body.license_template : undefined,\n gitignore_template:\n typeof body.gitignore_template === \"string\" ? body.gitignore_template : undefined,\n owner_id: user.id,\n owner_type: \"User\",\n owner_login: user.login,\n default_branch: \"main\",\n baseUrl,\n allow_rebase_merge:\n typeof body.allow_rebase_merge === \"boolean\" ? body.allow_rebase_merge : undefined,\n allow_squash_merge:\n typeof body.allow_squash_merge === \"boolean\" ? body.allow_squash_merge : undefined,\n allow_merge_commit:\n typeof body.allow_merge_commit === \"boolean\" ? body.allow_merge_commit : undefined,\n delete_branch_on_merge:\n typeof body.delete_branch_on_merge === \"boolean\" ? body.delete_branch_on_merge : undefined,\n },\n user\n );\n\n webhooks.dispatch(\n \"repository\",\n \"created\",\n { action: \"created\", repository: formatRepo(finalRepo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n user.login,\n finalRepo.name\n );\n\n return c.json(formatRepo(finalRepo, gh, baseUrl), 201);\n });\n\n app.post(\"/orgs/:org/repos\", async (c) => {\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n const orgLogin = c.req.param(\"org\")!;\n const org = gh.orgs.findOneBy(\"login\", orgLogin);\n if (!org) throw notFoundResponse();\n\n if (!isOrgMember(gh, user.id, org.id)) {\n throw forbidden();\n }\n\n const body = await parseJsonBody(c);\n\n const finalRepo = createRepoRecord(\n gh,\n {\n name: body.name,\n description: typeof body.description === \"string\" ? body.description : null,\n private: typeof body.private === \"boolean\" ? body.private : false,\n homepage: typeof body.homepage === \"string\" ? body.homepage : null,\n has_issues: typeof body.has_issues === \"boolean\" ? body.has_issues : true,\n has_projects: typeof body.has_projects === \"boolean\" ? body.has_projects : true,\n has_wiki: typeof body.has_wiki === \"boolean\" ? body.has_wiki : true,\n auto_init: body.auto_init === true,\n license_template:\n typeof body.license_template === \"string\" ? body.license_template : undefined,\n gitignore_template:\n typeof body.gitignore_template === \"string\" ? body.gitignore_template : undefined,\n owner_id: org.id,\n owner_type: \"Organization\",\n owner_login: org.login,\n default_branch: \"main\",\n baseUrl,\n allow_rebase_merge:\n typeof body.allow_rebase_merge === \"boolean\" ? body.allow_rebase_merge : undefined,\n allow_squash_merge:\n typeof body.allow_squash_merge === \"boolean\" ? body.allow_squash_merge : undefined,\n allow_merge_commit:\n typeof body.allow_merge_commit === \"boolean\" ? body.allow_merge_commit : undefined,\n delete_branch_on_merge:\n typeof body.delete_branch_on_merge === \"boolean\" ? body.delete_branch_on_merge : undefined,\n },\n user\n );\n\n webhooks.dispatch(\n \"repository\",\n \"created\",\n { action: \"created\", repository: formatRepo(finalRepo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n org.login,\n finalRepo.name\n );\n\n return c.json(formatRepo(finalRepo, gh, baseUrl), 201);\n });\n\n app.patch(\"/repos/:owner/:repo\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, user, repo)) throw forbidden();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubRepo> = {};\n\n if (typeof body.name === \"string\") {\n const newName = validateRepoName(body.name);\n const login = ownerLoginOf(gh, repo);\n const newFull = `${login}/${newName}`;\n if (newFull !== repo.full_name && gh.repos.findOneBy(\"full_name\", newFull)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n patch.name = newName;\n patch.full_name = newFull;\n }\n\n if (\"description\" in body) {\n patch.description = body.description === null ? null : String(body.description);\n }\n if (\"homepage\" in body && (typeof body.homepage === \"string\" || body.homepage === null)) {\n patch.homepage = body.homepage;\n }\n if (typeof body.private === \"boolean\") {\n patch.private = body.private;\n patch.visibility = body.private ? \"private\" : \"public\";\n }\n if (typeof body.has_issues === \"boolean\") patch.has_issues = body.has_issues;\n if (typeof body.has_projects === \"boolean\") patch.has_projects = body.has_projects;\n if (typeof body.has_wiki === \"boolean\") patch.has_wiki = body.has_wiki;\n if (typeof body.has_pages === \"boolean\") patch.has_pages = body.has_pages;\n if (typeof body.has_downloads === \"boolean\") patch.has_downloads = body.has_downloads;\n if (typeof body.has_discussions === \"boolean\") patch.has_discussions = body.has_discussions;\n if (typeof body.archived === \"boolean\") patch.archived = body.archived;\n if (typeof body.disabled === \"boolean\") patch.disabled = body.disabled;\n if (typeof body.default_branch === \"string\") patch.default_branch = body.default_branch;\n\n if (Array.isArray(body.topics)) {\n patch.topics = body.topics.filter((t): t is string => typeof t === \"string\");\n }\n\n if (typeof body.visibility === \"string\") {\n const v = body.visibility;\n if (v === \"public\" || v === \"private\" || v === \"internal\") {\n patch.visibility = v;\n patch.private = v !== \"public\";\n }\n }\n\n if (\"license\" in body) {\n if (body.license === null) patch.license = null;\n else if (typeof body.license === \"object\" && body.license !== null) {\n const L = body.license as Record<string, unknown>;\n if (\n typeof L.key === \"string\" &&\n typeof L.name === \"string\" &&\n typeof L.spdx_id === \"string\"\n ) {\n patch.license = { key: L.key, name: L.name, spdx_id: L.spdx_id };\n }\n }\n }\n\n if (typeof body.allow_rebase_merge === \"boolean\") patch.allow_rebase_merge = body.allow_rebase_merge;\n if (typeof body.allow_squash_merge === \"boolean\") patch.allow_squash_merge = body.allow_squash_merge;\n if (typeof body.allow_merge_commit === \"boolean\") patch.allow_merge_commit = body.allow_merge_commit;\n if (typeof body.allow_auto_merge === \"boolean\") patch.allow_auto_merge = body.allow_auto_merge;\n if (typeof body.delete_branch_on_merge === \"boolean\") {\n patch.delete_branch_on_merge = body.delete_branch_on_merge;\n }\n if (typeof body.allow_forking === \"boolean\") patch.allow_forking = body.allow_forking;\n if (typeof body.is_template === \"boolean\") patch.is_template = body.is_template;\n\n const oldPrivate = repo.private;\n const updated = gh.repos.update(repo.id, patch);\n if (!updated) throw notFoundResponse();\n\n if (oldPrivate !== updated.private) {\n const delta = updated.private ? -1 : 1;\n bumpPublicRepos(gh, updated.owner_id, updated.owner_type, delta);\n }\n\n webhooks.dispatch(\n \"repository\",\n \"edited\",\n { action: \"edited\", repository: formatRepo(updated, gh, baseUrl), sender: formatUser(user, baseUrl) },\n ownerLoginOf(gh, updated),\n updated.name\n );\n\n return c.json(formatRepo(updated, gh, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, user, repo)) throw forbidden();\n\n webhooks.dispatch(\n \"repository\",\n \"deleted\",\n { action: \"deleted\", repository: formatRepo(repo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n owner,\n repoName\n );\n\n deleteRepoCascade(gh, repo);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/topics\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n return c.json({ names: repo.topics });\n });\n\n app.put(\"/repos/:owner/:repo/topics\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, user, repo)) throw forbidden();\n\n const body = await parseJsonBody(c) as { names?: unknown };\n const names = Array.isArray(body.names)\n ? body.names.filter((n): n is string => typeof n === \"string\")\n : [];\n const updated = gh.repos.update(repo.id, { topics: names });\n if (!updated) throw notFoundResponse();\n return c.json({ names: updated.topics });\n });\n\n app.get(\"/repos/:owner/:repo/languages\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n return c.json(repo.languages);\n });\n\n app.get(\"/repos/:owner/:repo/contributors\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const collabUsers = gh.collaborators\n .findBy(\"repo_id\", repo.id)\n .map((col) => gh.users.get(col.user_id))\n .filter((u): u is GitHubUser => Boolean(u));\n\n const ownerUser =\n repo.owner_type === \"User\" ? gh.users.get(repo.owner_id) : undefined;\n\n const map = new Map<number, GitHubUser>();\n if (ownerUser) map.set(ownerUser.id, ownerUser);\n for (const u of collabUsers) map.set(u.id, u);\n\n const all = [...map.values()].sort((a, b) => a.login.localeCompare(b.login));\n const { page, per_page } = parsePagination(c);\n const total = all.length;\n const start = (page - 1) * per_page;\n const slice = all.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(\n slice.map((u) => ({\n ...formatUser(u, baseUrl),\n contributions: 1,\n }))\n );\n });\n\n app.get(\"/repos/:owner/:repo/forks\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const forks = gh.repos\n .all()\n .filter((r) => r.forked_from_id === repo.id)\n .sort((a, b) => (a.created_at < b.created_at ? 1 : -1));\n\n const { page, per_page } = parsePagination(c);\n const total = forks.length;\n const start = (page - 1) * per_page;\n const slice = forks.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((r) => formatRepo(r, gh, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/forks\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const parent = lookupRepo(gh, owner, repoName);\n if (!parent) throw notFoundResponse();\n\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n assertRepoRead(gh, authUser, parent);\n\n const body = await parseJsonBody(c) as {\n organization?: unknown;\n name?: unknown;\n };\n\n let ownerType: \"User\" | \"Organization\" = \"User\";\n let ownerId = user.id;\n let fullName = \"\";\n let forkName =\n typeof body.name === \"string\" && body.name.trim()\n ? validateRepoName(body.name)\n : parent.name;\n\n if (typeof body.organization === \"string\" && body.organization.trim()) {\n const org = gh.orgs.findOneBy(\"login\", body.organization.trim());\n if (!org) throw notFoundResponse();\n if (!isOrgMember(gh, user.id, org.id)) throw forbidden();\n ownerType = \"Organization\";\n ownerId = org.id;\n fullName = `${org.login}/${forkName}`;\n } else {\n fullName = `${user.login}/${forkName}`;\n }\n\n if (gh.repos.findOneBy(\"full_name\", fullName)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n\n const isPrivate = parent.private;\n const visibility = isPrivate ? \"private\" : \"public\";\n\n const repo = gh.repos.insert({\n node_id: \"\",\n name: forkName,\n full_name: fullName,\n owner_id: ownerId,\n owner_type: ownerType,\n private: isPrivate,\n description: parent.description,\n fork: true,\n forked_from_id: parent.id,\n homepage: parent.homepage,\n language: parent.language,\n languages: { ...parent.languages },\n forks_count: 0,\n stargazers_count: 0,\n watchers_count: 0,\n size: parent.size,\n default_branch: parent.default_branch,\n open_issues_count: 0,\n topics: [...parent.topics],\n has_issues: parent.has_issues,\n has_projects: parent.has_projects,\n has_wiki: parent.has_wiki,\n has_pages: parent.has_pages,\n has_downloads: parent.has_downloads,\n has_discussions: parent.has_discussions,\n archived: false,\n disabled: false,\n visibility: visibility as GitHubRepo[\"visibility\"],\n pushed_at: parent.pushed_at,\n allow_rebase_merge: parent.allow_rebase_merge,\n allow_squash_merge: parent.allow_squash_merge,\n allow_merge_commit: parent.allow_merge_commit,\n allow_auto_merge: parent.allow_auto_merge,\n delete_branch_on_merge: parent.delete_branch_on_merge,\n allow_forking: parent.allow_forking,\n is_template: false,\n license: parent.license,\n } as Omit<GitHubRepo, \"id\" | \"created_at\" | \"updated_at\">);\n\n gh.repos.update(repo.id, { node_id: generateNodeId(\"Repository\", repo.id) });\n\n if (!isPrivate) {\n bumpPublicRepos(gh, ownerId, ownerType, 1);\n }\n\n gh.repos.update(parent.id, { forks_count: parent.forks_count + 1 });\n\n seedInitialGit(gh, gh.repos.get(repo.id)!, user, parent.full_name);\n\n const finalRepo = gh.repos.get(repo.id)!;\n const ownerLogin = ownerLoginOf(gh, finalRepo);\n webhooks.dispatch(\n \"fork\",\n \"created\",\n { action: \"created\", repository: formatRepo(finalRepo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n ownerLogin,\n finalRepo.name\n );\n\n return c.json(formatRepo(finalRepo, gh, baseUrl), 202);\n });\n\n app.get(\"/repos/:owner/:repo/collaborators\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const collabs = gh.collaborators.findBy(\"repo_id\", repo.id);\n const users = collabs\n .map((col) => {\n const u = gh.users.get(col.user_id);\n if (!u) return null;\n return { user: u, permission: col.permission };\n })\n .filter((x): x is { user: GitHubUser; permission: GitHubCollaborator[\"permission\"] } =>\n Boolean(x)\n )\n .sort((a, b) => a.user.login.localeCompare(b.user.login));\n\n const { page, per_page } = parsePagination(c);\n const total = users.length;\n const start = (page - 1) * per_page;\n const slice = users.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((x) => formatUser(x.user, baseUrl)));\n });\n\n app.put(\"/repos/:owner/:repo/collaborators/:username\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const username = c.req.param(\"username\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const actor = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, actor, repo)) throw forbidden();\n\n const target = gh.users.findOneBy(\"login\", username);\n if (!target) throw notFoundResponse();\n\n const body = await parseJsonBody(c) as { permission?: unknown };\n const permission = parsePermission(body.permission) ?? \"push\";\n\n const existing = gh.collaborators\n .findBy(\"repo_id\", repo.id)\n .find((c) => c.user_id === target.id);\n if (existing) {\n gh.collaborators.update(existing.id, { permission });\n } else {\n gh.collaborators.insert({\n repo_id: repo.id,\n user_id: target.id,\n permission,\n } as Omit<GitHubCollaborator, \"id\" | \"created_at\" | \"updated_at\">);\n }\n\n return c.json({ permission }, 201);\n });\n\n app.delete(\"/repos/:owner/:repo/collaborators/:username\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const username = c.req.param(\"username\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const actor = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, actor, repo)) throw forbidden();\n\n const target = gh.users.findOneBy(\"login\", username);\n if (!target) throw notFoundResponse();\n\n const existing = gh.collaborators\n .findBy(\"repo_id\", repo.id)\n .find((col) => col.user_id === target.id);\n if (existing) {\n gh.collaborators.delete(existing.id);\n }\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/collaborators/:username/permission\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const username = c.req.param(\"username\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const target = gh.users.findOneBy(\"login\", username);\n if (!target) throw notFoundResponse();\n\n if (repo.owner_type === \"User\" && repo.owner_id === target.id) {\n return c.json({\n permission: \"admin\",\n role_name: \"admin\",\n user: formatUser(target, baseUrl),\n });\n }\n\n if (repo.owner_type === \"Organization\" && isOrgMember(gh, target.id, repo.owner_id)) {\n return c.json({\n permission: \"admin\",\n role_name: \"admin\",\n user: formatUser(target, baseUrl),\n });\n }\n\n const collab = gh.collaborators\n .findBy(\"repo_id\", repo.id)\n .find((col) => col.user_id === target.id);\n if (!collab) throw notFoundResponse();\n\n const roleName =\n collab.permission === \"admin\"\n ? \"admin\"\n : collab.permission === \"maintain\"\n ? \"maintain\"\n : collab.permission === \"push\"\n ? \"write\"\n : collab.permission === \"triage\"\n ? \"triage\"\n : \"read\";\n\n return c.json({\n permission: collab.permission,\n role_name: roleName,\n user: formatUser(target, baseUrl),\n });\n });\n\n app.post(\"/repos/:owner/:repo/transfer\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const actor = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, actor, repo)) throw forbidden();\n\n const body = await parseJsonBody(c) as { new_owner?: unknown };\n if (typeof body.new_owner !== \"string\" || !body.new_owner.trim()) {\n throw new ApiError(422, \"new_owner is required\");\n }\n\n const newOwner = lookupOwner(gh, body.new_owner.trim());\n if (!newOwner) throw notFoundResponse();\n\n const newFull = `${newOwner.login}/${repo.name}`;\n if (newFull !== repo.full_name && gh.repos.findOneBy(\"full_name\", newFull)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n\n const updated = gh.repos.update(repo.id, {\n owner_id: newOwner.id,\n owner_type: newOwner.type === \"User\" ? \"User\" : \"Organization\",\n full_name: newFull,\n });\n if (!updated) throw notFoundResponse();\n\n webhooks.dispatch(\n \"repository\",\n \"transferred\",\n { action: \"transferred\", repository: formatRepo(updated, gh, baseUrl), sender: formatUser(actor, baseUrl) },\n newOwner.login,\n updated.name\n );\n\n return c.json(formatRepo(updated, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/tags\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const tags = [...gh.tags.findBy(\"repo_id\", repo.id)].sort((a, b) =>\n a.tag.localeCompare(b.tag)\n );\n\n const { page, per_page } = parsePagination(c);\n const total = tags.length;\n const start = (page - 1) * per_page;\n const slice = tags.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((t) => formatTagItem(t, repo, baseUrl)));\n });\n}\n","import type { Context } from \"hono\";\nimport type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport {\n assertIssueWrite,\n assertRepoRead,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubIssue, GitHubIssueEvent, GitHubLabel, GitHubRepo, GitHubUser } from \"../entities.js\";\nimport {\n formatIssue,\n formatRepo,\n formatUser,\n generateNodeId,\n getNextIssueNumber,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\n\nfunction findIssueForRepo(\n gh: GitHubStore,\n repoId: number,\n issueNumber: number\n): GitHubIssue | undefined {\n return gh.issues\n .findBy(\"repo_id\", repoId)\n .find((i) => i.number === issueNumber && !i.is_pull_request);\n}\n\nfunction adjustRepoOpenIssues(gh: GitHubStore, repoId: number, delta: number) {\n const repo = gh.repos.get(repoId);\n if (!repo) return;\n gh.repos.update(repoId, { open_issues_count: Math.max(0, repo.open_issues_count + delta) });\n}\n\nfunction getOrCreateLabel(gh: GitHubStore, repo: GitHubRepo, name: string): GitHubLabel {\n const existing = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (existing) return existing;\n const label = gh.labels.insert({\n node_id: \"\",\n repo_id: repo.id,\n name,\n description: null,\n color: \"ededed\",\n default: false,\n } as Omit<GitHubLabel, \"id\" | \"created_at\" | \"updated_at\">);\n gh.labels.update(label.id, { node_id: generateNodeId(\"Label\", label.id) });\n return gh.labels.get(label.id)!;\n}\n\nfunction resolveLabelIds(\n gh: GitHubStore,\n repo: GitHubRepo,\n raw: unknown,\n createMissing: boolean\n): number[] {\n if (raw === undefined) return [];\n if (!Array.isArray(raw)) {\n throw new ApiError(422, \"Validation failed\");\n }\n const ids: number[] = [];\n for (const item of raw) {\n if (typeof item === \"number\" && Number.isFinite(item)) {\n const label = gh.labels.get(item);\n if (!label || label.repo_id !== repo.id) {\n throw new ApiError(422, \"Validation failed\");\n }\n ids.push(item);\n } else if (typeof item === \"string\") {\n if (createMissing) {\n ids.push(getOrCreateLabel(gh, repo, item).id);\n } else {\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === item);\n if (!label) throw new ApiError(422, \"Validation failed\");\n ids.push(label.id);\n }\n } else {\n throw new ApiError(422, \"Validation failed\");\n }\n }\n return [...new Set(ids)];\n}\n\nfunction lookupUserByLogin(gh: GitHubStore, login: string): GitHubUser {\n const u = gh.users.findOneBy(\"login\", login);\n if (!u) throw new ApiError(422, \"Validation failed\");\n return u;\n}\n\nfunction insertIssueEvent(\n gh: GitHubStore,\n repo: GitHubRepo,\n issueNumber: number,\n event: string,\n actorId: number,\n extra?: Partial<\n Pick<\n GitHubIssueEvent,\n \"commit_id\" | \"commit_url\" | \"label_name\" | \"assignee_id\" | \"milestone_title\" | \"rename\"\n >\n >\n): GitHubIssueEvent {\n const row = gh.issueEvents.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: issueNumber,\n event,\n actor_id: actorId,\n commit_id: null,\n commit_url: null,\n label_name: null,\n assignee_id: null,\n milestone_title: null,\n rename: null,\n ...extra,\n } as Omit<GitHubIssueEvent, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issueEvents.update(row.id, { node_id: generateNodeId(\"IssueEvent\", row.id) });\n return gh.issueEvents.get(row.id)!;\n}\n\nfunction formatIssueEventApi(\n ev: GitHubIssueEvent,\n gh: GitHubStore,\n repo: GitHubRepo,\n issue: GitHubIssue,\n baseUrl: string\n) {\n const actor = gh.users.get(ev.actor_id);\n const issueJson = formatIssue(issue, gh, baseUrl);\n return {\n id: ev.id,\n node_id: ev.node_id,\n url: `${baseUrl}/repos/${repo.full_name}/issues/events/${ev.id}`,\n actor: actor ? formatUser(actor, baseUrl) : null,\n event: ev.event,\n commit_id: ev.commit_id,\n commit_url: ev.commit_url,\n created_at: ev.created_at,\n label:\n ev.label_name !== null\n ? gh.labels\n .findBy(\"repo_id\", repo.id)\n .find((l) => l.name === ev.label_name)\n ? {\n name: ev.label_name,\n color: gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === ev.label_name)!.color,\n }\n : { name: ev.label_name, color: \"ededed\" }\n : null,\n assignee:\n ev.assignee_id !== null && gh.users.get(ev.assignee_id)\n ? formatUser(gh.users.get(ev.assignee_id)!, baseUrl)\n : null,\n milestone: null,\n rename: ev.rename,\n issue: issueJson,\n };\n}\n\nfunction sortIssues(\n issues: GitHubIssue[],\n sort: \"created\" | \"updated\" | \"comments\",\n direction: \"asc\" | \"desc\"\n): GitHubIssue[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const field = sort === \"created\" ? \"created_at\" : sort === \"updated\" ? \"updated_at\" : \"comments\";\n const sorted = [...issues];\n sorted.sort((a, b) => {\n const av = a[field];\n const bv = b[field];\n if (typeof av === \"number\" && typeof bv === \"number\") {\n return av < bv ? -1 * mul : av > bv ? 1 * mul : 0;\n }\n const as = String(av);\n const bs = String(bv);\n if (as < bs) return -1 * mul;\n if (as > bs) return 1 * mul;\n return 0;\n });\n return sorted;\n}\n\nfunction parseIssueListFilters(c: Context) {\n const stateQ = c.req.query(\"state\") ?? \"open\";\n const state: \"open\" | \"closed\" | \"all\" =\n stateQ === \"closed\" || stateQ === \"all\" || stateQ === \"open\" ? stateQ : \"open\";\n\n const labelsParam = c.req.query(\"labels\");\n const labelNames = labelsParam\n ? labelsParam\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : [];\n\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" | \"comments\" =\n sortRaw === \"updated\" || sortRaw === \"comments\" ? sortRaw : \"created\";\n\n const dirRaw = c.req.query(\"direction\") ?? \"desc\";\n const direction: \"asc\" | \"desc\" = dirRaw === \"asc\" ? \"asc\" : \"desc\";\n\n const milestoneQ = c.req.query(\"milestone\");\n const assigneeQ = c.req.query(\"assignee\");\n const creatorQ = c.req.query(\"creator\");\n const sinceQ = c.req.query(\"since\");\n\n return {\n state,\n labelNames,\n sort,\n direction,\n milestoneQ,\n assigneeQ,\n creatorQ,\n sinceQ,\n };\n}\n\nexport function issuesRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/issues\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { state, labelNames, sort, direction, milestoneQ, assigneeQ, creatorQ, sinceQ } =\n parseIssueListFilters(c);\n\n let list = gh.issues.findBy(\"repo_id\", repo.id).filter((i) => !i.is_pull_request);\n\n if (state === \"open\") list = list.filter((i) => i.state === \"open\");\n else if (state === \"closed\") list = list.filter((i) => i.state === \"closed\");\n\n if (labelNames.length > 0) {\n const labelIds = labelNames\n .map((name) => gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name)?.id)\n .filter((x): x is number => x !== undefined);\n if (labelIds.length !== labelNames.length) {\n return c.json([]);\n }\n list = list.filter((i) => labelIds.every((lid) => i.label_ids.includes(lid)));\n }\n\n if (milestoneQ !== undefined && milestoneQ !== \"\") {\n if (milestoneQ === \"none\") {\n list = list.filter((i) => i.milestone_id === null);\n } else if (milestoneQ === \"*\") {\n list = list.filter((i) => i.milestone_id !== null);\n } else {\n const n = parseInt(milestoneQ, 10);\n if (!Number.isFinite(n)) {\n list = [];\n } else {\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === n);\n if (!ms) list = [];\n else list = list.filter((i) => i.milestone_id === ms.id);\n }\n }\n }\n\n if (assigneeQ !== undefined && assigneeQ !== \"\") {\n if (assigneeQ === \"none\") {\n list = list.filter((i) => i.assignee_ids.length === 0);\n } else if (assigneeQ === \"*\") {\n list = list.filter((i) => i.assignee_ids.length > 0);\n } else {\n const u = gh.users.findOneBy(\"login\", assigneeQ);\n if (!u) list = [];\n else list = list.filter((i) => i.assignee_ids.includes(u.id));\n }\n }\n\n if (creatorQ !== undefined && creatorQ !== \"\") {\n const u = gh.users.findOneBy(\"login\", creatorQ);\n if (!u) list = [];\n else list = list.filter((i) => i.user_id === u.id);\n }\n\n if (sinceQ) {\n list = list.filter((i) => i.updated_at >= sinceQ);\n }\n\n list = sortIssues(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((i) => formatIssue(i, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/issues\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n\n const title = body.title;\n if (typeof title !== \"string\" || !title.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const issueBody = typeof body.body === \"string\" || body.body === null ? (body.body as string | null) : null;\n\n const assigneeLogins = Array.isArray(body.assignees)\n ? body.assignees.filter((x): x is string => typeof x === \"string\")\n : [];\n const assigneeIds = assigneeLogins.map((login) => lookupUserByLogin(gh, login).id);\n\n const labelIds = body.labels !== undefined ? resolveLabelIds(gh, repo, body.labels, true) : [];\n\n let milestoneId: number | null = null;\n if (body.milestone !== undefined && body.milestone !== null) {\n const mn = typeof body.milestone === \"number\" ? body.milestone : parseInt(String(body.milestone), 10);\n if (!Number.isFinite(mn)) throw new ApiError(422, \"Validation failed\");\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === mn);\n if (!ms) throw new ApiError(422, \"Validation failed\");\n milestoneId = ms.id;\n }\n\n const num = getNextIssueNumber(gh, repo.id);\n const row = gh.issues.insert({\n node_id: \"\",\n number: num,\n repo_id: repo.id,\n title: title.trim(),\n body: issueBody,\n state: \"open\",\n state_reason: null,\n locked: false,\n active_lock_reason: null,\n user_id: actor.id,\n assignee_ids: assigneeIds,\n label_ids: labelIds,\n milestone_id: milestoneId,\n comments: 0,\n closed_at: null,\n closed_by_id: null,\n is_pull_request: false,\n } as Omit<GitHubIssue, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issues.update(row.id, { node_id: generateNodeId(\"Issue\", row.id) });\n const issue = gh.issues.get(row.id)!;\n\n adjustRepoOpenIssues(gh, repo.id, 1);\n\n insertIssueEvent(gh, repo, issue.number, \"opened\", actor.id);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const issueFmt = formatIssue(issue, gh, baseUrl)!;\n webhooks.dispatch(\n \"issues\",\n \"opened\",\n {\n action: \"opened\",\n issue: issueFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json(issueFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/issues/:issue_number\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const beforePatch = issue;\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubIssue> = {};\n\n if (typeof body.title === \"string\") patch.title = body.title;\n if (\"body\" in body) {\n patch.body = body.body === null ? null : String(body.body);\n }\n\n const oldState = issue.state;\n if (body.state === \"open\" || body.state === \"closed\") {\n patch.state = body.state;\n }\n\n if (\"state_reason\" in body) {\n if (body.state_reason === null) {\n patch.state_reason = null;\n } else if (\n body.state_reason === \"completed\" ||\n body.state_reason === \"not_planned\" ||\n body.state_reason === \"reopened\"\n ) {\n patch.state_reason = body.state_reason;\n }\n }\n\n if (Array.isArray(body.labels)) {\n patch.label_ids = resolveLabelIds(gh, repo, body.labels, true);\n }\n\n if (Array.isArray(body.assignees)) {\n const logins = body.assignees.filter((x): x is string => typeof x === \"string\");\n patch.assignee_ids = logins.map((login) => lookupUserByLogin(gh, login).id);\n }\n\n if (\"milestone\" in body) {\n if (body.milestone === null) {\n patch.milestone_id = null;\n } else {\n const mn =\n typeof body.milestone === \"number\"\n ? body.milestone\n : parseInt(String(body.milestone), 10);\n if (!Number.isFinite(mn)) throw new ApiError(422, \"Validation failed\");\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === mn);\n if (!ms) throw new ApiError(422, \"Validation failed\");\n patch.milestone_id = ms.id;\n }\n }\n\n const prevLabelIds = new Set(issue.label_ids);\n const prevAssigneeIds = new Set(issue.assignee_ids);\n const prevMilestoneId = issue.milestone_id;\n\n const updated = gh.issues.update(issue.id, patch);\n if (!updated) throw notFoundResponse();\n issue = updated;\n\n let statePatch: Partial<GitHubIssue> = {};\n if (patch.state === \"closed\" && oldState === \"open\") {\n statePatch = {\n closed_at: timestamp(),\n closed_by_id: actor.id,\n ...(patch.state_reason === undefined ? { state_reason: \"completed\" as const } : {}),\n };\n } else if (patch.state === \"open\" && oldState === \"closed\") {\n statePatch = {\n closed_at: null,\n closed_by_id: null,\n ...(patch.state_reason === undefined ? { state_reason: \"reopened\" as const } : {}),\n };\n } else if (patch.state === \"closed\" && oldState === \"closed\") {\n if (patch.state_reason !== undefined) statePatch.state_reason = patch.state_reason;\n }\n\n if (Object.keys(statePatch).length > 0) {\n const again = gh.issues.update(issue.id, statePatch);\n if (again) issue = again;\n }\n\n const ownerLogin = ownerLoginOf(gh, repo);\n\n if (patch.state === \"closed\" && oldState === \"open\") {\n adjustRepoOpenIssues(gh, repo.id, -1);\n insertIssueEvent(gh, repo, issue.number, \"closed\", actor.id);\n webhooks.dispatch(\n \"issues\",\n \"closed\",\n {\n action: \"closed\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n } else if (patch.state === \"open\" && oldState === \"closed\") {\n adjustRepoOpenIssues(gh, repo.id, 1);\n insertIssueEvent(gh, repo, issue.number, \"reopened\", actor.id);\n webhooks.dispatch(\n \"issues\",\n \"reopened\",\n {\n action: \"reopened\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n\n if (Array.isArray(body.labels)) {\n const newIds = new Set(issue.label_ids);\n for (const id of prevLabelIds) {\n if (!newIds.has(id)) {\n const label = gh.labels.get(id);\n insertIssueEvent(gh, repo, issue.number, \"unlabeled\", actor.id, {\n label_name: label?.name ?? null,\n });\n webhooks.dispatch(\n \"issues\",\n \"unlabeled\",\n {\n action: \"unlabeled\",\n issue: formatIssue(issue, gh, baseUrl)!,\n label: label ? { name: label.name, color: label.color } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n }\n for (const id of newIds) {\n if (!prevLabelIds.has(id)) {\n const label = gh.labels.get(id);\n if (label) {\n insertIssueEvent(gh, repo, issue.number, \"labeled\", actor.id, { label_name: label.name });\n webhooks.dispatch(\n \"issues\",\n \"labeled\",\n {\n action: \"labeled\",\n issue: formatIssue(issue, gh, baseUrl)!,\n label: { name: label.name, color: label.color },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n }\n }\n }\n\n if (Array.isArray(body.assignees)) {\n const newAssignees = new Set(issue.assignee_ids);\n for (const id of prevAssigneeIds) {\n if (!newAssignees.has(id)) {\n insertIssueEvent(gh, repo, issue.number, \"unassigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"unassigned\",\n {\n action: \"unassigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n }\n for (const id of newAssignees) {\n if (!prevAssigneeIds.has(id)) {\n insertIssueEvent(gh, repo, issue.number, \"assigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"assigned\",\n {\n action: \"assigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n }\n }\n\n if (\"milestone\" in body) {\n const newMs = issue.milestone_id;\n if (prevMilestoneId !== newMs) {\n const oldTitle = prevMilestoneId ? gh.milestones.get(prevMilestoneId)?.title ?? null : null;\n const newTitle = newMs ? gh.milestones.get(newMs)?.title ?? null : null;\n if (prevMilestoneId !== null) {\n insertIssueEvent(gh, repo, issue.number, \"demilestoned\", actor.id, {\n milestone_title: oldTitle,\n });\n webhooks.dispatch(\n \"issues\",\n \"demilestoned\",\n {\n action: \"demilestoned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n milestone: oldTitle ? { title: oldTitle } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n if (newMs !== null) {\n insertIssueEvent(gh, repo, issue.number, \"milestoned\", actor.id, {\n milestone_title: newTitle,\n });\n webhooks.dispatch(\n \"issues\",\n \"milestoned\",\n {\n action: \"milestoned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n milestone: newTitle ? { title: newTitle } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n }\n }\n\n const titleEdited = typeof body.title === \"string\" && body.title !== beforePatch.title;\n const bodyEdited =\n \"body\" in body &&\n (body.body === null ? beforePatch.body !== null : String(body.body) !== (beforePatch.body ?? \"\"));\n if (titleEdited || bodyEdited) {\n insertIssueEvent(gh, repo, issue.number, \"edited\", actor.id);\n webhooks.dispatch(\n \"issues\",\n \"edited\",\n {\n action: \"edited\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n changes: {\n title: titleEdited,\n body: bodyEdited,\n },\n },\n ownerLogin,\n repo.name\n );\n }\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.put(\"/repos/:owner/:repo/issues/:issue_number/lock\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const lockReason =\n typeof body.lock_reason === \"string\"\n ? body.lock_reason\n : typeof body.active_lock_reason === \"string\"\n ? body.active_lock_reason\n : \"resolved\";\n\n issue = gh.issues.update(issue.id, {\n locked: true,\n active_lock_reason: lockReason,\n })!;\n\n insertIssueEvent(gh, repo, issue.number, \"locked\", actor.id);\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"issues\",\n \"locked\",\n {\n action: \"locked\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.body(null, 204);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/lock\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n issue = gh.issues.update(issue.id, { locked: false, active_lock_reason: null })!;\n\n insertIssueEvent(gh, repo, issue.number, \"unlocked\", actor.id);\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"issues\",\n \"unlocked\",\n {\n action: \"unlocked\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.body(null, 204);\n });\n\n function listIssueEventsForIssue(c: Context) {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n let events = gh.issueEvents\n .findBy(\"repo_id\", repo.id)\n .filter((e) => e.issue_number === issueNumber);\n events.sort((a, b) => a.created_at.localeCompare(b.created_at));\n const total = events.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n events = events.slice(start, start + per_page);\n\n const payload = events.map((ev) => formatIssueEventApi(ev, gh, repo, issue, baseUrl));\n return c.json(payload);\n }\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number/timeline\", (c) => listIssueEventsForIssue(c));\n app.get(\"/repos/:owner/:repo/issues/:issue_number/events\", (c) => listIssueEventsForIssue(c));\n\n app.post(\"/repos/:owner/:repo/issues/:issue_number/assignees\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const body = await parseJsonBody(c) as { assignees?: unknown };\n const logins = Array.isArray(body.assignees)\n ? body.assignees.filter((x): x is string => typeof x === \"string\")\n : [];\n const addIds = logins.map((login) => lookupUserByLogin(gh, login).id);\n const prevAssigneeSet = new Set(issue.assignee_ids);\n const merged = [...new Set([...issue.assignee_ids, ...addIds])];\n issue = gh.issues.update(issue.id, { assignee_ids: merged })!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n for (const id of addIds) {\n if (prevAssigneeSet.has(id)) continue;\n insertIssueEvent(gh, repo, issue.number, \"assigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"assigned\",\n {\n action: \"assigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/assignees\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const body = await parseJsonBody(c) as { assignees?: unknown };\n const logins = Array.isArray(body.assignees)\n ? body.assignees.filter((x): x is string => typeof x === \"string\")\n : [];\n const removeIds = new Set(logins.map((login) => lookupUserByLogin(gh, login).id));\n const prevAssignees = new Set(issue.assignee_ids);\n const merged = issue.assignee_ids.filter((id) => !removeIds.has(id));\n issue = gh.issues.update(issue.id, { assignee_ids: merged })!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n for (const id of removeIds) {\n if (prevAssignees.has(id)) {\n insertIssueEvent(gh, repo, issue.number, \"unassigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"unassigned\",\n {\n action: \"unassigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n }\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoRead,\n assertRepoWrite,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBranch,\n GitHubCommit,\n GitHubIssue,\n GitHubPullRequest,\n GitHubRef,\n GitHubRepo,\n GitHubUser,\n} from \"../entities.js\";\nimport {\n formatPullRequest,\n formatRepo,\n formatUser,\n generateNodeId,\n generateSha,\n getNextIssueNumber,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\n\nfunction findPull(gh: GitHubStore, repoId: number, pullNumber: number): GitHubPullRequest | undefined {\n return gh.pullRequests\n .findBy(\"repo_id\", repoId)\n .find((p) => p.number === pullNumber);\n}\n\nfunction findPrIssue(gh: GitHubStore, repoId: number, number: number): GitHubIssue | undefined {\n return gh.issues\n .findBy(\"repo_id\", repoId)\n .find((i) => i.number === number && i.is_pull_request);\n}\n\nfunction adjustRepoOpenIssues(gh: GitHubStore, repoId: number, delta: number) {\n const repo = gh.repos.get(repoId);\n if (!repo) return;\n gh.repos.update(repoId, { open_issues_count: Math.max(0, repo.open_issues_count + delta) });\n}\n\nfunction getDefaultBranchSha(gh: GitHubStore, repo: GitHubRepo): string {\n const branch = gh.branches\n .findBy(\"repo_id\", repo.id)\n .find((b) => b.name === repo.default_branch);\n if (!branch) {\n throw new ApiError(422, \"The repository is empty.\");\n }\n return branch.sha;\n}\n\nfunction createBranchAt(\n gh: GitHubStore,\n repo: GitHubRepo,\n branchName: string,\n sha: string\n): GitHubBranch {\n const b = gh.branches.insert({\n repo_id: repo.id,\n name: branchName,\n sha,\n protected: false,\n } as Omit<GitHubBranch, \"id\" | \"created_at\" | \"updated_at\">);\n const ref = gh.refs.insert({\n repo_id: repo.id,\n ref: `refs/heads/${branchName}`,\n sha,\n node_id: \"\",\n } as Omit<GitHubRef, \"id\" | \"created_at\" | \"updated_at\">);\n gh.refs.update(ref.id, { node_id: generateNodeId(\"Ref\", ref.id) });\n return b;\n}\n\nfunction getOrCreateBranch(gh: GitHubStore, repo: GitHubRepo, branchName: string): GitHubBranch {\n const existing = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === branchName);\n if (existing) return existing;\n const tip = getDefaultBranchSha(gh, repo);\n return createBranchAt(gh, repo, branchName, tip);\n}\n\nfunction updateBranchSha(gh: GitHubStore, repo: GitHubRepo, branchName: string, newSha: string) {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === branchName);\n if (branch) gh.branches.update(branch.id, { sha: newSha });\n const ref = gh.refs\n .findBy(\"repo_id\", repo.id)\n .find((r) => r.ref === `refs/heads/${branchName}`);\n if (ref) gh.refs.update(ref.id, { sha: newSha });\n}\n\nfunction resolveHeadTarget(\n gh: GitHubStore,\n baseRepo: GitHubRepo,\n head: string\n): { headRepo: GitHubRepo; headRef: string } {\n const trimmed = head.trim();\n if (!trimmed.includes(\":\")) {\n return { headRepo: baseRepo, headRef: trimmed };\n }\n const idx = trimmed.indexOf(\":\");\n const ownerLogin = trimmed.slice(0, idx).trim();\n const ref = trimmed.slice(idx + 1).trim();\n if (!ref) throw new ApiError(422, \"Validation failed\");\n\n const baseOwner = ownerLoginOf(gh, baseRepo);\n if (ownerLogin === baseOwner) {\n return { headRepo: baseRepo, headRef: ref };\n }\n\n const fork = gh.repos\n .all()\n .find((r) => {\n if (r.forked_from_id !== baseRepo.id) return false;\n const login =\n r.owner_type === \"User\"\n ? gh.users.get(r.owner_id)?.login\n : gh.orgs.get(r.owner_id)?.login;\n return login === ownerLogin;\n });\n if (!fork) throw new ApiError(422, \"Validation failed\");\n return { headRepo: fork, headRef: ref };\n}\n\nfunction countCommitsBetween(\n gh: GitHubStore,\n repo: GitHubRepo,\n headSha: string,\n baseSha: string\n): number {\n const chain = walkCommitsToBase(gh, repo, headSha, baseSha);\n return chain.length;\n}\n\nfunction walkCommitsToBase(\n gh: GitHubStore,\n repo: GitHubRepo,\n headSha: string,\n baseSha: string\n): GitHubCommit[] {\n const out: GitHubCommit[] = [];\n const seen = new Set<string>();\n let cur: string | undefined = headSha;\n while (cur && !seen.has(cur)) {\n seen.add(cur);\n const commit = gh.commits.findBy(\"repo_id\", repo.id).find((c) => c.sha === cur);\n if (!commit) break;\n out.push(commit);\n if (cur === baseSha) break;\n cur = commit.parent_shas[0];\n }\n return out.reverse();\n}\n\nfunction insertCommit(\n gh: GitHubStore,\n repo: GitHubRepo,\n opts: {\n treeSha: string;\n parentShas: string[];\n message: string;\n user: GitHubUser | null;\n }\n): GitHubCommit {\n const u = opts.user;\n const authorName = u?.name ?? u?.login ?? \"User\";\n const login = u?.login ?? \"user\";\n const email = u?.email ?? `${login}@users.noreply.github.com`;\n const now = timestamp();\n const row = gh.commits.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n message: opts.message,\n author_name: authorName,\n author_email: email,\n author_date: now,\n committer_name: authorName,\n committer_email: email,\n committer_date: now,\n tree_sha: opts.treeSha,\n parent_shas: opts.parentShas,\n user_id: u?.id ?? null,\n } as Omit<GitHubCommit, \"id\" | \"created_at\" | \"updated_at\">);\n gh.commits.update(row.id, { node_id: generateNodeId(\"Commit\", row.id) });\n return gh.commits.get(row.id)!;\n}\n\nfunction formatCommitApi(commit: GitHubCommit, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n sha: commit.sha,\n node_id: commit.node_id,\n url: `${repoUrl}/commits/${commit.sha}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${commit.sha}`,\n comments_url: `${repoUrl}/comments/${commit.sha}`,\n commit: {\n url: `${repoUrl}/git/commits/${commit.sha}`,\n author: {\n name: commit.author_name,\n email: commit.author_email,\n date: commit.author_date,\n },\n committer: {\n name: commit.committer_name,\n email: commit.committer_email,\n date: commit.committer_date,\n },\n message: commit.message,\n tree: { sha: commit.tree_sha },\n comment_count: 0,\n verification: {\n verified: false,\n reason: \"unsigned\",\n signature: null,\n payload: null,\n verified_at: null,\n },\n },\n author: null,\n committer: null,\n parents: commit.parent_shas.map((sha) => ({\n sha,\n url: `${repoUrl}/commits/${sha}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${sha}`,\n })),\n };\n}\n\nfunction headLabel(gh: GitHubStore, pr: GitHubPullRequest): string {\n const headRepo = gh.repos.get(pr.head_repo_id);\n const owner = headRepo\n ? headRepo.owner_type === \"User\"\n ? gh.users.get(headRepo.owner_id)?.login\n : gh.orgs.get(headRepo.owner_id)?.login\n : undefined;\n return `${owner ?? \"unknown\"}:${pr.head_ref}`;\n}\n\nfunction matchesHeadFilter(gh: GitHubStore, pr: GitHubPullRequest, headParam: string): boolean {\n const trimmed = headParam.trim();\n if (!trimmed) return true;\n if (!trimmed.includes(\":\")) {\n return pr.head_ref === trimmed;\n }\n return headLabel(gh, pr) === trimmed;\n}\n\nfunction sortPulls(\n list: GitHubPullRequest[],\n sort: \"created\" | \"updated\" | \"popularity\" | \"long-running\",\n direction: \"asc\" | \"desc\"\n): GitHubPullRequest[] {\n const sorted = [...list];\n sorted.sort((a, b) => {\n if (sort === \"long-running\") {\n const cmp = a.created_at.localeCompare(b.created_at);\n return direction === \"desc\" ? cmp : -cmp;\n }\n const mul = direction === \"asc\" ? 1 : -1;\n if (sort === \"updated\") {\n return a.updated_at.localeCompare(b.updated_at) * mul;\n }\n if (sort === \"created\") {\n return a.created_at.localeCompare(b.created_at) * mul;\n }\n const av = a.comments + a.review_comments;\n const bv = b.comments + b.review_comments;\n if (av < bv) return -1 * mul;\n if (av > bv) return 1 * mul;\n return 0;\n });\n return sorted;\n}\n\nfunction checkMergeRequirements(gh: GitHubStore, pr: GitHubPullRequest) {\n const baseRepo = gh.repos.get(pr.base_repo_id);\n if (!baseRepo) throw new ApiError(422, \"Base repository not found\");\n\n const rule = gh.branchProtections\n .findBy(\"repo_id\", baseRepo.id)\n .find((p) => p.branch_name === pr.base_ref);\n\n if (!rule) return;\n\n const checks = rule.required_status_checks;\n if (checks && checks.contexts.length > 0) {\n const runs = gh.checkRuns\n .findBy(\"repo_id\", baseRepo.id)\n .filter((r) => r.head_sha === pr.head_sha);\n for (const ctx of checks.contexts) {\n const ok = runs.some(\n (r) =>\n r.name === ctx && r.status === \"completed\" && r.conclusion === \"success\"\n );\n if (!ok) {\n throw new ApiError(422, \"Required status checks have not succeeded.\");\n }\n }\n }\n\n const rev = rule.required_pull_request_reviews;\n if (rev) {\n const need = rev.required_approving_review_count;\n const approved = gh.reviews\n .findBy(\"repo_id\", baseRepo.id)\n .filter((r) => r.pull_number === pr.number && r.state === \"APPROVED\");\n const approvers = new Set(approved.map((r) => r.user_id));\n if (approvers.size < need) {\n throw new ApiError(422, \"Required approving review count not met.\");\n }\n }\n}\n\nfunction deleteBranchByName(gh: GitHubStore, repo: GitHubRepo, branchName: string) {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === branchName);\n if (branch) gh.branches.delete(branch.id);\n const ref = gh.refs\n .findBy(\"repo_id\", repo.id)\n .find((r) => r.ref === `refs/heads/${branchName}`);\n if (ref) gh.refs.delete(ref.id);\n}\n\nfunction lookupUserByLogin(gh: GitHubStore, login: string): GitHubUser {\n const u = gh.users.findOneBy(\"login\", login);\n if (!u) throw new ApiError(422, \"Validation failed\");\n return u;\n}\n\nfunction lookupTeamSlug(gh: GitHubStore, orgId: number, slug: string) {\n const t = gh.teams\n .findBy(\"org_id\", orgId)\n .find((x) => x.slug === slug);\n if (!t) throw new ApiError(422, \"Validation failed\");\n return t;\n}\n\nexport function pullsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/pulls\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const stateQ = c.req.query(\"state\") ?? \"open\";\n const state: \"open\" | \"closed\" | \"all\" =\n stateQ === \"closed\" || stateQ === \"all\" || stateQ === \"open\" ? stateQ : \"open\";\n\n const headQ = c.req.query(\"head\") ?? \"\";\n const baseQ = c.req.query(\"base\") ?? \"\";\n\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" | \"popularity\" | \"long-running\" =\n sortRaw === \"updated\" || sortRaw === \"popularity\" || sortRaw === \"long-running\"\n ? sortRaw\n : \"created\";\n\n const dirRaw = c.req.query(\"direction\") ?? \"desc\";\n const direction: \"asc\" | \"desc\" = dirRaw === \"asc\" ? \"asc\" : \"desc\";\n\n let list = gh.pullRequests.findBy(\"repo_id\", repo.id);\n if (state === \"open\") list = list.filter((p) => p.state === \"open\");\n else if (state === \"closed\") list = list.filter((p) => p.state === \"closed\");\n\n if (baseQ.trim()) {\n list = list.filter((p) => p.base_ref === baseQ.trim());\n }\n if (headQ.trim()) {\n list = list.filter((p) => matchesHeadFilter(gh, p, headQ));\n }\n\n list = sortPulls(list, sort, direction);\n\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((p) => formatPullRequest(p, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/pulls\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n\n const title = body.title;\n if (typeof title !== \"string\" || !title.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const headRaw = body.head;\n const baseRaw = body.base;\n if (typeof headRaw !== \"string\" || !headRaw.trim()) throw new ApiError(422, \"Validation failed\");\n if (typeof baseRaw !== \"string\" || !baseRaw.trim()) throw new ApiError(422, \"Validation failed\");\n\n const { headRepo, headRef } = resolveHeadTarget(gh, repo, headRaw);\n const baseRef = baseRaw.trim();\n\n if (headRef === baseRef && headRepo.id === repo.id) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const prBody = typeof body.body === \"string\" || body.body === null ? (body.body as string | null) : null;\n const draft = typeof body.draft === \"boolean\" ? body.draft : false;\n\n const headBranch = getOrCreateBranch(gh, headRepo, headRef);\n const baseBranch = getOrCreateBranch(gh, repo, baseRef);\n\n const num = getNextIssueNumber(gh, repo.id);\n const now = timestamp();\n\n const issueRow = gh.issues.insert({\n node_id: \"\",\n number: num,\n repo_id: repo.id,\n title: title.trim(),\n body: prBody,\n state: \"open\",\n state_reason: null,\n locked: false,\n active_lock_reason: null,\n user_id: actor.id,\n assignee_ids: [],\n label_ids: [],\n milestone_id: null,\n comments: 0,\n closed_at: null,\n closed_by_id: null,\n is_pull_request: true,\n } as Omit<GitHubIssue, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issues.update(issueRow.id, { node_id: generateNodeId(\"Issue\", issueRow.id) });\n\n const commitCount = countCommitsBetween(gh, headRepo, headBranch.sha, baseBranch.sha);\n\n const prRow = gh.pullRequests.insert({\n node_id: \"\",\n number: num,\n repo_id: repo.id,\n title: title.trim(),\n body: prBody,\n state: \"open\",\n locked: false,\n user_id: actor.id,\n assignee_ids: [],\n label_ids: [],\n milestone_id: null,\n head_ref: headRef,\n head_sha: headBranch.sha,\n head_repo_id: headRepo.id,\n base_ref: baseRef,\n base_sha: baseBranch.sha,\n base_repo_id: repo.id,\n merged: false,\n merged_at: null,\n merged_by_id: null,\n merge_commit_sha: null,\n mergeable: true,\n mergeable_state: \"clean\",\n comments: 0,\n review_comments: 0,\n commits: Math.max(1, commitCount),\n additions: 0,\n deletions: 0,\n changed_files: 0,\n draft,\n requested_reviewer_ids: [],\n requested_team_ids: [],\n closed_at: null,\n auto_merge: null,\n } as Omit<GitHubPullRequest, \"id\" | \"created_at\" | \"updated_at\">);\n gh.pullRequests.update(prRow.id, { node_id: generateNodeId(\"PullRequest\", prRow.id) });\n\n adjustRepoOpenIssues(gh, repo.id, 1);\n\n const pr = gh.pullRequests.get(prRow.id)!;\n const prFmt = formatPullRequest(pr, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n webhooks.dispatch(\n \"pull_request\",\n \"opened\",\n {\n action: \"opened\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json(prFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const fmt = formatPullRequest(pr, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.patch(\"/repos/:owner/:repo/pulls/:pull_number\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubPullRequest> = {};\n const issuePatch: Partial<GitHubIssue> = {};\n\n if (typeof body.title === \"string\") {\n patch.title = body.title;\n issuePatch.title = body.title;\n }\n if (typeof body.body === \"string\" || body.body === null) {\n patch.body = body.body as string | null;\n issuePatch.body = body.body as string | null;\n }\n if (body.state === \"open\" || body.state === \"closed\") {\n const wasClosed = pr.state === \"closed\";\n patch.state = body.state;\n issuePatch.state = body.state;\n if (body.state === \"closed\") {\n patch.closed_at = timestamp();\n issuePatch.closed_at = timestamp();\n issuePatch.closed_by_id = actor.id;\n } else {\n patch.closed_at = null;\n issuePatch.closed_at = null;\n issuePatch.closed_by_id = null;\n }\n if (!wasClosed && body.state === \"closed\") {\n adjustRepoOpenIssues(gh, repo.id, -1);\n } else if (wasClosed && body.state === \"open\") {\n adjustRepoOpenIssues(gh, repo.id, 1);\n }\n }\n if (typeof body.base === \"string\" && body.base.trim()) {\n const newBase = body.base.trim();\n const bb = getOrCreateBranch(gh, repo, newBase);\n patch.base_ref = newBase;\n patch.base_sha = bb.sha;\n patch.base_repo_id = repo.id;\n }\n if (typeof body.draft === \"boolean\") {\n patch.draft = body.draft;\n }\n\n const updated = gh.pullRequests.update(pr.id, patch);\n if (!updated) throw notFoundResponse();\n\n const iss = findPrIssue(gh, repo.id, pullNumber);\n if (iss) {\n gh.issues.update(iss.id, issuePatch);\n }\n\n const fresh = gh.pullRequests.get(pr.id)!;\n const prFmt = formatPullRequest(fresh, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n if (body.state === \"closed\" && pr.state === \"open\") {\n webhooks.dispatch(\n \"pull_request\",\n \"closed\",\n {\n action: \"closed\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n } else if (body.state === \"open\" && pr.state === \"closed\") {\n webhooks.dispatch(\n \"pull_request\",\n \"reopened\",\n {\n action: \"reopened\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n } else if (\n typeof body.title === \"string\" ||\n typeof body.body === \"string\" ||\n body.body === null\n ) {\n webhooks.dispatch(\n \"pull_request\",\n \"edited\",\n {\n action: \"edited\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n\n return c.json(prFmt);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/merge\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n if (pr.merged || pr.state === \"closed\") {\n throw new ApiError(422, \"Pull Request is not mergeable\");\n }\n if (pr.draft) {\n throw new ApiError(422, \"Draft pull requests cannot be merged.\");\n }\n\n const body = await parseJsonBody(c);\n if (typeof body.sha === \"string\" && body.sha !== pr.head_sha) {\n throw new ApiError(422, \"Head sha is out of date\");\n }\n\n const mergeMethod =\n body.merge_method === \"squash\" || body.merge_method === \"rebase\"\n ? body.merge_method\n : \"merge\";\n\n if (mergeMethod === \"merge\" && !repo.allow_merge_commit) {\n throw new ApiError(422, \"Merge commits are not allowed on this repository.\");\n }\n if (mergeMethod === \"squash\" && !repo.allow_squash_merge) {\n throw new ApiError(422, \"Squash merges are not allowed on this repository.\");\n }\n if (mergeMethod === \"rebase\" && !repo.allow_rebase_merge) {\n throw new ApiError(422, \"Rebase merges are not allowed on this repository.\");\n }\n\n checkMergeRequirements(gh, pr);\n\n const baseRepo = gh.repos.get(pr.base_repo_id)!;\n const headRepo = gh.repos.get(pr.head_repo_id)!;\n\n const baseCommit = gh.commits\n .findBy(\"repo_id\", baseRepo.id)\n .find((x) => x.sha === pr.base_sha);\n const headCommit = gh.commits\n .findBy(\"repo_id\", headRepo.id)\n .find((x) => x.sha === pr.head_sha);\n\n if (!baseCommit || !headCommit) {\n throw new ApiError(422, \"Could not resolve commits to merge.\");\n }\n\n const commitTitle =\n typeof body.commit_title === \"string\" && body.commit_title.trim()\n ? body.commit_title.trim()\n : `Merge pull request #${pr.number} from ${headLabel(gh, pr)}`;\n const commitMessage =\n typeof body.commit_message === \"string\" && body.commit_message.trim()\n ? body.commit_message.trim()\n : \"\";\n\n const fullMessage = commitMessage ? `${commitTitle}\\n\\n${commitMessage}` : commitTitle;\n\n let mergeCommit: GitHubCommit;\n if (mergeMethod === \"merge\") {\n mergeCommit = insertCommit(gh, baseRepo, {\n treeSha: headCommit.tree_sha,\n parentShas: [pr.base_sha, pr.head_sha],\n message: fullMessage,\n user: actor,\n });\n } else {\n mergeCommit = insertCommit(gh, baseRepo, {\n treeSha: headCommit.tree_sha,\n parentShas: [pr.base_sha],\n message: fullMessage,\n user: actor,\n });\n }\n\n updateBranchSha(gh, baseRepo, pr.base_ref, mergeCommit.sha);\n\n const now = timestamp();\n gh.pullRequests.update(pr.id, {\n merged: true,\n merged_at: now,\n merged_by_id: actor.id,\n merge_commit_sha: mergeCommit.sha,\n state: \"closed\",\n closed_at: now,\n mergeable: false,\n mergeable_state: \"unknown\",\n });\n\n const iss = findPrIssue(gh, repo.id, pullNumber);\n if (iss) {\n gh.issues.update(iss.id, {\n state: \"closed\",\n closed_at: now,\n closed_by_id: actor.id,\n });\n }\n\n adjustRepoOpenIssues(gh, repo.id, -1);\n\n if (repo.delete_branch_on_merge && pr.head_ref !== pr.base_ref) {\n deleteBranchByName(gh, headRepo, pr.head_ref);\n }\n\n const mergedPr = gh.pullRequests.get(pr.id)!;\n const prFmt = formatPullRequest(mergedPr, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n webhooks.dispatch(\n \"pull_request\",\n \"closed\",\n {\n action: \"closed\",\n pull_request: { ...prFmt, merged: true },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json({\n sha: mergeCommit.sha,\n merged: true,\n message: \"Pull Request successfully merged\",\n });\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/commits\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const headRepo = gh.repos.get(pr.head_repo_id);\n if (!headRepo) throw notFoundResponse();\n\n const chain = walkCommitsToBase(gh, headRepo, pr.head_sha, pr.base_sha);\n const { page, per_page } = parsePagination(c);\n const total = chain.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const slice = chain.slice(start, start + per_page);\n\n return c.json(slice.map((commit) => formatCommitApi(commit, headRepo, baseUrl)));\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/files\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const n = pr.changed_files;\n const stubNames = Array.from({ length: n }, (_, i) => `file${i + 1}.ts`);\n const total = stubNames.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageNames = stubNames.slice(start, start + per_page);\n\n return c.json(\n pageNames.map((filename, i) => ({\n sha: generateSha(),\n filename,\n status: \"modified\",\n additions: 1,\n deletions: 0,\n changes: 1,\n blob_url: `${baseUrl}/${repo.full_name}/blob/${pr.head_sha}/${filename}`,\n raw_url: `${baseUrl}/${repo.full_name}/raw/${pr.head_sha}/${filename}`,\n contents_url: `${baseUrl}/repos/${repo.full_name}/contents/${encodeURIComponent(\n filename\n )}?ref=${pr.head_ref}`,\n patch: \"\",\n }))\n );\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/requested_reviewers\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const body = await parseJsonBody(c) as {\n reviewers?: unknown;\n team_reviewers?: unknown;\n };\n\n const reviewerLogins = Array.isArray(body.reviewers)\n ? body.reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n const teamSlugs = Array.isArray(body.team_reviewers)\n ? body.team_reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n\n const newUserIds = reviewerLogins.map((login) => lookupUserByLogin(gh, login).id);\n let newTeamIds: number[] = [];\n if (teamSlugs.length > 0) {\n if (repo.owner_type !== \"Organization\") {\n throw new ApiError(422, \"Team reviewers are only supported for organization repositories.\");\n }\n newTeamIds = teamSlugs.map((slug) => lookupTeamSlug(gh, repo.owner_id, slug).id);\n }\n\n const requested_reviewer_ids = [...new Set([...pr.requested_reviewer_ids, ...newUserIds])];\n const requested_team_ids = [...new Set([...pr.requested_team_ids, ...newTeamIds])];\n\n gh.pullRequests.update(pr.id, { requested_reviewer_ids, requested_team_ids });\n const fresh = gh.pullRequests.get(pr.id)!;\n const prFmt = formatPullRequest(fresh, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n webhooks.dispatch(\n \"pull_request\",\n \"review_requested\",\n {\n action: \"review_requested\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json(prFmt);\n });\n\n app.delete(\"/repos/:owner/:repo/pulls/:pull_number/requested_reviewers\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const body = await parseJsonBody(c) as {\n reviewers?: unknown;\n team_reviewers?: unknown;\n };\n\n const reviewerLogins = Array.isArray(body.reviewers)\n ? body.reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n const teamSlugs = Array.isArray(body.team_reviewers)\n ? body.team_reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n\n const removeUserIds = new Set(reviewerLogins.map((login) => lookupUserByLogin(gh, login).id));\n let removeTeamIds = new Set<number>();\n if (teamSlugs.length > 0 && repo.owner_type === \"Organization\") {\n removeTeamIds = new Set(teamSlugs.map((slug) => lookupTeamSlug(gh, repo.owner_id, slug).id));\n }\n\n const requested_reviewer_ids = pr.requested_reviewer_ids.filter((id) => !removeUserIds.has(id));\n const requested_team_ids = pr.requested_team_ids.filter((id) => !removeTeamIds.has(id));\n\n gh.pullRequests.update(pr.id, { requested_reviewer_ids, requested_team_ids });\n const fresh = gh.pullRequests.get(pr.id)!;\n return c.json(formatPullRequest(fresh, gh, baseUrl)!);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/update-branch\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n if (pr.state === \"closed\" || pr.merged) {\n throw new ApiError(422, \"Cannot update a closed pull request\");\n }\n\n const body = await parseJsonBody(c) as { expected_head_sha?: unknown };\n if (typeof body.expected_head_sha === \"string\" && body.expected_head_sha !== pr.head_sha) {\n throw new ApiError(422, \"Head sha is out of date\");\n }\n\n const headRepo = gh.repos.get(pr.head_repo_id);\n const baseRepo = gh.repos.get(pr.base_repo_id);\n if (!headRepo || !baseRepo) throw notFoundResponse();\n\n const headCommit = gh.commits\n .findBy(\"repo_id\", headRepo.id)\n .find((x) => x.sha === pr.head_sha);\n const baseCommit = gh.commits\n .findBy(\"repo_id\", baseRepo.id)\n .find((x) => x.sha === pr.base_sha);\n if (!headCommit || !baseCommit) throw new ApiError(422, \"Could not resolve commits.\");\n\n const actor = assertAuthenticatedUser(gh, c.get(\"authUser\"));\n const mergeMsg = `Merge branch '${pr.base_ref}' into ${pr.head_ref}`;\n const newCommit = insertCommit(gh, headRepo, {\n treeSha: headCommit.tree_sha,\n parentShas: [pr.head_sha, pr.base_sha],\n message: mergeMsg,\n user: actor,\n });\n\n updateBranchSha(gh, headRepo, pr.head_ref, newCommit.sha);\n const next = gh.pullRequests.update(pr.id, {\n head_sha: newCommit.sha,\n commits: pr.commits + 1,\n });\n if (!next) throw notFoundResponse();\n\n const apiUrl = `${baseUrl}/repos/${repo.full_name}/pulls/${pullNumber}`;\n return c.json(\n {\n message: \"Updating pull request branch.\",\n url: apiUrl,\n },\n 202\n );\n });\n}\n","import type { Context } from \"hono\";\nimport type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubComment, GitHubCommit, GitHubIssue, GitHubPullRequest, GitHubRepo } from \"../entities.js\";\nimport {\n formatComment,\n formatIssue,\n formatPullRequest,\n formatRepo,\n formatUser,\n generateNodeId,\n lookupRepo,\n} from \"../helpers.js\";\nimport {\n assertRepoRead,\n assertRepoWrite,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction findIssueByNumber(gh: GitHubStore, repoId: number, number: number): GitHubIssue | undefined {\n return gh.issues.findBy(\"repo_id\", repoId).find((i) => i.number === number);\n}\n\nfunction findPull(gh: GitHubStore, repoId: number, pullNumber: number): GitHubPullRequest | undefined {\n return gh.pullRequests\n .findBy(\"repo_id\", repoId)\n .find((p) => p.number === pullNumber);\n}\n\nfunction findCommitInRepo(gh: GitHubStore, repoId: number, shaParam: string): GitHubCommit | undefined {\n const want = shaParam.toLowerCase();\n const list = gh.commits.findBy(\"repo_id\", repoId);\n return list.find((c) => c.sha === shaParam || c.sha.toLowerCase() === want || c.sha.startsWith(shaParam));\n}\n\nfunction getCommentForRepo(\n gh: GitHubStore,\n repo: GitHubRepo,\n commentId: number,\n kind: GitHubComment[\"comment_type\"]\n): GitHubComment | undefined {\n const c = gh.comments.get(commentId);\n if (!c || c.repo_id !== repo.id || c.comment_type !== kind) return undefined;\n return c;\n}\n\nfunction sortComments(\n comments: GitHubComment[],\n sort: \"created\" | \"updated\",\n direction: \"asc\" | \"desc\"\n): GitHubComment[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const field = sort === \"created\" ? \"created_at\" : \"updated_at\";\n const sorted = [...comments];\n sorted.sort((a, b) => {\n const as = a[field];\n const bs = b[field];\n if (as < bs) return -1 * mul;\n if (as > bs) return 1 * mul;\n return a.id < b.id ? -1 * mul : a.id > b.id ? 1 * mul : 0;\n });\n return sorted;\n}\n\nfunction parseCommentSort(c: Context, defaultDirection: \"asc\" | \"desc\") {\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" = sortRaw === \"updated\" ? \"updated\" : \"created\";\n const dirRaw = c.req.query(\"direction\");\n const direction: \"asc\" | \"desc\" =\n dirRaw === \"desc\" ? \"desc\" : dirRaw === \"asc\" ? \"asc\" : defaultDirection;\n return { sort, direction };\n}\n\nfunction adjustIssueCommentCount(gh: GitHubStore, issue: GitHubIssue, delta: number) {\n gh.issues.update(issue.id, { comments: Math.max(0, issue.comments + delta) });\n}\n\nfunction adjustPrReviewCommentCount(gh: GitHubStore, pr: GitHubPullRequest, delta: number) {\n gh.pullRequests.update(pr.id, { review_comments: Math.max(0, pr.review_comments + delta) });\n}\n\nexport function commentsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Issue comments: specific paths before /issues/:issue_number/comments ---\n\n app.get(\"/repos/:owner/:repo/issues/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"issue\");\n if (!comment) throw notFoundResponse();\n\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/issues/comments/:comment_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n let comment = getCommentForRepo(gh, repo, commentId, \"issue\");\n if (!comment) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n if (typeof body.body !== \"string\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n comment = gh.comments.update(comment.id, { body: body.body })!;\n const issue = comment.issue_number !== null ? findIssueByNumber(gh, repo.id, comment.issue_number) : undefined;\n const ownerLogin = ownerLoginOf(gh, repo);\n const issueFmt = issue ? formatIssue(issue, gh, baseUrl) : null;\n const commentFmt = formatComment(comment, gh, baseUrl);\n if (!commentFmt) throw notFoundResponse();\n\n webhooks.dispatch(\n \"issue_comment\",\n \"edited\",\n {\n action: \"edited\",\n comment: commentFmt,\n issue: issueFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json(commentFmt);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"issue\");\n if (!comment) throw notFoundResponse();\n\n const issue =\n comment.issue_number !== null ? findIssueByNumber(gh, repo.id, comment.issue_number) : undefined;\n const commentFmt = formatComment(comment, gh, baseUrl);\n const issueFmt = issue ? formatIssue(issue, gh, baseUrl) : null;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n gh.comments.delete(comment.id);\n if (issue) adjustIssueCommentCount(gh, issue, -1);\n\n webhooks.dispatch(\n \"issue_comment\",\n \"deleted\",\n {\n action: \"deleted\",\n comment: commentFmt,\n issue: issueFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/issues/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n const since = c.req.query(\"since\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"issue\");\n if (since) {\n list = list.filter((x) => x.updated_at >= since);\n }\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n // --- Pull review comments ---\n\n app.get(\"/repos/:owner/:repo/pulls/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"review\");\n if (!comment) throw notFoundResponse();\n\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/pulls/comments/:comment_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n let comment = getCommentForRepo(gh, repo, commentId, \"review\");\n if (!comment) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n if (typeof body.body !== \"string\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n comment = gh.comments.update(comment.id, { body: body.body })!;\n const pr =\n comment.pull_number !== null ? findPull(gh, repo.id, comment.pull_number) : undefined;\n const ownerLogin = ownerLoginOf(gh, repo);\n const commentFmt = formatComment(comment, gh, baseUrl);\n if (!commentFmt) throw notFoundResponse();\n\n webhooks.dispatch(\n \"pull_request_review_comment\",\n \"edited\",\n {\n action: \"edited\",\n comment: commentFmt,\n pull_request: pr ? formatPullRequest(pr, gh, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json(commentFmt);\n });\n\n app.delete(\"/repos/:owner/:repo/pulls/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"review\");\n if (!comment) throw notFoundResponse();\n\n const pr =\n comment.pull_number !== null ? findPull(gh, repo.id, comment.pull_number) : undefined;\n const commentFmt = formatComment(comment, gh, baseUrl);\n const ownerLogin = ownerLoginOf(gh, repo);\n\n gh.comments.delete(comment.id);\n if (pr) adjustPrReviewCommentCount(gh, pr, -1);\n\n webhooks.dispatch(\n \"pull_request_review_comment\",\n \"deleted\",\n {\n action: \"deleted\",\n comment: commentFmt,\n pull_request: pr ? formatPullRequest(pr, gh, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"review\");\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n // --- Commit comments (repo scope) ---\n\n app.get(\"/repos/:owner/:repo/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"commit\");\n if (!comment) throw notFoundResponse();\n\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/comments/:comment_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n let comment = getCommentForRepo(gh, repo, commentId, \"commit\");\n if (!comment) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n if (typeof body.body !== \"string\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n comment = gh.comments.update(comment.id, { body: body.body })!;\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.delete(\"/repos/:owner/:repo/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"commit\");\n if (!comment) throw notFoundResponse();\n\n gh.comments.delete(comment.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"commit\");\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n // --- Per-issue / per-PR / per-commit ---\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"issue\" && x.issue_number === issueNumber);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/issues/:issue_number/comments\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" || !raw.body.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const row = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: issueNumber,\n pull_number: null,\n commit_sha: null,\n body: raw.body,\n user_id: actor.id,\n in_reply_to_id: null,\n path: null,\n position: null,\n line: null,\n side: null,\n subject_type: null,\n comment_type: \"issue\",\n review_id: null,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(row.id, { node_id: generateNodeId(\"IssueComment\", row.id) });\n const comment = gh.comments.get(row.id)!;\n\n adjustIssueCommentCount(gh, issue, 1);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const commentFmt = formatComment(comment, gh, baseUrl)!;\n\n webhooks.dispatch(\n \"issue_comment\",\n \"created\",\n {\n action: \"created\",\n comment: commentFmt,\n issue: formatIssue(issue, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json(commentFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"review\" && x.pull_number === pullNumber);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/comments\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" || !raw.body.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const commitSha =\n typeof raw.commit_id === \"string\" && raw.commit_id.trim()\n ? raw.commit_id.trim()\n : pr.head_sha;\n\n let inReplyTo: number | null = null;\n if (raw.in_reply_to_id !== undefined && raw.in_reply_to_id !== null) {\n const rid = typeof raw.in_reply_to_id === \"number\" ? raw.in_reply_to_id : parseInt(String(raw.in_reply_to_id), 10);\n if (!Number.isFinite(rid)) throw new ApiError(422, \"Validation failed\");\n const parent = gh.comments.get(rid);\n if (\n !parent ||\n parent.repo_id !== repo.id ||\n parent.comment_type !== \"review\" ||\n parent.pull_number !== pullNumber\n ) {\n throw new ApiError(422, \"Validation failed\");\n }\n inReplyTo = rid;\n }\n\n const pathVal =\n raw.path === undefined || raw.path === null\n ? null\n : typeof raw.path === \"string\"\n ? raw.path\n : null;\n const position =\n raw.position === undefined || raw.position === null\n ? null\n : typeof raw.position === \"number\" && Number.isFinite(raw.position)\n ? raw.position\n : parseInt(String(raw.position), 10);\n const line =\n raw.line === undefined || raw.line === null\n ? null\n : typeof raw.line === \"number\" && Number.isFinite(raw.line)\n ? raw.line\n : parseInt(String(raw.line), 10);\n let side: \"LEFT\" | \"RIGHT\" | null = null;\n if (raw.side === \"LEFT\" || raw.side === \"RIGHT\") side = raw.side;\n else if (raw.side === null || raw.side === undefined) side = null;\n else throw new ApiError(422, \"Validation failed\");\n\n let subjectType: \"line\" | \"file\" | null = null;\n if (raw.subject_type === \"line\" || raw.subject_type === \"file\") subjectType = raw.subject_type;\n else if (raw.subject_type === null || raw.subject_type === undefined) subjectType = null;\n else throw new ApiError(422, \"Validation failed\");\n\n if (position !== null && !Number.isFinite(position)) throw new ApiError(422, \"Validation failed\");\n if (line !== null && !Number.isFinite(line)) throw new ApiError(422, \"Validation failed\");\n\n const row = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: null,\n pull_number: pullNumber,\n commit_sha: commitSha,\n body: raw.body,\n user_id: actor.id,\n in_reply_to_id: inReplyTo,\n path: pathVal,\n position: position !== null && Number.isFinite(position) ? position : null,\n line: line !== null && Number.isFinite(line) ? line : null,\n side,\n subject_type: subjectType,\n comment_type: \"review\",\n review_id: null,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(row.id, { node_id: generateNodeId(\"PullRequestReviewComment\", row.id) });\n const comment = gh.comments.get(row.id)!;\n\n adjustPrReviewCommentCount(gh, pr, 1);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const commentFmt = formatComment(comment, gh, baseUrl)!;\n\n webhooks.dispatch(\n \"pull_request_review_comment\",\n \"created\",\n {\n action: \"created\",\n comment: commentFmt,\n pull_request: formatPullRequest(pr, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json(commentFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/commits/:commit_sha/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const commitSha = c.req.param(\"commit_sha\")!;\n const commit = findCommitInRepo(gh, repo.id, commitSha);\n if (!commit) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"commit\" && x.commit_sha === commit.sha);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/commits/:commit_sha/comments\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commitShaParam = c.req.param(\"commit_sha\")!;\n const commit = findCommitInRepo(gh, repo.id, commitShaParam);\n if (!commit) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" || !raw.body.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const pathVal =\n raw.path === undefined || raw.path === null\n ? null\n : typeof raw.path === \"string\"\n ? raw.path\n : null;\n const position =\n raw.position === undefined || raw.position === null\n ? null\n : typeof raw.position === \"number\" && Number.isFinite(raw.position)\n ? raw.position\n : parseInt(String(raw.position), 10);\n const line =\n raw.line === undefined || raw.line === null\n ? null\n : typeof raw.line === \"number\" && Number.isFinite(raw.line)\n ? raw.line\n : parseInt(String(raw.line), 10);\n\n if (position !== null && !Number.isFinite(position)) throw new ApiError(422, \"Validation failed\");\n if (line !== null && !Number.isFinite(line)) throw new ApiError(422, \"Validation failed\");\n\n const row = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: null,\n pull_number: null,\n commit_sha: commit.sha,\n body: raw.body,\n user_id: actor.id,\n in_reply_to_id: null,\n path: pathVal,\n position: position !== null && Number.isFinite(position) ? position : null,\n line: line !== null && Number.isFinite(line) ? line : null,\n side: null,\n subject_type: null,\n comment_type: \"commit\",\n review_id: null,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(row.id, { node_id: generateNodeId(\"CommitComment\", row.id) });\n const comment = gh.comments.get(row.id)!;\n\n const commentFmt = formatComment(comment, gh, baseUrl)!;\n return c.json(commentFmt, 201);\n });\n}\n","import type { Context } from \"hono\";\nimport type { RouteContext, WebhookDispatcher } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubComment, GitHubPullRequest, GitHubRepo, GitHubReview, GitHubUser } from \"../entities.js\";\nimport {\n formatComment,\n formatPullRequest,\n formatRepo,\n formatReview,\n formatUser,\n generateNodeId,\n generateSha,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport {\n assertRepoRead,\n assertRepoWrite,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction findPull(gh: GitHubStore, repoId: number, pullNumber: number): GitHubPullRequest | undefined {\n return gh.pullRequests\n .findBy(\"repo_id\", repoId)\n .find((p) => p.number === pullNumber);\n}\n\nfunction findReview(\n gh: GitHubStore,\n repo: GitHubRepo,\n pullNumber: number,\n reviewId: number\n): GitHubReview | undefined {\n const r = gh.reviews.get(reviewId);\n if (!r || r.repo_id !== repo.id || r.pull_number !== pullNumber) return undefined;\n return r;\n}\n\nfunction adjustPrReviewCommentCount(gh: GitHubStore, pr: GitHubPullRequest, delta: number) {\n gh.pullRequests.update(pr.id, { review_comments: Math.max(0, pr.review_comments + delta) });\n}\n\nfunction sortComments(\n comments: GitHubComment[],\n sort: \"created\" | \"updated\",\n direction: \"asc\" | \"desc\"\n): GitHubComment[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const field = sort === \"created\" ? \"created_at\" : \"updated_at\";\n const sorted = [...comments];\n sorted.sort((a, b) => {\n const as = a[field];\n const bs = b[field];\n if (as < bs) return -1 * mul;\n if (as > bs) return 1 * mul;\n return a.id < b.id ? -1 * mul : a.id > b.id ? 1 * mul : 0;\n });\n return sorted;\n}\n\nfunction parseCommentSort(c: Context, defaultDirection: \"asc\" | \"desc\") {\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" = sortRaw === \"updated\" ? \"updated\" : \"created\";\n const dirRaw = c.req.query(\"direction\");\n const direction: \"asc\" | \"desc\" =\n dirRaw === \"desc\" ? \"desc\" : dirRaw === \"asc\" ? \"asc\" : defaultDirection;\n return { sort, direction };\n}\n\nfunction parseSubmitEvent(raw: unknown): \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\" {\n if (raw === \"APPROVE\" || raw === \"REQUEST_CHANGES\" || raw === \"COMMENT\") return raw;\n throw new ApiError(422, \"Validation failed\");\n}\n\nfunction eventToState(event: \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\"): GitHubReview[\"state\"] {\n switch (event) {\n case \"APPROVE\":\n return \"APPROVED\";\n case \"REQUEST_CHANGES\":\n return \"CHANGES_REQUESTED\";\n case \"COMMENT\":\n return \"COMMENTED\";\n default:\n return \"COMMENTED\";\n }\n}\n\nfunction dispatchReviewWebhook(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n review: GitHubReview,\n pr: GitHubPullRequest,\n actor: GitHubUser,\n baseUrl: string,\n action: \"submitted\" | \"dismissed\"\n) {\n const ownerLogin = ownerLoginOf(gh, repo);\n const reviewFmt = formatReview(review, gh, baseUrl);\n if (!reviewFmt) return;\n webhooks.dispatch(\n \"pull_request_review\",\n action,\n {\n action,\n review: reviewFmt,\n pull_request: formatPullRequest(pr, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n}\n\nexport function reviewsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/reviews\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n let list = gh.reviews\n .findBy(\"repo_id\", repo.id)\n .filter((r) => r.pull_number === pullNumber);\n list.sort((a, b) => a.id - b.id);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((r) => formatReview(r, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/reviews\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n\n const eventRaw = raw.event;\n const hasEvent =\n eventRaw === \"APPROVE\" || eventRaw === \"REQUEST_CHANGES\" || eventRaw === \"COMMENT\";\n if (eventRaw !== undefined && eventRaw !== null && !hasEvent) {\n throw new ApiError(422, \"Validation failed\");\n }\n const event = hasEvent ? parseSubmitEvent(eventRaw) : undefined;\n\n let bodyText: string | null = null;\n if (typeof raw.body === \"string\") bodyText = raw.body;\n else if (raw.body === null || raw.body === undefined) bodyText = null;\n else throw new ApiError(422, \"Validation failed\");\n\n const commitId =\n typeof raw.commit_id === \"string\" && raw.commit_id.trim()\n ? raw.commit_id.trim()\n : pr.head_sha || generateSha();\n\n const state: GitHubReview[\"state\"] = event ? eventToState(event) : \"PENDING\";\n const submittedAt = event ? timestamp() : null;\n\n const row = gh.reviews.insert({\n node_id: \"\",\n repo_id: repo.id,\n pull_number: pullNumber,\n user_id: actor.id,\n body: bodyText,\n state,\n commit_id: commitId,\n submitted_at: submittedAt,\n } as Omit<GitHubReview, \"id\" | \"created_at\" | \"updated_at\">);\n gh.reviews.update(row.id, { node_id: generateNodeId(\"PullRequestReview\", row.id) });\n const review = gh.reviews.get(row.id)!;\n\n const commentsArr = Array.isArray(raw.comments) ? raw.comments : [];\n for (const entry of commentsArr) {\n if (!entry || typeof entry !== \"object\") throw new ApiError(422, \"Validation failed\");\n const o = entry as Record<string, unknown>;\n if (typeof o.path !== \"string\" || !o.path.trim()) throw new ApiError(422, \"Validation failed\");\n const pos =\n typeof o.position === \"number\" && Number.isFinite(o.position)\n ? o.position\n : parseInt(String(o.position), 10);\n if (!Number.isFinite(pos)) throw new ApiError(422, \"Validation failed\");\n if (typeof o.body !== \"string\") throw new ApiError(422, \"Validation failed\");\n\n const cRow = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: null,\n pull_number: pullNumber,\n commit_sha: commitId,\n body: o.body,\n user_id: actor.id,\n in_reply_to_id: null,\n path: o.path,\n position: pos,\n line: null,\n side: \"RIGHT\",\n subject_type: \"line\",\n comment_type: \"review\",\n review_id: review.id,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(cRow.id, { node_id: generateNodeId(\"PullRequestReviewComment\", cRow.id) });\n adjustPrReviewCommentCount(gh, pr, 1);\n }\n\n if (event) {\n dispatchReviewWebhook(webhooks, gh, repo, review, pr, actor, baseUrl, \"submitted\");\n }\n\n const json = formatReview(review, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json, 201);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n\n const json = formatReview(review, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const existing = findReview(gh, repo, pullNumber, reviewId);\n if (!existing) throw notFoundResponse();\n if (existing.state !== \"PENDING\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" && raw.body !== null) {\n throw new ApiError(422, \"Validation failed\");\n }\n const bodyVal = typeof raw.body === \"string\" ? raw.body : null;\n\n const updated = gh.reviews.update(reviewId, { body: bodyVal });\n if (!updated) throw notFoundResponse();\n\n const json = formatReview(updated, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/events\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n if (review.state !== \"PENDING\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const raw = await parseJsonBody(c);\n const event = parseSubmitEvent(raw.event);\n\n let bodyText: string | null = review.body;\n if (typeof raw.body === \"string\") bodyText = raw.body;\n else if (raw.body === null) bodyText = null;\n else if (raw.body !== undefined) throw new ApiError(422, \"Validation failed\");\n\n const nextState = eventToState(event);\n const updated = gh.reviews.update(reviewId, {\n body: bodyText,\n state: nextState,\n submitted_at: timestamp(),\n });\n if (!updated) throw notFoundResponse();\n\n dispatchReviewWebhook(webhooks, gh, repo, updated, pr, actor, baseUrl, \"submitted\");\n\n const json = formatReview(updated, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/dismissals\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n if (review.state === \"PENDING\" || review.state === \"DISMISSED\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const raw = await parseJsonBody(c);\n const message = typeof raw.message === \"string\" ? raw.message : null;\n\n const updated = gh.reviews.update(reviewId, {\n state: \"DISMISSED\",\n body: message !== null && message !== undefined ? message : review.body,\n });\n if (!updated) throw notFoundResponse();\n\n dispatchReviewWebhook(webhooks, gh, repo, updated, pr, actor, baseUrl, \"dismissed\");\n\n const json = formatReview(updated, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter(\n (x) =>\n x.comment_type === \"review\" &&\n x.pull_number === pullNumber &&\n x.review_id === reviewId\n );\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n}\n","import type { Context } from \"hono\";\nimport type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubIssue, GitHubIssueEvent, GitHubLabel, GitHubMilestone, GitHubRepo, GitHubUser } from \"../entities.js\";\nimport {\n formatIssue,\n formatLabel,\n formatMilestone,\n formatPullRequest,\n formatRepo,\n formatUser,\n generateNodeId,\n getNextMilestoneNumber,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport {\n assertIssueWrite,\n assertRepoRead,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction findIssueByNumber(gh: GitHubStore, repoId: number, issueNumber: number): GitHubIssue | undefined {\n return gh.issues.findBy(\"repo_id\", repoId).find((i) => i.number === issueNumber);\n}\n\nfunction findPullByNumber(gh: GitHubStore, repoId: number, num: number) {\n return gh.pullRequests.findBy(\"repo_id\", repoId).find((p) => p.number === num);\n}\n\nfunction formatIssueOrPullPayload(\n gh: GitHubStore,\n issue: GitHubIssue,\n current: GitHubIssue,\n baseUrl: string\n) {\n if (issue.is_pull_request) {\n const pr = findPullByNumber(gh, issue.repo_id, issue.number);\n return pr ? formatPullRequest(pr, gh, baseUrl) : null;\n }\n return formatIssue(current, gh, baseUrl);\n}\n\n/** Keep issue and pull request rows in sync for label_ids. */\nfunction setIssueLabelIds(gh: GitHubStore, issue: GitHubIssue, labelIds: number[]) {\n gh.issues.update(issue.id, { label_ids: labelIds });\n if (issue.is_pull_request) {\n const pr = findPullByNumber(gh, issue.repo_id, issue.number);\n if (pr) gh.pullRequests.update(pr.id, { label_ids: labelIds });\n }\n}\n\nfunction insertIssueEvent(\n gh: GitHubStore,\n repo: GitHubRepo,\n issueNumber: number,\n event: string,\n actorId: number,\n extra?: Partial<\n Pick<\n GitHubIssueEvent,\n \"commit_id\" | \"commit_url\" | \"label_name\" | \"assignee_id\" | \"milestone_title\" | \"rename\"\n >\n >\n): GitHubIssueEvent {\n const row = gh.issueEvents.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: issueNumber,\n event,\n actor_id: actorId,\n commit_id: null,\n commit_url: null,\n label_name: null,\n assignee_id: null,\n milestone_title: null,\n rename: null,\n ...extra,\n } as Omit<GitHubIssueEvent, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issueEvents.update(row.id, { node_id: generateNodeId(\"IssueEvent\", row.id) });\n return gh.issueEvents.get(row.id)!;\n}\n\nfunction randomLabelColor(): string {\n return Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, \"0\");\n}\n\nfunction normalizeColor(raw: unknown): string {\n if (typeof raw !== \"string\" || !raw.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n let s = raw.trim().replace(/^#/, \"\");\n if (!/^[0-9a-fA-F]{6}$/.test(s)) {\n throw new ApiError(422, \"Validation failed\");\n }\n return s.toLowerCase();\n}\n\nfunction getOrCreateLabel(gh: GitHubStore, repo: GitHubRepo, name: string): GitHubLabel {\n const existing = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (existing) return existing;\n const label = gh.labels.insert({\n node_id: \"\",\n repo_id: repo.id,\n name,\n description: null,\n color: randomLabelColor(),\n default: false,\n } as Omit<GitHubLabel, \"id\" | \"created_at\" | \"updated_at\">);\n gh.labels.update(label.id, { node_id: generateNodeId(\"Label\", label.id) });\n return gh.labels.get(label.id)!;\n}\n\nasync function parseLabelNamesFromBody(c: Context): Promise<string[]> {\n const raw = await c.req.json().catch(() => null);\n if (raw === null) throw new ApiError(422, \"Validation failed\");\n let arr: unknown[];\n if (Array.isArray(raw)) {\n arr = raw;\n } else if (typeof raw === \"object\" && raw !== null && Array.isArray((raw as { labels?: unknown }).labels)) {\n arr = (raw as { labels: unknown[] }).labels;\n } else {\n throw new ApiError(422, \"Validation failed\");\n }\n const names = arr.filter((x): x is string => typeof x === \"string\" && x.length > 0);\n if (names.length !== arr.length) throw new ApiError(422, \"Validation failed\");\n return names;\n}\n\nfunction removeLabelFromAllIssuesAndPrs(gh: GitHubStore, repoId: number, labelId: number) {\n for (const i of gh.issues.findBy(\"repo_id\", repoId)) {\n if (i.label_ids.includes(labelId)) {\n const next = i.label_ids.filter((id) => id !== labelId);\n setIssueLabelIds(gh, i, next);\n }\n }\n}\n\nfunction recalcMilestoneIssueCounts(gh: GitHubStore, repoId: number, milestoneId: number): GitHubMilestone | undefined {\n const m = gh.milestones.get(milestoneId);\n if (!m) return undefined;\n const items = gh.issues.findBy(\"repo_id\", repoId).filter((i) => i.milestone_id === milestoneId);\n let open = 0;\n let closed = 0;\n for (const i of items) {\n if (i.state === \"open\") open++;\n else closed++;\n }\n return gh.milestones.update(milestoneId, { open_issues: open, closed_issues: closed }) ?? m;\n}\n\nfunction sortMilestones(\n list: GitHubMilestone[],\n sort: \"due_on\" | \"completeness\",\n direction: \"asc\" | \"desc\"\n): GitHubMilestone[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const sorted = [...list];\n sorted.sort((a, b) => {\n if (sort === \"due_on\") {\n const aNull = a.due_on === null;\n const bNull = b.due_on === null;\n if (aNull && bNull) return 0;\n // Asc: no due date last. Desc: no due date first (GitHub-style).\n if (aNull) return direction === \"asc\" ? 1 : -1;\n if (bNull) return direction === \"asc\" ? -1 : 1;\n const cmp = a.due_on! < b.due_on! ? -1 : a.due_on! > b.due_on! ? 1 : 0;\n return cmp * mul;\n }\n const totalA = a.open_issues + a.closed_issues;\n const totalB = b.open_issues + b.closed_issues;\n const pctA = totalA === 0 ? 0 : a.closed_issues / totalA;\n const pctB = totalB === 0 ? 0 : b.closed_issues / totalB;\n const cmp = pctA < pctB ? -1 : pctA > pctB ? 1 : 0;\n return cmp * mul;\n });\n return sorted;\n}\n\nexport function labelsAndMilestonesRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const { page, per_page } = parsePagination(c);\n let list = gh.labels.findBy(\"repo_id\", repo.id).slice();\n list.sort((a, b) => a.name.localeCompare(b.name));\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n return c.json(pageItems.map((l) => formatLabel(l, repo, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/labels\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : \"\";\n if (!name) throw new ApiError(422, \"Validation failed\");\n\n const dup = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (dup) throw new ApiError(422, \"Validation failed\");\n\n const color =\n body.color !== undefined && body.color !== null\n ? normalizeColor(body.color)\n : randomLabelColor();\n const description =\n typeof body.description === \"string\" || body.description === null ? (body.description as string | null) : null;\n\n const row = gh.labels.insert({\n node_id: \"\",\n repo_id: repo.id,\n name,\n description,\n color,\n default: false,\n } as Omit<GitHubLabel, \"id\" | \"created_at\" | \"updated_at\">);\n gh.labels.update(row.id, { node_id: generateNodeId(\"Label\", row.id) });\n const label = gh.labels.get(row.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"label\",\n \"created\",\n {\n action: \"created\",\n label: formatLabel(label, repo, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json(formatLabel(label, repo, baseUrl), 201);\n });\n\n app.get(\"/repos/:owner/:repo/labels/:name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const rawName = c.req.param(\"name\")!;\n const name = decodeURIComponent(rawName);\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (!label) throw notFoundResponse();\n return c.json(formatLabel(label, repo, baseUrl));\n });\n\n app.patch(\"/repos/:owner/:repo/labels/:name\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const rawName = c.req.param(\"name\")!;\n const name = decodeURIComponent(rawName);\n let label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (!label) throw notFoundResponse();\n const labelId = label.id;\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubLabel> = {};\n if (typeof body.new_name === \"string\" && body.new_name.trim()) {\n const nn = body.new_name.trim();\n const clash = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === nn && l.id !== labelId);\n if (clash) throw new ApiError(422, \"Validation failed\");\n patch.name = nn;\n }\n if (body.color !== undefined) {\n patch.color = normalizeColor(body.color);\n }\n if (\"description\" in body) {\n patch.description =\n typeof body.description === \"string\" || body.description === null\n ? (body.description as string | null)\n : null;\n }\n\n const updated = gh.labels.update(labelId, patch);\n if (!updated) throw notFoundResponse();\n label = updated;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"label\",\n \"edited\",\n {\n action: \"edited\",\n label: formatLabel(label, repo, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json(formatLabel(label, repo, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/labels/:name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const rawName = c.req.param(\"name\")!;\n const name = decodeURIComponent(rawName);\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (!label) throw notFoundResponse();\n\n removeLabelFromAllIssuesAndPrs(gh, repo.id, label.id);\n gh.labels.delete(label.id);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"label\",\n \"deleted\",\n {\n action: \"deleted\",\n label: formatLabel(label, repo, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const labels = issue.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labels);\n });\n\n app.post(\"/repos/:owner/:repo/issues/:issue_number/labels\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const names = await parseLabelNamesFromBody(c);\n const prev = new Set(issue.label_ids);\n const ids = [...prev];\n for (const n of names) {\n const label = getOrCreateLabel(gh, repo, n);\n if (!ids.includes(label.id)) ids.push(label.id);\n }\n setIssueLabelIds(gh, issue, ids);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const after = gh.issues.get(issue.id)!;\n for (const id of after.label_ids) {\n if (!prev.has(id)) {\n const lbl = gh.labels.get(id);\n if (lbl) {\n insertIssueEvent(gh, repo, issue.number, \"labeled\", actor.id, { label_name: lbl.name });\n webhooks.dispatch(\n \"issues\",\n \"labeled\",\n {\n action: \"labeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: lbl ? { name: lbl.name, color: lbl.color } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n }\n }\n\n const labelsJson = after.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labelsJson);\n });\n\n app.put(\"/repos/:owner/:repo/issues/:issue_number/labels\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const names = await parseLabelNamesFromBody(c);\n const newIds = [...new Set(names.map((n) => getOrCreateLabel(gh, repo, n).id))];\n const prev = new Set(issue.label_ids);\n\n setIssueLabelIds(gh, issue, newIds);\n const after = gh.issues.get(issue.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n for (const id of prev) {\n if (!newIds.includes(id)) {\n const lbl = gh.labels.get(id);\n insertIssueEvent(gh, repo, issue.number, \"unlabeled\", actor.id, { label_name: lbl?.name ?? null });\n webhooks.dispatch(\n \"issues\",\n \"unlabeled\",\n {\n action: \"unlabeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: lbl ? { name: lbl.name, color: lbl.color } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n }\n for (const id of newIds) {\n if (!prev.has(id)) {\n const lbl = gh.labels.get(id);\n if (lbl) {\n insertIssueEvent(gh, repo, issue.number, \"labeled\", actor.id, { label_name: lbl.name });\n webhooks.dispatch(\n \"issues\",\n \"labeled\",\n {\n action: \"labeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: { name: lbl.name, color: lbl.color },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n }\n }\n\n const labelsJson = after.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labelsJson);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/labels/:name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const rawLabelName = c.req.param(\"name\")!;\n const labelName = decodeURIComponent(rawLabelName);\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === labelName);\n if (!label || !issue.label_ids.includes(label.id)) throw notFoundResponse();\n\n const next = issue.label_ids.filter((id) => id !== label.id);\n setIssueLabelIds(gh, issue, next);\n const after = gh.issues.get(issue.id)!;\n\n insertIssueEvent(gh, repo, issue.number, \"unlabeled\", actor.id, { label_name: label.name });\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"issues\",\n \"unlabeled\",\n {\n action: \"unlabeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: { name: label.name, color: label.color },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n const labelsJson = after.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labelsJson);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n setIssueLabelIds(gh, issue, []);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/milestones\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const stateQ = c.req.query(\"state\") ?? \"open\";\n const state: \"open\" | \"closed\" | \"all\" =\n stateQ === \"closed\" || stateQ === \"all\" || stateQ === \"open\" ? stateQ : \"open\";\n\n const sortRaw = c.req.query(\"sort\") ?? \"due_on\";\n const sort: \"due_on\" | \"completeness\" = sortRaw === \"completeness\" ? \"completeness\" : \"due_on\";\n\n const dirRaw = c.req.query(\"direction\") ?? \"desc\";\n const direction: \"asc\" | \"desc\" = dirRaw === \"asc\" ? \"asc\" : \"desc\";\n\n let list = gh.milestones.findBy(\"repo_id\", repo.id).map((m) => recalcMilestoneIssueCounts(gh, repo.id, m.id)!);\n\n if (state === \"open\") list = list.filter((m) => m.state === \"open\");\n else if (state === \"closed\") list = list.filter((m) => m.state === \"closed\");\n\n list = sortMilestones(list, sort, direction);\n\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n return c.json(pageItems.map((m) => formatMilestone(m, repo, gh, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/milestones\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const title = typeof body.title === \"string\" ? body.title.trim() : \"\";\n if (!title) throw new ApiError(422, \"Validation failed\");\n\n let state: \"open\" | \"closed\" = \"open\";\n if (body.state === \"open\" || body.state === \"closed\") state = body.state;\n\n const description =\n typeof body.description === \"string\" || body.description === null ? (body.description as string | null) : null;\n\n let due_on: string | null = null;\n if (\"due_on\" in body) {\n if (body.due_on === null) {\n due_on = null;\n } else if (typeof body.due_on === \"string\") {\n due_on = body.due_on;\n } else {\n throw new ApiError(422, \"Validation failed\");\n }\n }\n\n const num = getNextMilestoneNumber(gh, repo.id);\n const closed_at = state === \"closed\" ? timestamp() : null;\n\n const row = gh.milestones.insert({\n node_id: \"\",\n repo_id: repo.id,\n number: num,\n title,\n description,\n state,\n open_issues: 0,\n closed_issues: 0,\n due_on,\n closed_at,\n creator_id: actor.id,\n } as Omit<GitHubMilestone, \"id\" | \"created_at\" | \"updated_at\">);\n gh.milestones.update(row.id, { node_id: generateNodeId(\"Milestone\", row.id) });\n let m = recalcMilestoneIssueCounts(gh, repo.id, row.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"milestone\",\n state === \"closed\" ? \"closed\" : \"created\",\n {\n action: state === \"closed\" ? \"closed\" : \"created\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.json(formatMilestone(m, repo, gh, baseUrl), 201);\n });\n\n app.get(\"/repos/:owner/:repo/milestones/:milestone_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n const raw = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === n);\n if (!raw) throw notFoundResponse();\n const m = recalcMilestoneIssueCounts(gh, repo.id, raw.id)!;\n return c.json(formatMilestone(m, repo, gh, baseUrl));\n });\n\n app.patch(\"/repos/:owner/:repo/milestones/:milestone_number\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n let m = gh.milestones.findBy(\"repo_id\", repo.id).find((x) => x.number === n);\n if (!m) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubMilestone> = {};\n\n if (typeof body.title === \"string\") patch.title = body.title;\n if (body.state === \"open\" || body.state === \"closed\") {\n patch.state = body.state;\n }\n if (\"description\" in body) {\n patch.description =\n typeof body.description === \"string\" || body.description === null\n ? (body.description as string | null)\n : null;\n }\n if (\"due_on\" in body) {\n if (body.due_on === null) patch.due_on = null;\n else if (typeof body.due_on === \"string\") patch.due_on = body.due_on;\n else throw new ApiError(422, \"Validation failed\");\n }\n\n const prevState = m.state;\n if (patch.state === \"closed\" && prevState === \"open\") {\n patch.closed_at = m.closed_at ?? timestamp();\n } else if (patch.state === \"open\" && prevState === \"closed\") {\n patch.closed_at = null;\n }\n\n const updated = gh.milestones.update(m.id, patch);\n if (!updated) throw notFoundResponse();\n m = recalcMilestoneIssueCounts(gh, repo.id, updated.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n if (patch.state === \"closed\" && prevState === \"open\") {\n webhooks.dispatch(\n \"milestone\",\n \"closed\",\n {\n action: \"closed\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n } else if (patch.state === \"open\" && prevState === \"closed\") {\n webhooks.dispatch(\n \"milestone\",\n \"opened\",\n {\n action: \"opened\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n } else {\n webhooks.dispatch(\n \"milestone\",\n \"edited\",\n {\n action: \"edited\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n }\n\n return c.json(formatMilestone(m, repo, gh, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/milestones/:milestone_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n const m = gh.milestones.findBy(\"repo_id\", repo.id).find((x) => x.number === n);\n if (!m) throw notFoundResponse();\n\n for (const i of gh.issues.findBy(\"repo_id\", repo.id)) {\n if (i.milestone_id === m.id) gh.issues.update(i.id, { milestone_id: null });\n }\n for (const p of gh.pullRequests.findBy(\"repo_id\", repo.id)) {\n if (p.milestone_id === m.id) gh.pullRequests.update(p.id, { milestone_id: null });\n }\n\n gh.milestones.delete(m.id);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"milestone\",\n \"deleted\",\n {\n action: \"deleted\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/milestones/:milestone_number/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === n);\n if (!ms) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n\n const labelIdSet = new Set<number>();\n for (const i of gh.issues.findBy(\"repo_id\", repo.id)) {\n if (i.milestone_id !== ms.id) continue;\n for (const lid of i.label_ids) labelIdSet.add(lid);\n }\n\n let labels = [...labelIdSet]\n .map((id) => gh.labels.get(id))\n .filter(Boolean) as GitHubLabel[];\n labels.sort((a, b) => a.name.localeCompare(b.name));\n\n const total = labels.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = labels.slice(start, start + per_page);\n return c.json(pageItems.map((l) => formatLabel(l, repo, baseUrl)));\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBlob,\n GitHubBranch,\n GitHubBranchProtection,\n GitHubCommit,\n GitHubRef,\n GitHubRepo,\n GitHubTag,\n GitHubTree,\n GitHubUser,\n} from \"../entities.js\";\nimport {\n formatBranch,\n formatRepo,\n formatUser,\n generateNodeId,\n generateSha,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoAdmin,\n assertRepoRead,\n assertRepoWrite,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction findBranchByName(gh: GitHubStore, repoId: number, name: string) {\n return gh.branches.findBy(\"repo_id\", repoId).find((b) => b.name === name);\n}\n\nfunction findCommitBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.commits.findBy(\"repo_id\", repoId).find((c) => c.sha === sha);\n}\n\nfunction findTreeBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.trees.findBy(\"repo_id\", repoId).find((t) => t.sha === sha);\n}\n\nfunction findBlobBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.blobs.findBy(\"repo_id\", repoId).find((b) => b.sha === sha);\n}\n\nfunction findTagObjectBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.tags.findBy(\"repo_id\", repoId).find((t) => t.sha === sha);\n}\n\nfunction fullRefFromParam(refParam: string): string {\n return refParam.startsWith(\"refs/\") ? refParam : `refs/${refParam}`;\n}\n\nfunction isDescendantOf(\n gh: GitHubStore,\n repoId: number,\n ancestorSha: string,\n descendantSha: string\n): boolean {\n const visiting = new Set<string>();\n const stack = [descendantSha];\n while (stack.length) {\n const sha = stack.pop()!;\n if (sha === ancestorSha) return true;\n if (visiting.has(sha)) continue;\n visiting.add(sha);\n const commit = findCommitBySha(gh, repoId, sha);\n if (!commit) continue;\n for (const p of commit.parent_shas) stack.push(p);\n }\n return false;\n}\n\nfunction resolveGitObjectType(\n gh: GitHubStore,\n repoId: number,\n sha: string\n): \"commit\" | \"tag\" | \"blob\" | \"tree\" {\n if (findCommitBySha(gh, repoId, sha)) return \"commit\";\n if (findTagObjectBySha(gh, repoId, sha)) return \"tag\";\n if (findTreeBySha(gh, repoId, sha)) return \"tree\";\n if (findBlobBySha(gh, repoId, sha)) return \"blob\";\n return \"commit\";\n}\n\nfunction objectApiUrl(\n repo: GitHubRepo,\n baseUrl: string,\n type: \"commit\" | \"tag\" | \"blob\" | \"tree\",\n sha: string\n): string {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n switch (type) {\n case \"commit\":\n return `${repoUrl}/git/commits/${sha}`;\n case \"tag\":\n return `${repoUrl}/git/tags/${sha}`;\n case \"tree\":\n return `${repoUrl}/git/trees/${sha}`;\n default:\n return `${repoUrl}/git/blobs/${sha}`;\n }\n}\n\nfunction formatRefJson(\n gh: GitHubStore,\n repo: GitHubRepo,\n fullRef: string,\n sha: string,\n baseUrl: string\n) {\n const refRec = gh.refs.findBy(\"repo_id\", repo.id).find((r) => r.ref === fullRef);\n const type = resolveGitObjectType(gh, repo.id, sha);\n const shortRef = fullRef.startsWith(\"refs/\") ? fullRef.slice(5) : fullRef;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n ref: fullRef,\n node_id: refRec?.node_id ?? \"\",\n url: `${repoUrl}/git/ref/${shortRef}`,\n object: {\n type,\n sha,\n url: objectApiUrl(repo, baseUrl, type, sha),\n },\n };\n}\n\nfunction syncBranchFromRef(gh: GitHubStore, repo: GitHubRepo, fullRef: string, sha: string) {\n if (!fullRef.startsWith(\"refs/heads/\")) return;\n const name = fullRef.slice(\"refs/heads/\".length);\n const existing = findBranchByName(gh, repo.id, name);\n if (existing) {\n gh.branches.update(existing.id, { sha });\n } else {\n gh.branches.insert({\n repo_id: repo.id,\n name,\n sha,\n protected: false,\n } as Omit<GitHubBranch, \"id\" | \"created_at\" | \"updated_at\">);\n }\n}\n\nfunction deleteBranchForHeadRef(gh: GitHubStore, repoId: number, fullRef: string) {\n if (!fullRef.startsWith(\"refs/heads/\")) return;\n const name = fullRef.slice(\"refs/heads/\".length);\n const b = findBranchByName(gh, repoId, name);\n if (b) gh.branches.delete(b.id);\n}\n\nfunction expandTreeEntries(\n gh: GitHubStore,\n repoId: number,\n entries: GitHubTree[\"tree\"],\n recursive: boolean,\n prefix = \"\"\n): GitHubTree[\"tree\"] {\n const out: GitHubTree[\"tree\"] = [];\n for (const e of entries) {\n const path = prefix ? `${prefix}/${e.path}` : e.path;\n if (e.type === \"blob\") {\n out.push({ ...e, path });\n } else if (e.type === \"tree\" && recursive) {\n const sub = findTreeBySha(gh, repoId, e.sha);\n if (sub) {\n out.push(...expandTreeEntries(gh, repoId, sub.tree, true, path));\n } else {\n out.push({ ...e, path });\n }\n } else {\n out.push({ ...e, path });\n }\n }\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction formatCommitJson(gh: GitHubStore, repo: GitHubRepo, c: GitHubCommit, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const htmlUrl = `${baseUrl}/${repo.full_name}/commit/${c.sha}`;\n const authorUser = c.user_id ? gh.users.get(c.user_id) : null;\n return {\n sha: c.sha,\n node_id: c.node_id,\n url: `${repoUrl}/git/commits/${c.sha}`,\n html_url: htmlUrl,\n author: authorUser ? formatUser(authorUser, baseUrl) : null,\n committer: authorUser ? formatUser(authorUser, baseUrl) : null,\n parents: c.parent_shas.map((sha) => ({\n sha,\n url: `${repoUrl}/git/commits/${sha}`,\n })),\n stats: { total: 0, additions: 0, deletions: 0 },\n files: [],\n commit: {\n author: {\n name: c.author_name,\n email: c.author_email,\n date: c.author_date,\n },\n committer: {\n name: c.committer_name,\n email: c.committer_email,\n date: c.committer_date,\n },\n message: c.message,\n tree: { sha: c.tree_sha, url: `${repoUrl}/git/trees/${c.tree_sha}` },\n url: `${repoUrl}/git/commits/${c.sha}`,\n comment_count: 0,\n verification: { verified: false, reason: \"unsigned\", signature: null, payload: null, verified_at: null },\n },\n };\n}\n\nfunction protectionEntityToGitHub(\n gh: GitHubStore,\n repo: GitHubRepo,\n bp: GitHubBranchProtection,\n baseUrl: string\n) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const encBranch = encodeURIComponent(bp.branch_name);\n const base = `${repoUrl}/branches/${encBranch}/protection`;\n return {\n url: base,\n required_status_checks: bp.required_status_checks\n ? {\n url: `${base}/required_status_checks`,\n strict: bp.required_status_checks.strict,\n contexts: bp.required_status_checks.contexts,\n contexts_url: `${base}/required_status_checks/contexts`,\n checks: bp.required_status_checks.contexts.map((c) => ({\n context: c,\n app_id: null,\n })),\n }\n : null,\n enforce_admins: {\n url: `${base}/enforce_admins`,\n enabled: bp.enforce_admins,\n },\n required_pull_request_reviews: bp.required_pull_request_reviews\n ? {\n url: `${base}/required_pull_request_reviews`,\n dismiss_stale_reviews: bp.required_pull_request_reviews.dismiss_stale_reviews,\n require_code_owner_reviews: bp.required_pull_request_reviews.require_code_owner_reviews,\n required_approving_review_count:\n bp.required_pull_request_reviews.required_approving_review_count,\n }\n : null,\n restrictions: bp.restrictions\n ? {\n url: `${base}/restrictions`,\n users_url: `${base}/restrictions/users`,\n teams_url: `${base}/restrictions/teams`,\n apps_url: `${base}/restrictions/apps`,\n users: bp.restrictions.users.map((login) => ({\n login,\n id: 0,\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/${login}`,\n gravatar_id: \"\",\n url: `${baseUrl}/users/${login}`,\n html_url: `${baseUrl}/${login}`,\n type: \"User\",\n site_admin: false,\n })),\n teams: bp.restrictions.teams.map((slug) => ({\n id: 0,\n node_id: \"\",\n url: `${baseUrl}/teams/0`,\n name: slug,\n slug,\n })),\n apps: [],\n }\n : null,\n required_linear_history: { enabled: bp.required_linear_history },\n allow_force_pushes: { enabled: bp.allow_force_pushes },\n allow_deletions: { enabled: bp.allow_deletions },\n required_conversation_resolution: { enabled: false },\n required_signatures: { url: `${base}/required_signatures`, enabled: bp.required_signatures },\n lock_branch: { enabled: false },\n allow_fork_syncing: { enabled: false },\n };\n}\n\nfunction parseProtectionPutBody(body: Record<string, unknown>): Omit<\n GitHubBranchProtection,\n \"id\" | \"repo_id\" | \"branch_name\" | \"created_at\" | \"updated_at\"\n> {\n const rsc = body.required_status_checks;\n let required_status_checks: GitHubBranchProtection[\"required_status_checks\"] = null;\n if (rsc && typeof rsc === \"object\" && rsc !== null) {\n const o = rsc as Record<string, unknown>;\n required_status_checks = {\n strict: Boolean(o.strict),\n contexts: Array.isArray(o.contexts) ? o.contexts.filter((x): x is string => typeof x === \"string\") : [],\n };\n }\n\n let enforce_admins = false;\n const ea = body.enforce_admins;\n if (typeof ea === \"boolean\") enforce_admins = ea;\n else if (ea && typeof ea === \"object\" && \"enabled\" in ea) {\n enforce_admins = Boolean((ea as { enabled?: unknown }).enabled);\n }\n\n const rprr = body.required_pull_request_reviews;\n let required_pull_request_reviews: GitHubBranchProtection[\"required_pull_request_reviews\"] = null;\n if (rprr && typeof rprr === \"object\" && rprr !== null) {\n const o = rprr as Record<string, unknown>;\n required_pull_request_reviews = {\n required_approving_review_count:\n typeof o.required_approving_review_count === \"number\" ? o.required_approving_review_count : 1,\n dismiss_stale_reviews: Boolean(o.dismiss_stale_reviews),\n require_code_owner_reviews: Boolean(o.require_code_owner_reviews),\n };\n }\n\n const rest = body.restrictions;\n let restrictions: GitHubBranchProtection[\"restrictions\"] = null;\n if (rest && typeof rest === \"object\" && rest !== null) {\n const o = rest as Record<string, unknown>;\n restrictions = {\n users: Array.isArray(o.users)\n ? o.users\n .map((u) => (typeof u === \"string\" ? u : (u as { login?: string })?.login))\n .filter((x): x is string => typeof x === \"string\")\n : [],\n teams: Array.isArray(o.teams)\n ? o.teams\n .map((t) => (typeof t === \"string\" ? t : (t as { slug?: string })?.slug))\n .filter((x): x is string => typeof x === \"string\")\n : [],\n };\n }\n\n const rlh = body.required_linear_history;\n const required_linear_history =\n typeof rlh === \"boolean\"\n ? rlh\n : rlh && typeof rlh === \"object\" && rlh !== null\n ? Boolean((rlh as { enabled?: unknown }).enabled)\n : false;\n const afp = body.allow_force_pushes;\n const allow_force_pushes =\n typeof afp === \"boolean\"\n ? afp\n : afp && typeof afp === \"object\" && afp !== null\n ? Boolean((afp as { enabled?: unknown }).enabled)\n : false;\n const ad = body.allow_deletions;\n const allow_deletions =\n typeof ad === \"boolean\"\n ? ad\n : ad && typeof ad === \"object\" && ad !== null\n ? Boolean((ad as { enabled?: unknown }).enabled)\n : false;\n\n return {\n required_status_checks,\n enforce_admins,\n required_pull_request_reviews,\n restrictions,\n required_linear_history,\n allow_force_pushes,\n allow_deletions,\n required_signatures: Boolean(\n typeof body.required_signatures === \"boolean\"\n ? body.required_signatures\n : (body.required_signatures as { enabled?: boolean } | undefined)?.enabled\n ),\n };\n}\n\nexport function branchesAndGitRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Branches: sub-routes before generic protection/branch ---\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_status_checks\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections\n .findBy(\"repo_id\", repo.id)\n .find((p) => p.branch_name === branch);\n if (!bp || !bp.required_status_checks) throw notFoundResponse();\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const base = `${repoUrl}/branches/${encBranch}/protection/required_status_checks`;\n return c.json({\n url: base,\n strict: bp.required_status_checks.strict,\n contexts: bp.required_status_checks.contexts,\n contexts_url: `${base}/contexts`,\n checks: bp.required_status_checks.contexts.map((ctx) => ({\n context: ctx,\n app_id: null,\n })),\n });\n });\n\n app.patch(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_status_checks\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections\n .findBy(\"repo_id\", repo.id)\n .find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n const body = await parseJsonBody(c);\n const strict = typeof body.strict === \"boolean\" ? body.strict : bp.required_status_checks?.strict ?? false;\n const contexts = Array.isArray(body.contexts)\n ? body.contexts.filter((x): x is string => typeof x === \"string\")\n : bp.required_status_checks?.contexts ?? [];\n gh.branchProtections.update(bp.id, {\n required_status_checks: { strict, contexts },\n });\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const url = `${repoUrl}/branches/${encBranch}/protection/required_status_checks`;\n return c.json({\n url,\n strict,\n contexts,\n contexts_url: `${url}/contexts`,\n checks: contexts.map((ctx) => ({ context: ctx, app_id: null })),\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection/enforce_admins\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections\n .findBy(\"repo_id\", repo.id)\n .find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const url = `${repoUrl}/branches/${encBranch}/protection/enforce_admins`;\n return c.json({\n url,\n enabled: bp.enforce_admins,\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_pull_request_reviews\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections\n .findBy(\"repo_id\", repo.id)\n .find((p) => p.branch_name === branch);\n if (!bp || !bp.required_pull_request_reviews) throw notFoundResponse();\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const base = `${repoUrl}/branches/${encBranch}/protection/required_pull_request_reviews`;\n const r = bp.required_pull_request_reviews;\n return c.json({\n url: base,\n dismiss_stale_reviews: r.dismiss_stale_reviews,\n require_code_owner_reviews: r.require_code_owner_reviews,\n required_approving_review_count: r.required_approving_review_count,\n });\n });\n\n app.patch(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_pull_request_reviews\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections\n .findBy(\"repo_id\", repo.id)\n .find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n const body = await parseJsonBody(c);\n const prev = bp.required_pull_request_reviews ?? {\n required_approving_review_count: 1,\n dismiss_stale_reviews: false,\n require_code_owner_reviews: false,\n };\n const next = {\n required_approving_review_count:\n typeof body.required_approving_review_count === \"number\"\n ? body.required_approving_review_count\n : prev.required_approving_review_count,\n dismiss_stale_reviews:\n typeof body.dismiss_stale_reviews === \"boolean\"\n ? body.dismiss_stale_reviews\n : prev.dismiss_stale_reviews,\n require_code_owner_reviews:\n typeof body.require_code_owner_reviews === \"boolean\"\n ? body.require_code_owner_reviews\n : prev.require_code_owner_reviews,\n };\n gh.branchProtections.update(bp.id, { required_pull_request_reviews: next });\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const url = `${repoUrl}/branches/${encBranch}/protection/required_pull_request_reviews`;\n return c.json({\n url,\n ...next,\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections\n .findBy(\"repo_id\", repo.id)\n .find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n return c.json(protectionEntityToGitHub(gh, repo, bp, baseUrl));\n });\n\n app.put(\"/repos/:owner/:repo/branches/:branch{.+}/protection\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const b = findBranchByName(gh, repo.id, branch);\n if (!b) throw notFoundResponse();\n const body = await parseJsonBody(c);\n const parsed = parseProtectionPutBody(body);\n const existing = gh.branchProtections\n .findBy(\"repo_id\", repo.id)\n .find((p) => p.branch_name === branch);\n if (existing) {\n gh.branchProtections.update(existing.id, { ...parsed });\n } else {\n gh.branchProtections.insert({\n repo_id: repo.id,\n branch_name: branch,\n ...parsed,\n } as Omit<GitHubBranchProtection, \"id\" | \"created_at\" | \"updated_at\">);\n }\n gh.branches.update(b.id, { protected: true });\n const bp = gh.branchProtections\n .findBy(\"repo_id\", repo.id)\n .find((p) => p.branch_name === branch)!;\n webhooks.dispatch(\n \"branch_protection_rule\",\n \"edited\",\n {\n action: \"edited\",\n rule: protectionEntityToGitHub(gh, repo, bp, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n },\n ownerLoginOf(gh, repo),\n repo.name\n );\n return c.json(protectionEntityToGitHub(gh, repo, bp, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/branches/:branch{.+}/protection\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections\n .findBy(\"repo_id\", repo.id)\n .find((p) => p.branch_name === branch);\n if (bp) gh.branchProtections.delete(bp.id);\n const b = findBranchByName(gh, repo.id, branch);\n if (b) gh.branches.update(b.id, { protected: false });\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branchName = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const branch = findBranchByName(gh, repo.id, branchName);\n if (!branch) throw notFoundResponse();\n const commit = findCommitBySha(gh, repo.id, branch.sha);\n const base = formatBranch(branch, repo, baseUrl);\n if (!branch.protected) return c.json(base);\n const bp = gh.branchProtections\n .findBy(\"repo_id\", repo.id)\n .find((p) => p.branch_name === branchName);\n return c.json({\n ...base,\n protection: {\n enabled: true,\n required_status_checks: bp?.required_status_checks\n ? {\n enforcement_level: \"everyone\",\n contexts: bp.required_status_checks.contexts,\n checks: bp.required_status_checks.contexts.map((ctx) => ({ context: ctx, app_id: null })),\n }\n : { enforcement_level: \"off\", contexts: [], checks: [] },\n },\n protection_commit: commit\n ? {\n author: { email: commit.author_email, name: commit.author_name },\n url: `${baseUrl}/repos/${repo.full_name}/commits/${commit.sha}`,\n message: commit.message,\n html_url: `${baseUrl}/${repo.full_name}/commit/${commit.sha}`,\n }\n : null,\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n let list = [...gh.branches.findBy(\"repo_id\", repo.id)].sort((a, b) =>\n a.name.localeCompare(b.name)\n );\n const prot = c.req.query(\"protected\");\n if (prot === \"true\") list = list.filter((b) => b.protected);\n else if (prot === \"false\") list = list.filter((b) => !b.protected);\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n const start = (page - 1) * per_page;\n const slice = list.slice(start, start + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((b) => formatBranch(b, repo, baseUrl)));\n });\n\n // --- Git refs ---\n\n app.get(\"/repos/:owner/:repo/git/ref/:ref{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const fullRef = fullRefFromParam(refParam);\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (!r) throw notFoundResponse();\n return c.json(formatRefJson(gh, repo, r.ref, r.sha, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/git/matching-refs/:ref{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const prefix = fullRefFromParam(refParam);\n const matches = gh.refs\n .findBy(\"repo_id\", repo.id)\n .filter((r) => r.ref.startsWith(prefix))\n .sort((a, b) => a.ref.localeCompare(b.ref));\n return c.json(matches.map((r) => formatRefJson(gh, repo, r.ref, r.sha, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/git/refs\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const user = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c) as { ref?: unknown; sha?: unknown };\n if (typeof body.ref !== \"string\" || !body.ref.startsWith(\"refs/\")) {\n throw new ApiError(422, \"Invalid ref\");\n }\n if (typeof body.sha !== \"string\") {\n throw new ApiError(422, \"sha is required\");\n }\n const fullRef = body.ref;\n const sha = body.sha;\n if (findCommitBySha(gh, repo.id, sha) === undefined && findTagObjectBySha(gh, repo.id, sha) === undefined) {\n throw new ApiError(422, \"Invalid sha\");\n }\n if (gh.refs.findBy(\"repo_id\", repo.id).some((r) => r.ref === fullRef)) {\n throw new ApiError(422, \"Reference already exists\");\n }\n const refRow = gh.refs.insert({\n repo_id: repo.id,\n ref: fullRef,\n sha,\n node_id: \"\",\n } as Omit<GitHubRef, \"id\" | \"created_at\" | \"updated_at\">);\n gh.refs.update(refRow.id, { node_id: generateNodeId(\"Ref\", refRow.id) });\n syncBranchFromRef(gh, repo, fullRef, sha);\n webhooks.dispatch(\n \"create\",\n undefined,\n {\n ref: fullRef,\n ref_type: fullRef.startsWith(\"refs/heads/\") ? \"branch\" : \"tag\",\n master_branch: repo.default_branch,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(user, baseUrl),\n },\n ownerLoginOf(gh, repo),\n repo.name\n );\n const r = gh.refs.get(refRow.id)!;\n return c.json(formatRefJson(gh, repo, r.ref, r.sha, baseUrl), 201);\n });\n\n app.patch(\"/repos/:owner/:repo/git/refs/:ref{.+}\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const user = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const fullRef = fullRefFromParam(refParam);\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (!r) throw notFoundResponse();\n const body = await parseJsonBody(c) as { sha?: unknown; force?: unknown };\n if (typeof body.sha !== \"string\") {\n throw new ApiError(422, \"sha is required\");\n }\n const newSha = body.sha;\n const force = Boolean(body.force);\n const oldSha = r.sha;\n if (findCommitBySha(gh, repo.id, newSha) === undefined && findTagObjectBySha(gh, repo.id, newSha) === undefined) {\n throw new ApiError(422, \"Invalid sha\");\n }\n if (!force) {\n const oldCommit = findCommitBySha(gh, repo.id, oldSha);\n const newCommit = findCommitBySha(gh, repo.id, newSha);\n if (!oldCommit || !newCommit) {\n throw new ApiError(422, \"Fast-forward update requires commit objects\");\n }\n if (!isDescendantOf(gh, repo.id, oldSha, newSha)) {\n throw new ApiError(422, \"Update is not a fast-forward\");\n }\n }\n gh.refs.update(r.id, { sha: newSha });\n syncBranchFromRef(gh, repo, fullRef, newSha);\n webhooks.dispatch(\n \"push\",\n undefined,\n {\n ref: fullRef,\n before: oldSha,\n after: newSha,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(user, baseUrl),\n },\n ownerLoginOf(gh, repo),\n repo.name\n );\n const updated = gh.refs.get(r.id)!;\n return c.json(formatRefJson(gh, repo, updated.ref, updated.sha, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/git/refs/:ref{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const fullRef = fullRefFromParam(refParam);\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (!r) throw notFoundResponse();\n gh.refs.delete(r.id);\n deleteBranchForHeadRef(gh, repo.id, fullRef);\n return c.body(null, 204);\n });\n\n // --- Git commits ---\n\n app.get(\"/repos/:owner/:repo/git/commits/:commit_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const commitSha = c.req.param(\"commit_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const commit = findCommitBySha(gh, repo.id, commitSha);\n if (!commit) throw notFoundResponse();\n return c.json(formatCommitJson(gh, repo, commit, baseUrl));\n });\n\n app.post(\"/repos/:owner/:repo/git/commits\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (typeof body.message !== \"string\") throw new ApiError(422, \"message is required\");\n if (typeof body.tree !== \"string\") throw new ApiError(422, \"tree is required\");\n if (!Array.isArray(body.parents)) throw new ApiError(422, \"parents must be an array\");\n const parents = body.parents.filter((p): p is string => typeof p === \"string\");\n const treeSha = body.tree as string;\n if (!findTreeBySha(gh, repo.id, treeSha)) throw new ApiError(422, \"Invalid tree\");\n for (const p of parents) {\n if (!findCommitBySha(gh, repo.id, p)) throw new ApiError(422, `Invalid parent ${p}`);\n }\n let author_name: string;\n let author_email: string;\n let author_date: string;\n let committer_name: string;\n let committer_email: string;\n let committer_date: string;\n const now = timestamp();\n const actor = getActorUser(gh, c.get(\"authUser\")!);\n const defaultName = actor?.name ?? actor?.login ?? \"user\";\n const defaultEmail = actor?.email ?? `${actor?.login ?? \"user\"}@users.noreply.github.com`;\n if (body.author && typeof body.author === \"object\" && body.author !== null) {\n const a = body.author as Record<string, unknown>;\n author_name = typeof a.name === \"string\" ? a.name : defaultName;\n author_email = typeof a.email === \"string\" ? a.email : defaultEmail;\n author_date = typeof a.date === \"string\" ? a.date : now;\n } else {\n author_name = defaultName;\n author_email = defaultEmail;\n author_date = now;\n }\n if (body.committer && typeof body.committer === \"object\" && body.committer !== null) {\n const a = body.committer as Record<string, unknown>;\n committer_name = typeof a.name === \"string\" ? a.name : defaultName;\n committer_email = typeof a.email === \"string\" ? a.email : defaultEmail;\n committer_date = typeof a.date === \"string\" ? a.date : now;\n } else {\n committer_name = author_name;\n committer_email = author_email;\n committer_date = author_date;\n }\n const commit = gh.commits.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n message: body.message as string,\n author_name,\n author_email,\n author_date,\n committer_name,\n committer_email,\n committer_date,\n tree_sha: treeSha,\n parent_shas: parents,\n user_id: actor?.id ?? null,\n } as Omit<GitHubCommit, \"id\" | \"created_at\" | \"updated_at\">);\n gh.commits.update(commit.id, { node_id: generateNodeId(\"Commit\", commit.id) });\n const saved = gh.commits.get(commit.id)!;\n return c.json(formatCommitJson(gh, repo, saved, baseUrl), 201);\n });\n\n // --- Git trees ---\n\n app.get(\"/repos/:owner/:repo/git/trees/:tree_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const treeSha = c.req.param(\"tree_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const tree = findTreeBySha(gh, repo.id, treeSha);\n if (!tree) throw notFoundResponse();\n const recursive = c.req.query(\"recursive\") === \"1\" || c.req.query(\"recursive\") === \"true\";\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const entries = recursive\n ? expandTreeEntries(gh, repo.id, tree.tree, true)\n : tree.tree.filter((e) => !e.path.includes(\"/\"));\n return c.json({\n sha: tree.sha,\n url: `${repoUrl}/git/trees/${tree.sha}`,\n tree: entries,\n truncated: tree.truncated,\n });\n });\n\n app.post(\"/repos/:owner/:repo/git/trees\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (!Array.isArray(body.tree)) throw new ApiError(422, \"tree array is required\");\n const items = body.tree as Array<{\n path?: string;\n mode?: string;\n type?: string;\n sha?: string;\n content?: string;\n }>;\n const pathMap = new Map<string, { mode: string; type: \"blob\" | \"tree\"; sha: string; size?: number }>();\n\n const baseTreeSha = typeof body.base_tree === \"string\" ? body.base_tree : undefined;\n if (baseTreeSha) {\n const base = findTreeBySha(gh, repo.id, baseTreeSha);\n if (!base) throw new ApiError(422, \"Invalid base_tree\");\n for (const e of base.tree) {\n pathMap.set(e.path, { mode: e.mode, type: e.type, sha: e.sha, size: e.size });\n }\n }\n\n for (const raw of items) {\n if (typeof raw.path !== \"string\" || typeof raw.mode !== \"string\" || (raw.type !== \"blob\" && raw.type !== \"tree\")) {\n throw new ApiError(422, \"Each tree entry needs path, mode, type (blob|tree)\");\n }\n if (raw.sha !== undefined && raw.content !== undefined) {\n throw new ApiError(422, \"Cannot pass both sha and content\");\n }\n let sha = raw.sha;\n if (raw.content !== undefined) {\n const buf = Buffer.from(String(raw.content), \"utf8\");\n const blob = gh.blobs.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n content: String(raw.content),\n encoding: \"utf-8\",\n size: buf.byteLength,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n sha = blob.sha;\n }\n if (typeof sha !== \"string\") throw new ApiError(422, \"sha or content required\");\n pathMap.set(raw.path, { mode: raw.mode, type: raw.type, sha });\n }\n\n const treeEntries: GitHubTree[\"tree\"] = [...pathMap.entries()].map(([path, v]) => ({\n path,\n mode: v.mode,\n type: v.type,\n sha: v.sha,\n size: v.size,\n }));\n\n const tree = gh.trees.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n tree: treeEntries,\n truncated: false,\n } as Omit<GitHubTree, \"id\" | \"created_at\" | \"updated_at\">);\n gh.trees.update(tree.id, { node_id: generateNodeId(\"Tree\", tree.id) });\n const saved = gh.trees.get(tree.id)!;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json(\n {\n sha: saved.sha,\n url: `${repoUrl}/git/trees/${saved.sha}`,\n tree: saved.tree,\n truncated: saved.truncated,\n },\n 201\n );\n });\n\n // --- Git blobs ---\n\n app.get(\"/repos/:owner/:repo/git/blobs/:file_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const fileSha = c.req.param(\"file_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const blob = findBlobBySha(gh, repo.id, fileSha);\n if (!blob) throw notFoundResponse();\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const content =\n blob.encoding === \"base64\"\n ? blob.content\n : Buffer.from(blob.content, \"utf8\").toString(\"base64\");\n return c.json({\n sha: blob.sha,\n node_id: blob.node_id,\n size: blob.size,\n url: `${repoUrl}/git/blobs/${blob.sha}`,\n content,\n encoding: \"base64\",\n });\n });\n\n app.post(\"/repos/:owner/:repo/git/blobs\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c) as {\n content?: unknown;\n encoding?: unknown;\n };\n if (typeof body.content !== \"string\") throw new ApiError(422, \"content is required\");\n const enc = body.encoding === \"base64\" || body.encoding === \"utf-8\" ? body.encoding : \"utf-8\";\n if (enc === \"base64\") {\n const blob = gh.blobs.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n content: body.content,\n encoding: \"base64\",\n size: Buffer.from(body.content, \"base64\").length,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const saved = gh.blobs.get(blob.id)!;\n return c.json(\n {\n sha: saved.sha,\n node_id: saved.node_id,\n url: `${repoUrl}/git/blobs/${saved.sha}`,\n size: saved.size,\n },\n 201\n );\n }\n const raw = body.content;\n const size = Buffer.byteLength(raw, \"utf8\");\n const blob = gh.blobs.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n content: raw,\n encoding: \"utf-8\",\n size,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n const saved = gh.blobs.get(blob.id)!;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json(\n {\n sha: saved.sha,\n node_id: saved.node_id,\n url: `${repoUrl}/git/blobs/${saved.sha}`,\n size: saved.size,\n },\n 201\n );\n });\n\n // --- Git tags ---\n\n app.get(\"/repos/:owner/:repo/git/tags/:tag_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const tagSha = c.req.param(\"tag_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const tag = findTagObjectBySha(gh, repo.id, tagSha);\n if (!tag) throw notFoundResponse();\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json({\n tag: tag.tag,\n sha: tag.sha,\n node_id: tag.node_id,\n url: `${repoUrl}/git/tags/${tag.sha}`,\n message: tag.message,\n tagger: {\n name: tag.tagger_name,\n email: tag.tagger_email,\n date: tag.tagger_date,\n },\n object: {\n type: tag.object_type,\n sha: tag.object_sha,\n url: objectApiUrl(\n repo,\n baseUrl,\n resolveGitObjectType(gh, repo.id, tag.object_sha),\n tag.object_sha\n ),\n },\n verification: { verified: false, reason: \"unsigned\", signature: null, payload: null, verified_at: null },\n });\n });\n\n app.post(\"/repos/:owner/:repo/git/tags\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (typeof body.tag !== \"string\") throw new ApiError(422, \"tag is required\");\n if (typeof body.message !== \"string\") throw new ApiError(422, \"message is required\");\n if (typeof body.object !== \"string\") throw new ApiError(422, \"object is required\");\n if (typeof body.type !== \"string\") throw new ApiError(422, \"type is required\");\n const now = timestamp();\n let tagger_name = \"user\";\n let tagger_email = \"user@users.noreply.github.com\";\n let tagger_date = now;\n if (body.tagger && typeof body.tagger === \"object\" && body.tagger !== null) {\n const t = body.tagger as Record<string, unknown>;\n if (typeof t.name === \"string\") tagger_name = t.name;\n if (typeof t.email === \"string\") tagger_email = t.email;\n if (typeof t.date === \"string\") tagger_date = t.date;\n }\n const tag = gh.tags.insert({\n repo_id: repo.id,\n tag: body.tag as string,\n sha: generateSha(),\n node_id: \"\",\n message: body.message as string,\n tagger_name,\n tagger_email,\n tagger_date,\n object_type: body.type as string,\n object_sha: body.object as string,\n } as Omit<GitHubTag, \"id\" | \"created_at\" | \"updated_at\">);\n gh.tags.update(tag.id, { node_id: generateNodeId(\"Tag\", tag.id) });\n const saved = gh.tags.get(tag.id)!;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json(\n {\n tag: saved.tag,\n sha: saved.sha,\n node_id: saved.node_id,\n url: `${repoUrl}/git/tags/${saved.sha}`,\n message: saved.message,\n tagger: {\n name: saved.tagger_name,\n email: saved.tagger_email,\n date: saved.tagger_date,\n },\n object: {\n type: saved.object_type,\n sha: saved.object_sha,\n url: objectApiUrl(\n repo,\n baseUrl,\n resolveGitObjectType(gh, repo.id, saved.object_sha),\n saved.object_sha\n ),\n },\n verification: { verified: false, reason: \"unsigned\", signature: null, payload: null, verified_at: null },\n },\n 201\n );\n });\n}\n","import type { RouteContext, AuthUser } from \"@emulators/core\";\nimport {\n ApiError,\n parseJsonBody,\n parsePagination,\n setLinkHeader,\n unauthorized,\n forbidden,\n} from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubOrg,\n GitHubRepo,\n GitHubTeam,\n GitHubUser,\n} from \"../entities.js\";\nimport {\n formatOrgBrief,\n formatOrgFull,\n formatRepo,\n formatTeamBrief,\n formatUser,\n generateNodeId,\n lookupOwner,\n lookupRepo,\n} from \"../helpers.js\";\n\nconst MEMBERS_TEAM_SLUG = \"members\";\n\nfunction notFound() {\n return new ApiError(404, \"Not Found\");\n}\n\nfunction requireAuthUser(c: { get: (k: \"authUser\") => AuthUser | undefined }): AuthUser {\n const u = c.get(\"authUser\");\n if (!u) throw unauthorized();\n return u;\n}\n\nfunction requireOrgAdmin(gh: GitHubStore, org: GitHubOrg, auth: AuthUser): void {\n const user = gh.users.findOneBy(\"login\", auth.login);\n if (!user) throw forbidden();\n const role = orgRoleForUser(gh, org.id, user.id);\n if (role !== \"admin\") throw forbidden();\n}\n\nfunction getOrgByLogin(gh: GitHubStore, login: string): GitHubOrg | undefined {\n return gh.orgs.findOneBy(\"login\", login);\n}\n\nfunction teamsForOrg(gh: GitHubStore, orgId: number): GitHubTeam[] {\n return gh.teams.findBy(\"org_id\", orgId);\n}\n\nfunction getTeamByOrgSlug(\n gh: GitHubStore,\n org: GitHubOrg,\n slug: string\n): GitHubTeam | undefined {\n return teamsForOrg(gh, org.id).find((t) => t.slug === slug);\n}\n\nfunction slugifyFromName(name: string): string {\n const s = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return s || \"team\";\n}\n\nfunction uniqueTeamSlug(gh: GitHubStore, orgId: number, base: string): string {\n let slug = base;\n let n = 2;\n const taken = (s: string) =>\n teamsForOrg(gh, orgId).some((t) => t.slug === s);\n while (taken(slug)) {\n slug = `${base}-${n}`;\n n += 1;\n }\n return slug;\n}\n\nfunction orgsForAuthenticatedUser(gh: GitHubStore, userId: number): GitHubOrg[] {\n const memberships = gh.teamMembers.findBy(\"user_id\", userId);\n const orgIds = new Set<number>();\n for (const m of memberships) {\n const team = gh.teams.get(m.team_id);\n if (team) orgIds.add(team.org_id);\n }\n const orgs = [...orgIds]\n .map((id) => gh.orgs.get(id))\n .filter((o): o is GitHubOrg => Boolean(o));\n orgs.sort((a, b) => a.login.localeCompare(b.login));\n return orgs;\n}\n\ntype OrgMemberRow = { user: GitHubUser; orgRole: \"admin\" | \"member\" };\n\nfunction listOrgMembersDeduped(gh: GitHubStore, orgId: number): OrgMemberRow[] {\n const byUser = new Map<number, { user: GitHubUser; isAdmin: boolean }>();\n for (const team of teamsForOrg(gh, orgId)) {\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n const user = gh.users.get(m.user_id);\n if (!user) continue;\n const isAdmin = m.role === \"maintainer\";\n const prev = byUser.get(user.id);\n if (!prev) {\n byUser.set(user.id, { user, isAdmin });\n } else {\n byUser.set(user.id, { user, isAdmin: prev.isAdmin || isAdmin });\n }\n }\n }\n return [...byUser.values()]\n .map(({ user, isAdmin }) => ({\n user,\n orgRole: isAdmin ? (\"admin\" as const) : (\"member\" as const),\n }))\n .sort((a, b) => a.user.id - b.user.id);\n}\n\nfunction orgRoleForUser(gh: GitHubStore, orgId: number, userId: number): \"admin\" | \"member\" | null {\n const row = listOrgMembersDeduped(gh, orgId).find((r) => r.user.id === userId);\n return row?.orgRole ?? null;\n}\n\nfunction syncTeamMemberCount(gh: GitHubStore, teamId: number) {\n const n = gh.teamMembers.findBy(\"team_id\", teamId).length;\n gh.teams.update(teamId, { members_count: n });\n}\n\nfunction syncTeamRepoCount(gh: GitHubStore, teamId: number) {\n const n = gh.teamRepos.findBy(\"team_id\", teamId).length;\n gh.teams.update(teamId, { repos_count: n });\n}\n\nfunction findTeamRepo(gh: GitHubStore, teamId: number, repoId: number) {\n return gh.teamRepos.findBy(\"team_id\", teamId).find((r) => r.repo_id === repoId);\n}\n\nfunction getOrCreateMembersTeam(gh: GitHubStore, org: GitHubOrg): GitHubTeam {\n const existing = teamsForOrg(gh, org.id).find((t) => t.slug === MEMBERS_TEAM_SLUG);\n if (existing) return existing;\n const team = gh.teams.insert({\n node_id: \"pending\",\n name: \"Members\",\n slug: MEMBERS_TEAM_SLUG,\n description: null,\n privacy: \"closed\",\n permission: \"pull\",\n org_id: org.id,\n parent_id: null,\n members_count: 0,\n repos_count: 0,\n });\n const fixed = gh.teams.update(team.id, { node_id: generateNodeId(\"Team\", team.id) });\n return fixed ?? team;\n}\n\nfunction deleteTeamCascade(gh: GitHubStore, team: GitHubTeam) {\n for (const child of teamsForOrg(gh, team.org_id).filter((t) => t.parent_id === team.id)) {\n gh.teams.update(child.id, { parent_id: null });\n }\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n gh.teamMembers.delete(m.id);\n }\n for (const tr of gh.teamRepos.findBy(\"team_id\", team.id)) {\n gh.teamRepos.delete(tr.id);\n }\n gh.teams.delete(team.id);\n}\n\nfunction removeUserFromAllOrgTeams(gh: GitHubStore, orgId: number, userId: number) {\n for (const team of teamsForOrg(gh, orgId)) {\n const memberships = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .filter((m) => m.user_id === userId);\n for (const m of memberships) {\n gh.teamMembers.delete(m.id);\n }\n syncTeamMemberCount(gh, team.id);\n }\n}\n\nfunction membershipUrl(baseUrl: string, orgLogin: string, teamSlug: string, userLogin: string) {\n return `${baseUrl}/orgs/${orgLogin}/teams/${teamSlug}/memberships/${userLogin}`;\n}\n\nfunction orgMembershipUrl(baseUrl: string, orgLogin: string, userLogin: string) {\n return `${baseUrl}/orgs/${orgLogin}/memberships/${userLogin}`;\n}\n\nfunction formatTeamMembership(\n baseUrl: string,\n orgLogin: string,\n teamSlug: string,\n user: GitHubUser,\n role: \"member\" | \"maintainer\"\n) {\n return {\n url: membershipUrl(baseUrl, orgLogin, teamSlug, user.login),\n role,\n state: \"active\" as const,\n user: formatUser(user, baseUrl),\n };\n}\n\nexport function orgsAndTeamsRoutes({ app, store, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/organizations\", (c) => {\n const since = Math.max(0, parseInt(c.req.query(\"since\") ?? \"0\", 10) || 0);\n const perPage = Math.min(\n 100,\n Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30)\n );\n\n const ordered = gh.orgs\n .all()\n .filter((o) => o.id > since)\n .sort((a, b) => a.id - b.id);\n const page = ordered.slice(0, perPage);\n\n if (page.length === perPage && ordered.length > perPage) {\n const lastId = page[page.length - 1]!.id;\n const nextUrl = new URL(c.req.url);\n nextUrl.searchParams.set(\"since\", String(lastId));\n nextUrl.searchParams.set(\"per_page\", String(perPage));\n c.header(\"Link\", `<${nextUrl.toString()}>; rel=\"next\"`);\n }\n\n return c.json(page.map((o) => formatOrgBrief(o, baseUrl)));\n });\n\n app.get(\"/user/orgs\", (c) => {\n const auth = requireAuthUser(c);\n const user = gh.users.findOneBy(\"login\", auth.login);\n if (!user) throw notFound();\n const orgs = orgsForAuthenticatedUser(gh, user.id);\n return c.json(orgs.map((o) => formatOrgBrief(o, baseUrl)));\n });\n\n app.get(\"/orgs/:org\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n return c.json(formatOrgFull(org, baseUrl));\n });\n\n app.patch(\"/orgs/:org\", async (c) => {\n const auth = requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n requireOrgAdmin(gh, org, auth);\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubOrg> = {};\n\n if (\"billing_email\" in body) {\n if (body.billing_email === null) patch.billing_email = null;\n else if (typeof body.billing_email === \"string\") patch.billing_email = body.billing_email;\n }\n if (\"company\" in body) {\n if (body.company === null) patch.company = null;\n else if (typeof body.company === \"string\") patch.company = body.company;\n }\n if (\"email\" in body) {\n if (body.email === null) patch.email = null;\n else if (typeof body.email === \"string\") patch.email = body.email;\n }\n if (\"twitter_username\" in body) {\n if (body.twitter_username === null) patch.twitter_username = null;\n else if (typeof body.twitter_username === \"string\") {\n patch.twitter_username = body.twitter_username;\n }\n }\n if (\"location\" in body) {\n if (body.location === null) patch.location = null;\n else if (typeof body.location === \"string\") patch.location = body.location;\n }\n if (\"name\" in body) {\n if (body.name === null) patch.name = null;\n else if (typeof body.name === \"string\") patch.name = body.name;\n }\n if (\"description\" in body) {\n if (body.description === null) patch.description = null;\n else if (typeof body.description === \"string\") patch.description = body.description;\n }\n if (\"default_repository_permission\" in body && typeof body.default_repository_permission === \"string\") {\n patch.default_repository_permission = body.default_repository_permission;\n }\n if (\"members_can_create_repositories\" in body && typeof body.members_can_create_repositories === \"boolean\") {\n patch.members_can_create_repositories = body.members_can_create_repositories;\n }\n\n const updated = gh.orgs.update(org.id, patch);\n if (!updated) throw notFound();\n return c.json(formatOrgFull(updated, baseUrl));\n });\n\n app.get(\"/orgs/:org/members\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n\n const roleQ = (c.req.query(\"role\") ?? \"all\").toLowerCase();\n if (roleQ !== \"all\" && roleQ !== \"admin\" && roleQ !== \"member\") {\n throw new ApiError(422, \"Invalid role parameter\");\n }\n\n let rows = listOrgMembersDeduped(gh, org.id);\n if (roleQ === \"admin\") rows = rows.filter((r) => r.orgRole === \"admin\");\n else if (roleQ === \"member\") rows = rows.filter((r) => r.orgRole === \"member\");\n\n const { page, per_page } = parsePagination(c);\n const total = rows.length;\n const start = (page - 1) * per_page;\n const slice = rows.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((r) => formatUser(r.user, baseUrl)));\n });\n\n app.get(\"/orgs/:org/members/:username\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n if (!orgRoleForUser(gh, org.id, user.id)) throw notFound();\n return c.body(null, 204);\n });\n\n app.delete(\"/orgs/:org/members/:username\", (c) => {\n const auth = requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n requireOrgAdmin(gh, org, auth);\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n removeUserFromAllOrgTeams(gh, org.id, user.id);\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/memberships/:username\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n const role = orgRoleForUser(gh, org.id, user.id);\n if (!role) throw notFound();\n return c.json({\n url: orgMembershipUrl(baseUrl, org.login, user.login),\n state: \"active\",\n role,\n organization_url: `${baseUrl}/orgs/${org.login}`,\n user: formatUser(user, baseUrl),\n organization: formatOrgBrief(org, baseUrl),\n });\n });\n\n app.put(\"/orgs/:org/memberships/:username\", async (c) => {\n const auth = requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n requireOrgAdmin(gh, org, auth);\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const body = await parseJsonBody(c);\n const roleRaw = body.role;\n if (roleRaw !== \"admin\" && roleRaw !== \"member\") {\n throw new ApiError(422, \"role must be admin or member\");\n }\n const teamRole: \"member\" | \"maintainer\" = roleRaw === \"admin\" ? \"maintainer\" : \"member\";\n\n const membersTeam = getOrCreateMembersTeam(gh, org);\n const existing = gh.teamMembers\n .findBy(\"team_id\", membersTeam.id)\n .find((m) => m.user_id === user.id);\n if (existing) {\n gh.teamMembers.update(existing.id, { role: teamRole });\n } else {\n gh.teamMembers.insert({ team_id: membersTeam.id, user_id: user.id, role: teamRole });\n }\n syncTeamMemberCount(gh, membersTeam.id);\n\n const orgRole = orgRoleForUser(gh, org.id, user.id)!;\n return c.json({\n url: orgMembershipUrl(baseUrl, org.login, user.login),\n state: \"active\",\n role: orgRole,\n organization_url: `${baseUrl}/orgs/${org.login}`,\n user: formatUser(user, baseUrl),\n organization: formatOrgBrief(org, baseUrl),\n });\n });\n\n app.get(\"/orgs/:org/teams\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n\n const all = teamsForOrg(gh, org.id).sort((a, b) => a.id - b.id);\n const { page, per_page } = parsePagination(c);\n const total = all.length;\n const start = (page - 1) * per_page;\n const slice = all.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((t) => formatTeamBrief(t, gh, baseUrl)));\n });\n\n app.post(\"/orgs/:org/teams\", async (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n\n const body = await parseJsonBody(c);\n const name = body.name;\n if (typeof name !== \"string\" || !name.trim()) {\n throw new ApiError(422, \"name is required\");\n }\n\n let parentId: number | null = null;\n if (body.parent_team_id != null) {\n const pid = Number(body.parent_team_id);\n const parent = gh.teams.get(pid);\n if (!parent || parent.org_id !== org.id) {\n throw new ApiError(422, \"Invalid parent_team_id\");\n }\n parentId = parent.id;\n }\n\n const baseSlug = uniqueTeamSlug(gh, org.id, slugifyFromName(name));\n const privacy =\n body.privacy === \"secret\" || body.privacy === \"closed\" ? body.privacy : \"closed\";\n const permission = typeof body.permission === \"string\" ? body.permission : \"pull\";\n const description =\n body.description === null ? null : typeof body.description === \"string\" ? body.description : null;\n\n const team = gh.teams.insert({\n node_id: \"pending\",\n name: name.trim(),\n slug: baseSlug,\n description,\n privacy,\n permission,\n org_id: org.id,\n parent_id: parentId,\n members_count: 0,\n repos_count: 0,\n });\n const fixed = gh.teams.update(team.id, { node_id: generateNodeId(\"Team\", team.id) });\n return c.json(formatTeamBrief(fixed ?? team, gh, baseUrl), 201);\n });\n\n app.get(\"/orgs/:org/teams/:team_slug\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n return c.json(formatTeamBrief(team, gh, baseUrl));\n });\n\n app.patch(\"/orgs/:org/teams/:team_slug\", async (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubTeam> = {};\n\n if (\"name\" in body && typeof body.name === \"string\" && body.name.trim()) {\n patch.name = body.name.trim();\n }\n if (\"description\" in body) {\n if (body.description === null) patch.description = null;\n else if (typeof body.description === \"string\") patch.description = body.description;\n }\n if (body.privacy === \"secret\" || body.privacy === \"closed\") {\n patch.privacy = body.privacy;\n }\n if (\"permission\" in body && typeof body.permission === \"string\") {\n patch.permission = body.permission;\n }\n if (\"parent_team_id\" in body) {\n if (body.parent_team_id === null) {\n patch.parent_id = null;\n } else {\n const pid = Number(body.parent_team_id);\n const parent = gh.teams.get(pid);\n if (!parent || parent.org_id !== org.id) {\n throw new ApiError(422, \"Invalid parent_team_id\");\n }\n if (parent.id === team.id) throw new ApiError(422, \"Invalid parent_team_id\");\n patch.parent_id = parent.id;\n }\n }\n\n const updated = gh.teams.update(team.id, patch);\n if (!updated) throw notFound();\n return c.json(formatTeamBrief(updated, gh, baseUrl));\n });\n\n app.delete(\"/orgs/:org/teams/:team_slug\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n deleteTeamCascade(gh, team);\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/teams/:team_slug/members\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const roleQ = (c.req.query(\"role\") ?? \"all\").toLowerCase();\n if (roleQ !== \"all\" && roleQ !== \"member\" && roleQ !== \"maintainer\") {\n throw new ApiError(422, \"Invalid role parameter\");\n }\n\n let members = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .map((m) => {\n const user = gh.users.get(m.user_id);\n return user ? { user, role: m.role } : null;\n })\n .filter((x): x is { user: GitHubUser; role: \"member\" | \"maintainer\" } => Boolean(x));\n\n if (roleQ === \"member\") members = members.filter((m) => m.role === \"member\");\n else if (roleQ === \"maintainer\") members = members.filter((m) => m.role === \"maintainer\");\n\n members.sort((a, b) => a.user.id - b.user.id);\n\n const { page, per_page } = parsePagination(c);\n const total = members.length;\n const start = (page - 1) * per_page;\n const slice = members.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((m) => formatUser(m.user, baseUrl)));\n });\n\n app.put(\"/orgs/:org/teams/:team_slug/memberships/:username\", async (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const body = await parseJsonBody(c);\n const role: \"member\" | \"maintainer\" =\n body.role === \"maintainer\" ? \"maintainer\" : \"member\";\n\n const existing = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .find((m) => m.user_id === user.id);\n if (existing) {\n gh.teamMembers.update(existing.id, { role });\n } else {\n gh.teamMembers.insert({ team_id: team.id, user_id: user.id, role });\n }\n syncTeamMemberCount(gh, team.id);\n\n return c.json(formatTeamMembership(baseUrl, org.login, team.slug, user, role));\n });\n\n app.delete(\"/orgs/:org/teams/:team_slug/memberships/:username\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const existing = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .find((m) => m.user_id === user.id);\n if (existing) {\n gh.teamMembers.delete(existing.id);\n syncTeamMemberCount(gh, team.id);\n }\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/teams/:team_slug/memberships/:username\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const m = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .find((x) => x.user_id === user.id);\n if (!m) throw notFound();\n\n return c.json(formatTeamMembership(baseUrl, org.login, team.slug, user, m.role));\n });\n\n app.get(\"/orgs/:org/teams/:team_slug/repos\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const links = gh.teamRepos.findBy(\"team_id\", team.id);\n const repos = links\n .map((l) => gh.repos.get(l.repo_id))\n .filter((r): r is GitHubRepo => Boolean(r))\n .sort((a, b) => a.id - b.id);\n\n const { page, per_page } = parsePagination(c);\n const total = repos.length;\n const start = (page - 1) * per_page;\n const slice = repos.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((r) => formatRepo(r, gh, baseUrl)));\n });\n\n app.put(\"/orgs/:org/teams/:team_slug/repos/:owner/:repo\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const ownerLogin = c.req.param(\"owner\")!;\n const ownerInfo = lookupOwner(gh, ownerLogin);\n if (!ownerInfo || ownerInfo.type !== \"Organization\" || ownerInfo.id !== org.id) {\n throw new ApiError(422, \"Repository must belong to this organization\");\n }\n const repo = lookupRepo(gh, ownerLogin, c.req.param(\"repo\")!);\n if (!repo) throw notFound();\n\n if (!findTeamRepo(gh, team.id, repo.id)) {\n gh.teamRepos.insert({ team_id: team.id, repo_id: repo.id });\n syncTeamRepoCount(gh, team.id);\n }\n return c.body(null, 204);\n });\n\n app.delete(\"/orgs/:org/teams/:team_slug/repos/:owner/:repo\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const ownerLogin = c.req.param(\"owner\")!;\n const ownerInfo = lookupOwner(gh, ownerLogin);\n if (!ownerInfo || ownerInfo.type !== \"Organization\" || ownerInfo.id !== org.id) {\n throw new ApiError(422, \"Repository must belong to this organization\");\n }\n const repo = lookupRepo(gh, ownerLogin, c.req.param(\"repo\")!);\n if (!repo) throw notFound();\n\n const tr = findTeamRepo(gh, team.id, repo.id);\n if (tr) {\n gh.teamRepos.delete(tr.id);\n syncTeamRepoCount(gh, team.id);\n }\n return c.body(null, 204);\n });\n\n app.get(\"/teams/:team_id\", (c) => {\n const tid = parseInt(c.req.param(\"team_id\") ?? \"\", 10);\n if (Number.isNaN(tid)) throw notFound();\n const team = gh.teams.get(tid);\n if (!team) throw notFound();\n return c.json(formatTeamBrief(team, gh, baseUrl));\n });\n\n app.get(\"/teams/:team_id/members\", (c) => {\n const tid = parseInt(c.req.param(\"team_id\") ?? \"\", 10);\n if (Number.isNaN(tid)) throw notFound();\n const team = gh.teams.get(tid);\n if (!team) throw notFound();\n\n const roleQ = (c.req.query(\"role\") ?? \"all\").toLowerCase();\n if (roleQ !== \"all\" && roleQ !== \"member\" && roleQ !== \"maintainer\") {\n throw new ApiError(422, \"Invalid role parameter\");\n }\n\n let members = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .map((m) => {\n const user = gh.users.get(m.user_id);\n return user ? { user, role: m.role } : null;\n })\n .filter((x): x is { user: GitHubUser; role: \"member\" | \"maintainer\" } => Boolean(x));\n\n if (roleQ === \"member\") members = members.filter((m) => m.role === \"member\");\n else if (roleQ === \"maintainer\") members = members.filter((m) => m.role === \"maintainer\");\n\n members.sort((a, b) => a.user.id - b.user.id);\n\n const { page, per_page } = parsePagination(c);\n const total = members.length;\n const start = (page - 1) * per_page;\n const slice = members.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((m) => formatUser(m.user, baseUrl)));\n });\n}\n","import type { RouteContext, WebhookDispatcher, AuthUser } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubRelease, GitHubReleaseAsset, GitHubRepo, GitHubUser } from \"../entities.js\";\nimport {\n formatRelease,\n formatReleaseAsset,\n formatRepo,\n formatUser,\n generateNodeId,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport {\n assertRepoRead,\n assertRepoWrite,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\n/** Draft releases are omitted for anonymous API clients; any authenticated user may see them once repo read is allowed. */\nfunction isAuthenticatedActor(gh: GitHubStore, authUser: AuthUser | undefined): boolean {\n return Boolean(authUser && getActorUser(gh, authUser));\n}\n\nfunction assertReleaseVisible(\n gh: GitHubStore,\n authUser: AuthUser | undefined,\n release: GitHubRelease\n) {\n if (release.draft && !isAuthenticatedActor(gh, authUser)) {\n throw notFoundResponse();\n }\n}\n\nfunction releasesForRepo(gh: GitHubStore, repoId: number): GitHubRelease[] {\n return gh.releases.findBy(\"repo_id\", repoId);\n}\n\nfunction findReleaseById(gh: GitHubStore, repoId: number, releaseId: number): GitHubRelease | undefined {\n const r = gh.releases.get(releaseId);\n if (!r || r.repo_id !== repoId) return undefined;\n return r;\n}\n\nfunction findReleaseByTag(gh: GitHubStore, repoId: number, tagName: string): GitHubRelease | undefined {\n return releasesForRepo(gh, repoId).find((rel) => rel.tag_name === tagName);\n}\n\nfunction tagTaken(gh: GitHubStore, repoId: number, tagName: string, exceptId?: number): boolean {\n return releasesForRepo(gh, repoId).some((r) => r.tag_name === tagName && r.id !== exceptId);\n}\n\nfunction sortReleasesByCreatedDesc(a: GitHubRelease, b: GitHubRelease): number {\n return b.created_at.localeCompare(a.created_at);\n}\n\nfunction deleteAssetsForRelease(gh: GitHubStore, releaseId: number) {\n for (const a of gh.releaseAssets.findBy(\"release_id\", releaseId)) {\n gh.releaseAssets.delete(a.id);\n }\n}\n\nfunction dispatchReleaseWebhook(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n actor: GitHubUser,\n release: GitHubRelease,\n action: string,\n baseUrl: string\n) {\n const relFmt = formatRelease(release, gh, baseUrl);\n if (!relFmt) return;\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"release\",\n action,\n {\n action,\n release: relFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n}\n\nexport function releasesRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/releases\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const authUser = c.get(\"authUser\");\n const showDrafts = isAuthenticatedActor(gh, authUser);\n\n let list = releasesForRepo(gh, repo.id);\n if (!showDrafts) {\n list = list.filter((r) => !r.draft);\n }\n list = [...list].sort(sortReleasesByCreatedDesc);\n\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n\n const out = pageItems\n .map((r) => formatRelease(r, gh, baseUrl))\n .filter(Boolean);\n return c.json(out);\n });\n\n app.post(\"/repos/:owner/:repo/releases/generate-notes\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n const tagName = typeof body.tag_name === \"string\" ? body.tag_name : \"\";\n const target =\n typeof body.target_commitish === \"string\" ? body.target_commitish : undefined;\n const prev =\n typeof body.previous_tag_name === \"string\" ? body.previous_tag_name : undefined;\n return c.json({\n name: tagName ? `Release ${tagName}` : \"Release\",\n body: `## What's changed\\n\\n_Auto-generated release notes (stub)._\\n\\n<!-- target: ${target ?? \"default\"} previous: ${prev ?? \"none\"} -->`,\n });\n });\n\n app.get(\"/repos/:owner/:repo/releases/latest\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const candidates = releasesForRepo(gh, repo.id).filter(\n (r) => !r.draft && !r.prerelease && r.published_at\n );\n if (candidates.length === 0) throw notFoundResponse();\n\n candidates.sort((a, b) => {\n const pa = a.published_at ?? a.created_at;\n const pb = b.published_at ?? b.created_at;\n return pb.localeCompare(pa);\n });\n const latest = candidates[0]!;\n const fmt = formatRelease(latest, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.get(\"/repos/:owner/:repo/releases/tags/:tag\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const tag = decodeURIComponent(c.req.param(\"tag\")!);\n const release = findReleaseByTag(gh, repo.id, tag);\n if (!release) throw notFoundResponse();\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n\n const fmt = formatRelease(release, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.get(\"/repos/:owner/:repo/releases/assets/:asset_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const assetId = parseInt(c.req.param(\"asset_id\")!, 10);\n if (!Number.isFinite(assetId)) throw notFoundResponse();\n\n const asset = gh.releaseAssets.get(assetId);\n if (!asset || asset.repo_id !== repo.id) throw notFoundResponse();\n\n const release = gh.releases.get(asset.release_id);\n if (release) {\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n }\n\n return c.json(formatReleaseAsset(asset, repo, baseUrl));\n });\n\n app.patch(\"/repos/:owner/:repo/releases/assets/:asset_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const assetId = parseInt(c.req.param(\"asset_id\")!, 10);\n if (!Number.isFinite(assetId)) throw notFoundResponse();\n\n const asset = gh.releaseAssets.get(assetId);\n if (!asset || asset.repo_id !== repo.id) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubReleaseAsset> = {};\n if (typeof body.name === \"string\") patch.name = body.name;\n if (typeof body.label === \"string\" || body.label === null) patch.label = body.label as string | null;\n\n const updated = gh.releaseAssets.update(asset.id, patch);\n if (!updated) throw notFoundResponse();\n\n return c.json(formatReleaseAsset(updated, repo, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/releases/assets/:asset_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const assetId = parseInt(c.req.param(\"asset_id\")!, 10);\n if (!Number.isFinite(assetId)) throw notFoundResponse();\n\n const asset = gh.releaseAssets.get(assetId);\n if (!asset || asset.repo_id !== repo.id) throw notFoundResponse();\n\n gh.releaseAssets.delete(asset.id);\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/releases\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n if (typeof body.tag_name !== \"string\" || !body.tag_name.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const tag_name = body.tag_name.trim();\n if (tagTaken(gh, repo.id, tag_name)) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const target_commitish =\n typeof body.target_commitish === \"string\" && body.target_commitish.trim()\n ? body.target_commitish.trim()\n : repo.default_branch;\n\n const draft = typeof body.draft === \"boolean\" ? body.draft : false;\n const prerelease = typeof body.prerelease === \"boolean\" ? body.prerelease : false;\n\n let name: string | null =\n typeof body.name === \"string\" || body.name === null ? (body.name as string | null) : null;\n let releaseBody: string | null =\n typeof body.body === \"string\" || body.body === null ? (body.body as string | null) : null;\n\n if (body.generate_release_notes === true) {\n releaseBody =\n releaseBody ??\n `## What's changed\\n\\n_Auto-generated release notes (stub) for ${tag_name}._`;\n name = name ?? `Release ${tag_name}`;\n }\n\n const published_at = draft ? null : timestamp();\n\n const row = gh.releases.insert({\n node_id: \"\",\n repo_id: repo.id,\n tag_name,\n target_commitish,\n name,\n body: releaseBody,\n draft,\n prerelease,\n author_id: actor.id,\n published_at,\n } as Omit<GitHubRelease, \"id\" | \"created_at\" | \"updated_at\">);\n gh.releases.update(row.id, { node_id: generateNodeId(\"Release\", row.id) });\n\n const release = gh.releases.get(row.id)!;\n\n if (draft) {\n dispatchReleaseWebhook(webhooks, gh, repo, actor, release, \"created\", baseUrl);\n } else {\n dispatchReleaseWebhook(webhooks, gh, repo, actor, release, \"published\", baseUrl);\n }\n\n const fmt = formatRelease(release, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/releases/:release_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n\n const fmt = formatRelease(release, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.patch(\"/repos/:owner/:repo/releases/:release_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubRelease> = {};\n\n if (typeof body.tag_name === \"string\" && body.tag_name.trim()) {\n const nextTag = body.tag_name.trim();\n if (tagTaken(gh, repo.id, nextTag, release.id)) {\n throw new ApiError(422, \"Validation failed\");\n }\n patch.tag_name = nextTag;\n }\n if (typeof body.target_commitish === \"string\" && body.target_commitish.trim()) {\n patch.target_commitish = body.target_commitish.trim();\n }\n if (typeof body.name === \"string\" || body.name === null) patch.name = body.name as string | null;\n if (typeof body.body === \"string\" || body.body === null) patch.body = body.body as string | null;\n if (typeof body.draft === \"boolean\") patch.draft = body.draft;\n if (typeof body.prerelease === \"boolean\") patch.prerelease = body.prerelease;\n\n const wasDraft = release.draft;\n let publishedJustNow = false;\n if (wasDraft && typeof body.draft === \"boolean\" && body.draft === false) {\n patch.published_at = timestamp();\n publishedJustNow = true;\n }\n\n const updated = gh.releases.update(release.id, patch);\n if (!updated) throw notFoundResponse();\n\n if (publishedJustNow) {\n dispatchReleaseWebhook(webhooks, gh, repo, actor, updated, \"published\", baseUrl);\n }\n\n const fmt = formatRelease(updated, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.delete(\"/repos/:owner/:repo/releases/:release_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n\n deleteAssetsForRelease(gh, release.id);\n gh.releases.delete(release.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/releases/:release_id/assets\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n\n let assets = gh.releaseAssets.findBy(\"release_id\", release.id);\n assets = [...assets].sort((a, b) => b.created_at.localeCompare(a.created_at));\n\n const { page, per_page } = parsePagination(c);\n const total = assets.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = assets.slice(start, start + per_page);\n\n return c.json(pageItems.map((a) => formatReleaseAsset(a, repo, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/releases/:release_id/assets\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n\n const nameQ = c.req.query(\"name\");\n if (!nameQ || !nameQ.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const assetName = nameQ.trim();\n const labelRaw = c.req.query(\"label\");\n const label = labelRaw === undefined || labelRaw === \"\" ? null : labelRaw;\n\n const buf = await c.req.arrayBuffer();\n const size = buf.byteLength;\n\n const contentType =\n c.req.header(\"Content-Type\")?.split(\";\")[0]?.trim() || \"application/octet-stream\";\n\n const row = gh.releaseAssets.insert({\n node_id: \"\",\n release_id: release.id,\n repo_id: repo.id,\n name: assetName,\n label,\n state: \"uploaded\",\n content_type: contentType,\n size,\n download_count: 0,\n uploader_id: actor.id,\n } as Omit<GitHubReleaseAsset, \"id\" | \"created_at\" | \"updated_at\">);\n gh.releaseAssets.update(row.id, { node_id: generateNodeId(\"ReleaseAsset\", row.id) });\n\n const asset = gh.releaseAssets.get(row.id)!;\n return c.json(formatReleaseAsset(asset, repo, baseUrl), 201);\n });\n}\n","import type { RouteContext, AuthUser, WebhookDelivery } from \"@emulators/core\";\nimport {\n ApiError,\n forbidden,\n parseJsonBody,\n parsePagination,\n setLinkHeader,\n unauthorized,\n} from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubOrg, GitHubRepo, GitHubUser, GitHubWebhook } from \"../entities.js\";\nimport { formatRepo, formatUser, formatWebhook, lookupRepo } from \"../helpers.js\";\nimport {\n assertRepoAdmin,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction teamsForOrg(gh: GitHubStore, orgId: number) {\n return gh.teams.findBy(\"org_id\", orgId);\n}\n\nfunction listOrgMembersDeduped(\n gh: GitHubStore,\n orgId: number\n): { user: GitHubUser; orgRole: \"admin\" | \"member\" }[] {\n const byUser = new Map<number, { user: GitHubUser; isAdmin: boolean }>();\n for (const team of teamsForOrg(gh, orgId)) {\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n const user = gh.users.get(m.user_id);\n if (!user) continue;\n const isAdmin = m.role === \"maintainer\";\n const prev = byUser.get(user.id);\n if (!prev) {\n byUser.set(user.id, { user, isAdmin });\n } else {\n byUser.set(user.id, { user, isAdmin: prev.isAdmin || isAdmin });\n }\n }\n }\n return [...byUser.values()]\n .map(({ user, isAdmin }) => ({\n user,\n orgRole: isAdmin ? (\"admin\" as const) : (\"member\" as const),\n }))\n .sort((a, b) => a.user.id - b.user.id);\n}\n\nfunction orgRoleForUser(gh: GitHubStore, orgId: number, userId: number): \"admin\" | \"member\" | null {\n const row = listOrgMembersDeduped(gh, orgId).find((r) => r.user.id === userId);\n return row?.orgRole ?? null;\n}\n\nfunction assertOrgAdmin(gh: GitHubStore, authUser: AuthUser | undefined, org: GitHubOrg) {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n if (orgRoleForUser(gh, org.id, user.id) === \"admin\") return;\n throw forbidden();\n}\n\nfunction getOrgByLogin(gh: GitHubStore, login: string): GitHubOrg | undefined {\n return gh.orgs.findOneBy(\"login\", login);\n}\n\nfunction pathPrefixForWebhook(wh: GitHubWebhook, ownerPath: string): string {\n return wh.repo_id != null ? `repos/${ownerPath}` : `orgs/${ownerPath}`;\n}\n\nfunction findRepoHook(gh: GitHubStore, repoId: number, hookId: number): GitHubWebhook | undefined {\n const wh = gh.webhooks.get(hookId);\n if (!wh || wh.repo_id !== repoId) return undefined;\n return wh;\n}\n\nfunction findOrgHook(gh: GitHubStore, orgId: number, hookId: number): GitHubWebhook | undefined {\n const wh = gh.webhooks.get(hookId);\n if (!wh || wh.org_id !== orgId) return undefined;\n return wh;\n}\n\nfunction webhooksForRepo(gh: GitHubStore, repoId: number): GitHubWebhook[] {\n return gh.webhooks.findBy(\"repo_id\", repoId).filter((w) => w.repo_id === repoId);\n}\n\nfunction webhooksForOrg(gh: GitHubStore, orgId: number): GitHubWebhook[] {\n return gh.webhooks.findBy(\"org_id\", orgId).filter((w) => w.org_id === orgId);\n}\n\nfunction normalizeInsecureSsl(v: unknown): string {\n if (v === true) return \"1\";\n if (v === false) return \"0\";\n if (typeof v === \"string\" && (v === \"0\" || v === \"1\")) return v;\n return \"0\";\n}\n\nfunction parseHookConfig(\n raw: unknown,\n existing?: GitHubWebhook[\"config\"]\n): GitHubWebhook[\"config\"] | null {\n if (raw === undefined && existing) return existing;\n if (!raw || typeof raw !== \"object\") return null;\n const o = raw as Record<string, unknown>;\n const urlRaw = typeof o.url === \"string\" ? o.url.trim() : \"\";\n const url = urlRaw || existing?.url || \"\";\n if (!url) return null;\n const content_type =\n typeof o.content_type === \"string\" && o.content_type\n ? o.content_type\n : existing?.content_type ?? \"json\";\n let secret: string | undefined;\n if (o.secret === null) {\n secret = undefined;\n } else if (typeof o.secret === \"string\") {\n secret = o.secret;\n } else if (existing?.secret !== undefined) {\n secret = existing.secret;\n }\n const insecure_ssl = normalizeInsecureSsl(\n o.insecure_ssl !== undefined ? o.insecure_ssl : (existing?.insecure_ssl ?? \"0\")\n );\n return { url, content_type, secret, insecure_ssl };\n}\n\nfunction formatHookDelivery(\n d: WebhookDelivery,\n baseUrl: string,\n pathPrefix: string,\n hookId: number\n) {\n return {\n id: d.id,\n guid: `${d.hook_id}-${d.id}-${d.delivered_at}`,\n delivered_at: d.delivered_at,\n redelivery: false,\n duration: d.duration,\n status: d.success ? \"OK\" : \"Failed\",\n status_code: d.status_code,\n event: d.event,\n action: d.action ?? null,\n url: `${baseUrl}/${pathPrefix}/hooks/${hookId}/deliveries/${d.id}`,\n };\n}\n\nexport function webhooksRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Repository webhooks ---\n\n app.get(\"/repos/:owner/:repo/hooks\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n\n let list = webhooksForRepo(gh, repo.id).sort((a, b) => a.id - b.id);\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n list = list.slice(start, start + per_page);\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(list.map((wh) => formatWebhook(wh, baseUrl, ownerPath)));\n });\n\n app.post(\"/repos/:owner/:repo/hooks\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" && body.name.trim() ? body.name.trim() : \"web\";\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : [\"push\"];\n const active = typeof body.active === \"boolean\" ? body.active : true;\n const config = parseHookConfig(body.config);\n if (!config) throw new ApiError(422, \"config.url is required\");\n\n const wh = gh.webhooks.insert({\n repo_id: repo.id,\n org_id: null,\n name,\n active,\n events,\n config,\n last_response: { code: null, status: \"unused\", message: null },\n });\n\n webhooks.register({\n id: wh.id,\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n owner,\n repo: repo.name,\n });\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(formatWebhook(wh, baseUrl, ownerPath), 201);\n });\n\n app.get(\"/repos/:owner/:repo/hooks/:hook_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(formatWebhook(wh, baseUrl, ownerPath));\n });\n\n app.patch(\"/repos/:owner/:repo/hooks/:hook_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const existing = findRepoHook(gh, repo.id, hookId);\n if (!existing) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : existing.name;\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : existing.events;\n const active = typeof body.active === \"boolean\" ? body.active : existing.active;\n const config =\n body.config !== undefined ? parseHookConfig(body.config, existing.config) : existing.config;\n if (!config) throw new ApiError(422, \"Invalid config\");\n\n const wh = gh.webhooks.update(hookId, { name, active, events, config })!;\n webhooks.updateSubscription(hookId, {\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n });\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(formatWebhook(wh, baseUrl, ownerPath));\n });\n\n app.delete(\"/repos/:owner/:repo/hooks/:hook_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n webhooks.unregister(hookId);\n gh.webhooks.delete(hookId);\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/hooks/:hook_id/pings\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const ownerPath = `${owner}/${repoName}`;\n await webhooks.dispatch(\n \"ping\",\n undefined,\n {\n zen: \"Keep it logically awesome.\",\n hook_id: wh.id,\n hook: formatWebhook(wh, baseUrl, ownerPath),\n },\n owner,\n repo.name\n );\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/hooks/:hook_id/tests\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const actor =\n getActorUser(gh, c.get(\"authUser\")!) ?? gh.users.get(repo.owner_id) ?? gh.users.all()[0];\n const testPayload = {\n ref: \"refs/heads/main\",\n before: \"0000000000000000000000000000000000000000\",\n after: \"0000000000000000000000000000000000000000\",\n repository: formatRepo(repo, gh, baseUrl),\n pusher: actor ? formatUser(actor, baseUrl) : null,\n sender: actor ? formatUser(actor, baseUrl) : null,\n };\n await webhooks.dispatch(\"push\", undefined, testPayload, ownerLogin, repo.name);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/hooks/:hook_id/deliveries\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n let list = webhooks.getDeliveries(wh.id).sort((a, b) => b.id - a.id);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n list = list.slice(start, start + per_page);\n\n const pp = pathPrefixForWebhook(wh, `${owner}/${repoName}`);\n return c.json(list.map((d) => formatHookDelivery(d, baseUrl, pp, wh.id)));\n });\n\n app.get(\"/repos/:owner/:repo/hooks/:hook_id/deliveries/:delivery_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const deliveryId = Number(c.req.param(\"delivery_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId) || !Number.isFinite(deliveryId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const d = webhooks.getDeliveries(wh.id).find((x) => x.id === deliveryId);\n if (!d) throw notFoundResponse();\n\n const pp = pathPrefixForWebhook(wh, `${owner}/${repoName}`);\n return c.json(formatHookDelivery(d, baseUrl, pp, wh.id));\n });\n\n // --- Organization webhooks ---\n\n app.get(\"/orgs/:org/hooks\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n\n let list = webhooksForOrg(gh, org.id).sort((a, b) => a.id - b.id);\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n list = list.slice(start, start + per_page);\n\n return c.json(list.map((wh) => formatWebhook(wh, baseUrl, org.login)));\n });\n\n app.post(\"/orgs/:org/hooks\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" && body.name.trim() ? body.name.trim() : \"web\";\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : [\"push\"];\n const active = typeof body.active === \"boolean\" ? body.active : true;\n const config = parseHookConfig(body.config);\n if (!config) throw new ApiError(422, \"config.url is required\");\n\n const wh = gh.webhooks.insert({\n repo_id: null,\n org_id: org.id,\n name,\n active,\n events,\n config,\n last_response: { code: null, status: \"unused\", message: null },\n });\n\n webhooks.register({\n id: wh.id,\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n owner: org.login,\n repo: undefined,\n });\n\n return c.json(formatWebhook(wh, baseUrl, org.login), 201);\n });\n\n app.get(\"/orgs/:org/hooks/:hook_id\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findOrgHook(gh, org.id, hookId);\n if (!wh) throw notFoundResponse();\n\n return c.json(formatWebhook(wh, baseUrl, org.login));\n });\n\n app.patch(\"/orgs/:org/hooks/:hook_id\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const existing = findOrgHook(gh, org.id, hookId);\n if (!existing) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : existing.name;\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : existing.events;\n const active = typeof body.active === \"boolean\" ? body.active : existing.active;\n const config =\n body.config !== undefined ? parseHookConfig(body.config, existing.config) : existing.config;\n if (!config) throw new ApiError(422, \"Invalid config\");\n\n const wh = gh.webhooks.update(hookId, { name, active, events, config })!;\n webhooks.updateSubscription(hookId, {\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n });\n\n return c.json(formatWebhook(wh, baseUrl, org.login));\n });\n\n app.delete(\"/orgs/:org/hooks/:hook_id\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findOrgHook(gh, org.id, hookId);\n if (!wh) throw notFoundResponse();\n\n webhooks.unregister(hookId);\n gh.webhooks.delete(hookId);\n return c.body(null, 204);\n });\n\n app.post(\"/orgs/:org/hooks/:hook_id/pings\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findOrgHook(gh, org.id, hookId);\n if (!wh) throw notFoundResponse();\n\n await webhooks.dispatch(\n \"ping\",\n undefined,\n {\n zen: \"Keep it logically awesome.\",\n hook_id: wh.id,\n hook: formatWebhook(wh, baseUrl, org.login),\n },\n org.login,\n undefined\n );\n return c.body(null, 204);\n });\n}\n","import type { RouteContext, AuthUser } from \"@emulators/core\";\nimport { ApiError, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBlob,\n GitHubCommit,\n GitHubIssue,\n GitHubOrg,\n GitHubPullRequest,\n GitHubRepo,\n GitHubUser,\n} from \"../entities.js\";\nimport {\n formatIssue,\n formatOrgBrief,\n formatPullRequest,\n formatRepo,\n formatUser,\n lookupRepo,\n} from \"../helpers.js\";\nimport { canAccessRepo } from \"../route-helpers.js\";\n\n/** Parsed GitHub-style search query (q parameter). */\nexport interface ParsedSearchQuery {\n text: string;\n qualifiers: Map<string, string[]>;\n negations: Map<string, string[]>;\n ranges: Map<string, Array<{ op: string; value: number | string }>>;\n}\n\nfunction tokenizeSearchQuery(q: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n let buf = \"\";\n let quote: '\"' | \"'\" | null = null;\n while (i < q.length) {\n const c = q[i]!;\n if (quote) {\n if (c === quote) {\n quote = null;\n i++;\n continue;\n }\n buf += c;\n i++;\n continue;\n }\n if (c === '\"' || c === \"'\") {\n quote = c;\n i++;\n continue;\n }\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n if (buf.length) {\n tokens.push(buf);\n buf = \"\";\n }\n i++;\n continue;\n }\n buf += c;\n i++;\n }\n if (buf.length) tokens.push(buf);\n return tokens;\n}\n\nfunction parseRangeToken(\n raw: string\n): { op: string; value: number | string } | null {\n const range = /^(\\d+)\\.\\.(\\d+)$/.exec(raw);\n if (range) {\n return { op: \"..\", value: `${range[1]}..${range[2]}` };\n }\n const cmp = /^(>=|<=|>|<)(\\d+)$/.exec(raw);\n if (cmp) {\n return { op: cmp[1]!, value: parseInt(cmp[2]!, 10) };\n }\n if (/^\\d+$/.test(raw)) {\n return { op: \"=\", value: parseInt(raw, 10) };\n }\n return null;\n}\n\n/**\n * Splits `q` into free text vs qualifiers, handles `-qualifier:value` negation,\n * and numeric ranges (`stars:>10`, `stars:10..50`).\n */\nexport function parseSearchQuery(q: string): ParsedSearchQuery {\n const qualifiers = new Map<string, string[]>();\n const negations = new Map<string, string[]>();\n const ranges = new Map<string, Array<{ op: string; value: number | string }>>();\n const textParts: string[] = [];\n\n for (const rawTok of tokenizeSearchQuery(q.trim())) {\n let neg = false;\n let tok = rawTok;\n if (tok.startsWith(\"-\") && tok.includes(\":\") && tok.length > 1) {\n neg = true;\n tok = tok.slice(1);\n }\n\n const colon = tok.indexOf(\":\");\n if (colon <= 0) {\n textParts.push(rawTok);\n continue;\n }\n\n const key = tok.slice(0, colon).toLowerCase();\n const rawVal = tok.slice(colon + 1);\n if (!rawVal.length) {\n textParts.push(rawTok);\n continue;\n }\n\n const rangePred = parseRangeToken(rawVal);\n const isRangeKey =\n key === \"stars\" ||\n key === \"forks\" ||\n key === \"repos\" ||\n key === \"followers\" ||\n key === \"comments\" ||\n key === \"size\";\n\n if (rangePred && (rangePred.op !== \"=\" || isRangeKey)) {\n if (neg) {\n if (!negations.has(key)) negations.set(key, []);\n negations.get(key)!.push(rawVal);\n } else {\n if (!ranges.has(key)) ranges.set(key, []);\n ranges.get(key)!.push(rangePred);\n }\n continue;\n }\n\n if (neg) {\n if (!negations.has(key)) negations.set(key, []);\n negations.get(key)!.push(rawVal);\n } else {\n if (!qualifiers.has(key)) qualifiers.set(key, []);\n qualifiers.get(key)!.push(rawVal);\n }\n }\n\n return {\n text: textParts.join(\" \").trim(),\n qualifiers,\n negations,\n ranges,\n };\n}\n\nfunction textMatches(haystack: string, needle: string): boolean {\n if (!needle.trim()) return true;\n return haystack.toLowerCase().includes(needle.toLowerCase());\n}\n\nfunction repoVisibleForSearch(repo: GitHubRepo, gh: GitHubStore, authUser: AuthUser | undefined): boolean {\n return canAccessRepo(gh, authUser, repo);\n}\n\nfunction ownerLogin(gh: GitHubStore, repo: GitHubRepo): string {\n if (repo.owner_type === \"User\") {\n return gh.users.get(repo.owner_id)?.login ?? \"\";\n }\n return gh.orgs.get(repo.owner_id)?.login ?? \"\";\n}\n\nfunction matchesNumericPredicate(\n actual: number,\n preds: Array<{ op: string; value: number | string }>,\n equalsFromQualifiers: string[]\n): boolean {\n for (const e of equalsFromQualifiers) {\n if (/^\\d+$/.test(e) && actual !== parseInt(e, 10)) return false;\n }\n for (const p of preds) {\n if (p.op === \"..\") {\n const m = /^(\\d+)\\.\\.(\\d+)$/.exec(String(p.value));\n if (m) {\n const lo = parseInt(m[1]!, 10);\n const hi = parseInt(m[2]!, 10);\n if (actual < lo || actual > hi) return false;\n }\n } else if (p.op === \">\") {\n if (!(actual > Number(p.value))) return false;\n } else if (p.op === \"<\") {\n if (!(actual < Number(p.value))) return false;\n } else if (p.op === \">=\") {\n if (!(actual >= Number(p.value))) return false;\n } else if (p.op === \"<=\") {\n if (!(actual <= Number(p.value))) return false;\n } else if (p.op === \"=\") {\n if (actual !== Number(p.value)) return false;\n }\n }\n return true;\n}\n\nfunction filterRepos(\n gh: GitHubStore,\n repos: GitHubRepo[],\n parsed: ParsedSearchQuery,\n authUser: AuthUser | undefined\n): GitHubRepo[] {\n const qUser = parsed.qualifiers.get(\"user\")?.[0];\n const qOrg = parsed.qualifiers.get(\"org\")?.[0];\n const negUser = parsed.negations.get(\"user\") ?? [];\n const negOrg = parsed.negations.get(\"org\") ?? [];\n\n const inScopes = parsed.qualifiers.get(\"in\") ?? [];\n const negIn = parsed.negations.get(\"in\") ?? [];\n\n return repos.filter((repo) => {\n if (!repoVisibleForSearch(repo, gh, authUser)) return false;\n\n const ologin = ownerLogin(gh, repo);\n if (qUser && ologin.toLowerCase() !== qUser.toLowerCase()) return false;\n if (qOrg && ologin.toLowerCase() !== qOrg.toLowerCase()) return false;\n if (repo.owner_type === \"User\" && negUser.some((n) => ologin.toLowerCase() === n.toLowerCase())) {\n return false;\n }\n if (repo.owner_type === \"Organization\" && negOrg.some((n) => ologin.toLowerCase() === n.toLowerCase())) {\n return false;\n }\n\n for (const lang of parsed.qualifiers.get(\"language\") ?? []) {\n if (!repo.language || repo.language.toLowerCase() !== lang.toLowerCase()) return false;\n }\n for (const lang of parsed.negations.get(\"language\") ?? []) {\n if (repo.language && repo.language.toLowerCase() === lang.toLowerCase()) return false;\n }\n\n for (const topic of parsed.qualifiers.get(\"topic\") ?? []) {\n if (!repo.topics.some((t) => t.toLowerCase() === topic.toLowerCase())) return false;\n }\n for (const topic of parsed.negations.get(\"topic\") ?? []) {\n if (repo.topics.some((t) => t.toLowerCase() === topic.toLowerCase())) return false;\n }\n\n const starRanges = parsed.ranges.get(\"stars\") ?? [];\n const starEq = parsed.qualifiers.get(\"stars\") ?? [];\n if (!matchesNumericPredicate(repo.stargazers_count, starRanges, starEq)) return false;\n for (const nv of parsed.negations.get(\"stars\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(repo.stargazers_count, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && repo.stargazers_count === parseInt(nv, 10)) {\n return false;\n }\n }\n\n const forkRanges = parsed.ranges.get(\"forks\") ?? [];\n const forkEq = parsed.qualifiers.get(\"forks\") ?? [];\n if (!matchesNumericPredicate(repo.forks_count, forkRanges, forkEq)) return false;\n const negForkVals = parsed.negations.get(\"forks\") ?? [];\n if (negForkVals.length) {\n const negPreds = negForkVals.flatMap((s) => {\n const r = parseRangeToken(s);\n return r ? [r] : [];\n });\n const negEq = negForkVals.filter((s) => /^\\d+$/.test(s));\n if (matchesNumericPredicate(repo.forks_count, negPreds, negEq)) return false;\n }\n\n for (const a of parsed.qualifiers.get(\"archived\") ?? []) {\n const want = a === \"true\";\n if (repo.archived !== want) return false;\n }\n for (const a of parsed.negations.get(\"archived\") ?? []) {\n const want = a === \"true\";\n if (repo.archived === want) return false;\n }\n\n const isVals = parsed.qualifiers.get(\"is\") ?? [];\n for (const is of isVals) {\n if (is === \"public\" && repo.private) return false;\n if (is === \"private\" && !repo.private) return false;\n }\n for (const is of parsed.negations.get(\"is\") ?? []) {\n if (is === \"public\" && !repo.private) return false;\n if (is === \"private\" && repo.private) return false;\n }\n\n for (const f of parsed.qualifiers.get(\"fork\") ?? []) {\n const v = f.toLowerCase();\n if (v === \"true\" && !repo.fork) return false;\n if (v === \"false\" && repo.fork) return false;\n if (v === \"only\" && !repo.fork) return false;\n }\n for (const f of parsed.negations.get(\"fork\") ?? []) {\n const v = f.toLowerCase();\n if (v === \"true\" && repo.fork) return false;\n if (v === \"false\" && !repo.fork) return false;\n if (v === \"only\" && repo.fork) return false;\n }\n\n const searchIn =\n inScopes.length > 0\n ? inScopes.map((s) => s.toLowerCase())\n : [\"name\", \"description\", \"topics\"];\n\n const text = parsed.text;\n if (text.length) {\n const nameMatch = textMatches(repo.name, text);\n const fullMatch = textMatches(repo.full_name, text);\n const descMatch = repo.description ? textMatches(repo.description, text) : false;\n const topicsMatch = repo.topics.some((t) => textMatches(t, text));\n\n let ok = false;\n if (searchIn.includes(\"name\") && (nameMatch || fullMatch)) ok = true;\n if (searchIn.includes(\"description\") && descMatch) ok = true;\n if (searchIn.includes(\"topics\") && topicsMatch) ok = true;\n if (!ok) return false;\n }\n\n for (const n of negIn) {\n const scope = n.toLowerCase();\n if (scope === \"name\" && (textMatches(repo.name, parsed.text) || textMatches(repo.full_name, parsed.text))) {\n return false;\n }\n if (scope === \"description\" && repo.description && textMatches(repo.description, parsed.text)) {\n return false;\n }\n if (scope === \"topics\" && repo.topics.some((t) => textMatches(t, parsed.text))) {\n return false;\n }\n }\n\n return true;\n });\n}\n\nfunction repoRelevance(repo: GitHubRepo, parsed: ParsedSearchQuery): number {\n const t = parsed.text.trim().toLowerCase();\n if (!t) return 1;\n let score = 0;\n if (repo.name.toLowerCase().includes(t)) score += 5;\n if (repo.full_name.toLowerCase().includes(t)) score += 4;\n if (repo.description?.toLowerCase().includes(t)) score += 2;\n if (repo.topics.some((x) => x.toLowerCase().includes(t))) score += 1;\n return score;\n}\n\nfunction resolveRepoQualifier(gh: GitHubStore, spec: string): GitHubRepo | null {\n const trimmed = spec.trim();\n if (!trimmed.includes(\"/\")) return null;\n return lookupRepo(gh, trimmed.split(\"/\")[0]!, trimmed.split(\"/\")[1]!) ?? null;\n}\n\nfunction issuePrMatchesFilters(\n gh: GitHubStore,\n parsed: ParsedSearchQuery,\n repo: GitHubRepo,\n issue: GitHubIssue | null,\n pr: GitHubPullRequest | null\n): boolean {\n const repoSpecs = parsed.qualifiers.get(\"repo\") ?? [];\n for (const rs of repoSpecs) {\n const r = resolveRepoQualifier(gh, rs);\n if (!r || r.id !== repo.id) return false;\n }\n for (const rs of parsed.negations.get(\"repo\") ?? []) {\n const r = resolveRepoQualifier(gh, rs);\n if (r && r.id === repo.id) return false;\n }\n\n const isVals = [...(parsed.qualifiers.get(\"is\") ?? []), ...(parsed.qualifiers.get(\"type\") ?? [])].map((x) =>\n x.toLowerCase()\n );\n const negIs = [...(parsed.negations.get(\"is\") ?? []), ...(parsed.negations.get(\"type\") ?? [])].map((x) =>\n x.toLowerCase()\n );\n\n const isPr = pr !== null || issue?.is_pull_request === true;\n\n if (isVals.includes(\"issue\") && isPr) return false;\n if (isVals.includes(\"pr\") && !isPr) return false;\n\n if (negIs.includes(\"issue\") && !isPr) return false;\n if (negIs.includes(\"pr\") && isPr) return false;\n\n const stateVals = parsed.qualifiers.get(\"state\") ?? [];\n for (const s of stateVals) {\n const sl = s.toLowerCase();\n if (isPr && pr) {\n if (sl === \"open\" && pr.state !== \"open\") return false;\n if (sl === \"closed\" && pr.state !== \"closed\") return false;\n } else if (issue) {\n if (sl === \"open\" && issue.state !== \"open\") return false;\n if (sl === \"closed\" && issue.state !== \"closed\") return false;\n }\n }\n\n for (const iv of isVals) {\n if (iv === \"open\") {\n if (isPr && pr && pr.state !== \"open\") return false;\n if (!isPr && issue && issue.state !== \"open\") return false;\n }\n if (iv === \"closed\") {\n if (isPr && pr && pr.state !== \"closed\") return false;\n if (!isPr && issue && issue.state !== \"closed\") return false;\n }\n if (iv === \"merged\") {\n if (!isPr || !pr || !pr.merged) return false;\n }\n if (iv === \"draft\") {\n if (!isPr || !pr || !pr.draft) return false;\n }\n }\n\n for (const iv of negIs) {\n if (iv === \"open\") {\n if (isPr && pr && pr.state === \"open\") return false;\n if (!isPr && issue && issue.state === \"open\") return false;\n }\n if (iv === \"closed\") {\n if (isPr && pr && pr.state === \"closed\") return false;\n if (!isPr && issue && issue.state === \"closed\") return false;\n }\n if (iv === \"merged\") {\n if (isPr && pr && pr.merged) return false;\n }\n if (iv === \"draft\") {\n if (isPr && pr && pr.draft) return false;\n }\n }\n\n const authors = parsed.qualifiers.get(\"author\") ?? [];\n for (const a of authors) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (isPr && pr) {\n if (!uid || pr.user_id !== uid) return false;\n } else if (issue) {\n if (!uid || issue.user_id !== uid) return false;\n }\n }\n for (const a of parsed.negations.get(\"author\") ?? []) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (isPr && pr && uid !== undefined && pr.user_id === uid) return false;\n if (!isPr && issue && uid !== undefined && issue.user_id === uid) return false;\n }\n\n const assignees = parsed.qualifiers.get(\"assignee\") ?? [];\n for (const a of assignees) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (!uid) return false;\n const ids = isPr && pr ? pr.assignee_ids : issue?.assignee_ids ?? [];\n if (!ids.includes(uid)) return false;\n }\n for (const a of parsed.negations.get(\"assignee\") ?? []) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (uid === undefined) continue;\n const ids = isPr && pr ? pr.assignee_ids : issue?.assignee_ids ?? [];\n if (ids.includes(uid)) return false;\n }\n\n const labels = parsed.qualifiers.get(\"label\") ?? [];\n for (const lb of labels) {\n const labelIds = isPr && pr ? pr.label_ids : issue?.label_ids ?? [];\n const names = labelIds\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => l!.name.toLowerCase());\n if (!names.includes(lb.toLowerCase())) return false;\n }\n for (const lb of parsed.negations.get(\"label\") ?? []) {\n const labelIds = isPr && pr ? pr.label_ids : issue?.label_ids ?? [];\n const names = labelIds\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => l!.name.toLowerCase());\n if (names.includes(lb.toLowerCase())) return false;\n }\n\n const milestones = parsed.qualifiers.get(\"milestone\") ?? [];\n for (const ms of milestones) {\n const mid = isPr && pr ? pr.milestone_id : issue?.milestone_id;\n const m = mid ? gh.milestones.get(mid) : null;\n if (!m || m.title.toLowerCase() !== ms.toLowerCase()) return false;\n }\n for (const ms of parsed.negations.get(\"milestone\") ?? []) {\n const mid = isPr && pr ? pr.milestone_id : issue?.milestone_id;\n const m = mid ? gh.milestones.get(mid) : null;\n if (m && m.title.toLowerCase() === ms.toLowerCase()) return false;\n }\n\n const commentRanges = parsed.ranges.get(\"comments\") ?? [];\n const commentEq = parsed.qualifiers.get(\"comments\") ?? [];\n const n = isPr && pr ? pr.comments : issue?.comments ?? 0;\n if (!matchesNumericPredicate(n, commentRanges, commentEq)) return false;\n for (const nv of parsed.negations.get(\"comments\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(n, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && n === parseInt(nv, 10)) return false;\n }\n\n const text = parsed.text.trim();\n if (text.length) {\n const title = isPr && pr ? pr.title : issue?.title ?? \"\";\n const body = isPr && pr ? pr.body ?? \"\" : issue?.body ?? \"\";\n if (!textMatches(title, text) && !textMatches(body, text)) return false;\n }\n\n return true;\n}\n\nfunction userMatchesSearch(gh: GitHubStore, u: GitHubUser, parsed: ParsedSearchQuery): boolean {\n const types = parsed.qualifiers.get(\"type\") ?? [];\n if (types.length && !types.map((t) => t.toLowerCase()).includes(\"user\")) return false;\n for (const t of parsed.negations.get(\"type\") ?? []) {\n if (t.toLowerCase() === \"user\") return false;\n }\n\n const inScopes = parsed.qualifiers.get(\"in\") ?? [];\n const searchIn = inScopes.length > 0 ? inScopes.map((s) => s.toLowerCase()) : [\"login\", \"email\", \"fullname\"];\n\n const text = parsed.text.trim();\n if (text.length) {\n let ok = false;\n if (searchIn.includes(\"login\") && textMatches(u.login, text)) ok = true;\n if (searchIn.includes(\"email\") && u.email && textMatches(u.email, text)) ok = true;\n if (searchIn.includes(\"fullname\") && u.name && textMatches(u.name, text)) ok = true;\n if (!ok) return false;\n }\n\n const rpred = parsed.ranges.get(\"repos\") ?? [];\n const req = parsed.qualifiers.get(\"repos\") ?? [];\n if (!matchesNumericPredicate(u.public_repos, rpred, req)) return false;\n for (const nv of parsed.negations.get(\"repos\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(u.public_repos, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && u.public_repos === parseInt(nv, 10)) return false;\n }\n\n const fpred = parsed.ranges.get(\"followers\") ?? [];\n const feq = parsed.qualifiers.get(\"followers\") ?? [];\n if (!matchesNumericPredicate(u.followers, fpred, feq)) return false;\n for (const nv of parsed.negations.get(\"followers\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(u.followers, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && u.followers === parseInt(nv, 10)) return false;\n }\n\n return true;\n}\n\nfunction orgMatchesSearch(gh: GitHubStore, o: GitHubOrg, parsed: ParsedSearchQuery): boolean {\n void gh;\n const types = parsed.qualifiers.get(\"type\") ?? [];\n if (types.length && !types.map((t) => t.toLowerCase()).includes(\"org\")) return false;\n for (const t of parsed.negations.get(\"type\") ?? []) {\n if (t.toLowerCase() === \"org\") return false;\n }\n\n const inScopes = parsed.qualifiers.get(\"in\") ?? [];\n const searchIn = inScopes.length > 0 ? inScopes.map((s) => s.toLowerCase()) : [\"login\", \"email\", \"fullname\"];\n\n const text = parsed.text.trim();\n if (text.length) {\n let ok = false;\n if (searchIn.includes(\"login\") && textMatches(o.login, text)) ok = true;\n if (searchIn.includes(\"email\") && o.email && textMatches(o.email, text)) ok = true;\n if (searchIn.includes(\"fullname\") && o.name && textMatches(o.name, text)) ok = true;\n if (!ok) return false;\n }\n\n const rpred = parsed.ranges.get(\"repos\") ?? [];\n const req = parsed.qualifiers.get(\"repos\") ?? [];\n if (!matchesNumericPredicate(o.public_repos, rpred, req)) return false;\n for (const nv of parsed.negations.get(\"repos\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(o.public_repos, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && o.public_repos === parseInt(nv, 10)) return false;\n }\n\n const fpred = parsed.ranges.get(\"followers\") ?? [];\n const feq = parsed.qualifiers.get(\"followers\") ?? [];\n if (!matchesNumericPredicate(o.followers, fpred, feq)) return false;\n for (const nv of parsed.negations.get(\"followers\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(o.followers, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && o.followers === parseInt(nv, 10)) return false;\n }\n\n return true;\n}\n\nfunction blobText(blob: GitHubBlob): string {\n if (blob.encoding === \"base64\") {\n try {\n return Buffer.from(blob.content, \"base64\").toString(\"utf8\");\n } catch {\n return \"\";\n }\n }\n return blob.content;\n}\n\nfunction buildBlobPathIndex(gh: GitHubStore): Map<string, string> {\n const byRepo = new Map<number, Map<string, string>>();\n for (const tree of gh.trees.all()) {\n let map = byRepo.get(tree.repo_id);\n if (!map) {\n map = new Map();\n byRepo.set(tree.repo_id, map);\n }\n for (const e of tree.tree) {\n if (e.type === \"blob\") {\n if (!map.has(e.sha)) map.set(e.sha, e.path);\n }\n }\n }\n const key = (repoId: number, sha: string) => `${repoId}:${sha}`;\n const flat = new Map<string, string>();\n for (const [repoId, m] of byRepo) {\n for (const [sha, path] of m) {\n flat.set(key(repoId, sha), path);\n }\n }\n return flat;\n}\n\nfunction formatSearchCommit(gh: GitHubStore, commit: GitHubCommit, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n sha: commit.sha,\n node_id: commit.node_id,\n url: `${repoUrl}/commits/${commit.sha}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${commit.sha}`,\n comments_url: `${repoUrl}/comments/${commit.sha}`,\n repository: formatRepo(repo, gh, baseUrl),\n commit: {\n url: `${repoUrl}/git/commits/${commit.sha}`,\n author: {\n name: commit.author_name,\n email: commit.author_email,\n date: commit.author_date,\n },\n committer: {\n name: commit.committer_name,\n email: commit.committer_email,\n date: commit.committer_date,\n },\n message: commit.message,\n },\n author: null as null,\n committer: null as null,\n parents: commit.parent_shas.map((sha) => ({\n sha,\n url: `${repoUrl}/commits/${sha}`,\n })),\n };\n}\n\nfunction loginMatchesCommitAuthor(gh: GitHubStore, login: string, commit: GitHubCommit, role: \"author\" | \"committer\"): boolean {\n const u = gh.users.findOneBy(\"login\", login);\n const email = (role === \"author\" ? commit.author_email : commit.committer_email).toLowerCase();\n if (u) {\n if (u.email && u.email.toLowerCase() === email) return true;\n if (commit.user_id != null && commit.user_id === u.id) return true;\n }\n const expect = `${login.toLowerCase()}@users.noreply.github.com`;\n return email === expect || email.startsWith(`${login.toLowerCase()}+`);\n}\n\nexport function searchRoutes({ app, store, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/search/repositories\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n const authUser = c.get(\"authUser\");\n\n let list = gh.repos.all().filter((r) => repoVisibleForSearch(r, gh, authUser));\n list = filterRepos(gh, list, parsed, authUser);\n\n if (sortRaw === \"stars\") {\n list.sort((a, b) =>\n order === \"desc\"\n ? b.stargazers_count - a.stargazers_count\n : a.stargazers_count - b.stargazers_count\n );\n } else if (sortRaw === \"forks\") {\n list.sort((a, b) =>\n order === \"desc\" ? b.forks_count - a.forks_count : a.forks_count - b.forks_count\n );\n } else if (sortRaw === \"updated\") {\n list.sort((a, b) =>\n order === \"desc\" ? b.updated_at.localeCompare(a.updated_at) : a.updated_at.localeCompare(b.updated_at)\n );\n } else {\n list.sort((a, b) => repoRelevance(b, parsed) - repoRelevance(a, parsed));\n }\n\n const total = list.length;\n const slice = list.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n incomplete_results: false,\n items: slice.map((r) => formatRepo(r, gh, baseUrl)),\n });\n });\n\n app.get(\"/search/issues\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n\n const authUser = c.get(\"authUser\");\n type Hit = { kind: \"issue\"; issue: GitHubIssue } | { kind: \"pr\"; pr: GitHubPullRequest };\n const hits: Hit[] = [];\n\n for (const issue of gh.issues.all()) {\n const repo = gh.repos.get(issue.repo_id);\n if (!repo) continue;\n if (!repoVisibleForSearch(repo, gh, authUser)) continue;\n if (issue.is_pull_request) {\n const pr = gh.pullRequests\n .findBy(\"repo_id\", issue.repo_id)\n .find((p) => p.number === issue.number);\n if (!pr) continue;\n if (!issuePrMatchesFilters(gh, parsed, repo, issue, pr)) continue;\n hits.push({ kind: \"pr\", pr });\n } else {\n if (!issuePrMatchesFilters(gh, parsed, repo, issue, null)) continue;\n hits.push({ kind: \"issue\", issue });\n }\n }\n\n function relevance(h: Hit): number {\n const title =\n h.kind === \"issue\" ? h.issue.title : h.pr.title;\n const body = h.kind === \"issue\" ? h.issue.body ?? \"\" : h.pr.body ?? \"\";\n const t = parsed.text.trim().toLowerCase();\n if (!t) return 1;\n let s = 0;\n if (title.toLowerCase().includes(t)) s += 3;\n if (body.toLowerCase().includes(t)) s += 1;\n return s;\n }\n\n let sorted = [...hits];\n if (sortRaw === \"created\") {\n sorted.sort((a, b) => {\n const ca = a.kind === \"issue\" ? a.issue.created_at : a.pr.created_at;\n const cb = b.kind === \"issue\" ? b.issue.created_at : b.pr.created_at;\n const cmp = ca.localeCompare(cb);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else if (sortRaw === \"updated\") {\n sorted.sort((a, b) => {\n const ca = a.kind === \"issue\" ? a.issue.updated_at : a.pr.updated_at;\n const cb = b.kind === \"issue\" ? b.issue.updated_at : b.pr.updated_at;\n const cmp = ca.localeCompare(cb);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else if (sortRaw === \"comments\") {\n sorted.sort((a, b) => {\n const ca = a.kind === \"issue\" ? a.issue.comments : a.pr.comments;\n const cb = b.kind === \"issue\" ? b.issue.comments : b.pr.comments;\n return order === \"desc\" ? cb - ca : ca - cb;\n });\n } else {\n sorted.sort((a, b) => relevance(b) - relevance(a));\n }\n\n const total = sorted.length;\n const slice = sorted.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((h) => {\n if (h.kind === \"issue\") {\n return formatIssue(h.issue, gh, baseUrl);\n }\n return formatPullRequest(h.pr, gh, baseUrl);\n });\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items: items.filter(Boolean),\n });\n });\n\n app.get(\"/search/users\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n\n type UHit = { kind: \"user\"; u: GitHubUser } | { kind: \"org\"; o: GitHubOrg };\n const hits: UHit[] = [];\n\n const typeFilters = parsed.qualifiers.get(\"type\")?.map((t) => t.toLowerCase()) ?? [];\n\n if (!typeFilters.length || typeFilters.includes(\"user\")) {\n for (const u of gh.users.all()) {\n if (u.type === \"Organization\") continue;\n if (userMatchesSearch(gh, u, parsed)) hits.push({ kind: \"user\", u });\n }\n }\n if (!typeFilters.length || typeFilters.includes(\"org\")) {\n for (const o of gh.orgs.all()) {\n if (orgMatchesSearch(gh, o, parsed)) hits.push({ kind: \"org\", o });\n }\n }\n\n function rel(h: UHit): number {\n const text = parsed.text.trim().toLowerCase();\n if (!text) return 1;\n if (h.kind === \"user\") {\n let s = 0;\n if (h.u.login.toLowerCase().includes(text)) s += 3;\n if (h.u.name?.toLowerCase().includes(text)) s += 1;\n return s;\n }\n let s = 0;\n if (h.o.login.toLowerCase().includes(text)) s += 3;\n if (h.o.name?.toLowerCase().includes(text)) s += 1;\n return s;\n }\n\n let list = [...hits];\n if (sortRaw === \"followers\") {\n list.sort((a, b) => {\n const fa = a.kind === \"user\" ? a.u.followers : a.o.followers;\n const fb = b.kind === \"user\" ? b.u.followers : b.o.followers;\n return order === \"desc\" ? fb - fa : fa - fb;\n });\n } else if (sortRaw === \"repositories\") {\n list.sort((a, b) => {\n const ra = a.kind === \"user\" ? a.u.public_repos : a.o.public_repos;\n const rb = b.kind === \"user\" ? b.u.public_repos : b.o.public_repos;\n return order === \"desc\" ? rb - ra : ra - rb;\n });\n } else if (sortRaw === \"joined\") {\n list.sort((a, b) => {\n const ca = a.kind === \"user\" ? a.u.created_at : a.o.created_at;\n const cb = b.kind === \"user\" ? b.u.created_at : b.o.created_at;\n const cmp = ca.localeCompare(cb);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else {\n list.sort((a, b) => rel(b) - rel(a));\n }\n\n const total = list.length;\n const slice = list.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((h) =>\n h.kind === \"user\" ? formatUser(h.u, baseUrl) : formatOrgBrief(h.o, baseUrl)\n );\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/code\", (c) => {\n const q = c.req.query(\"q\") ?? \"\";\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const authUser = c.get(\"authUser\");\n const blobs = gh.blobs.all();\n if (blobs.length === 0) {\n setLinkHeader(c, 0, 1, per_page);\n return c.json({\n total_count: 0,\n incomplete_results: false,\n items: [],\n });\n }\n\n const pathIdx = buildBlobPathIndex(gh);\n const text = parsed.text.trim();\n const repoSpecs = parsed.qualifiers.get(\"repo\") ?? [];\n const langs = parsed.qualifiers.get(\"language\") ?? [];\n const paths = parsed.qualifiers.get(\"path\") ?? [];\n const filenames = parsed.qualifiers.get(\"filename\") ?? [];\n const inScopes = (parsed.qualifiers.get(\"in\") ?? []).map((x) => x.toLowerCase());\n\n const matches: Array<{\n name: string;\n path: string;\n sha: string;\n score: number;\n repo: GitHubRepo;\n }> = [];\n\n for (const blob of blobs) {\n const repo = gh.repos.get(blob.repo_id);\n if (!repo) continue;\n if (!repoVisibleForSearch(repo, gh, authUser)) continue;\n if (repoSpecs.length) {\n const ok = repoSpecs.some((rs) => {\n const r = resolveRepoQualifier(gh, rs);\n return r && r.id === repo.id;\n });\n if (!ok) continue;\n }\n if (langs.length) {\n const lang = repo.language;\n if (!lang || !langs.some((l) => l.toLowerCase() === lang.toLowerCase())) continue;\n }\n\n const path = pathIdx.get(`${blob.repo_id}:${blob.sha}`) ?? `unknown/${blob.sha.slice(0, 7)}`;\n const base = path.split(\"/\").pop() ?? path;\n if (paths.length && !paths.some((p) => path.toLowerCase().includes(p.toLowerCase()))) continue;\n if (filenames.length && !filenames.some((p) => base.toLowerCase().includes(p.toLowerCase()))) continue;\n\n const content = blobText(blob);\n if (text.length) {\n const inFile = content.toLowerCase().includes(text.toLowerCase());\n const inPath = path.toLowerCase().includes(text.toLowerCase());\n let hit = false;\n if (!inScopes.length) hit = inFile || inPath;\n else {\n if (inScopes.includes(\"file\") && inFile) hit = true;\n if (inScopes.includes(\"path\") && inPath) hit = true;\n }\n if (!hit) continue;\n }\n\n matches.push({\n name: path.split(\"/\").pop() ?? blob.sha,\n path,\n sha: blob.sha,\n score: text.length ? (content.toLowerCase().includes(text.toLowerCase()) ? 2 : 1) : 1,\n repo,\n });\n }\n\n matches.sort((a, b) => b.score - a.score);\n const total = matches.length;\n const slice = matches.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((m) => {\n const repoUrl = `${baseUrl}/repos/${m.repo.full_name}`;\n return {\n name: m.name,\n path: m.path,\n sha: m.sha,\n url: `${repoUrl}/contents/${m.path}?ref=HEAD`,\n git_url: `${repoUrl}/git/blobs/${m.sha}`,\n html_url: `${baseUrl}/${m.repo.full_name}/blob/HEAD/${m.path}`,\n repository: formatRepo(m.repo, gh, baseUrl),\n score: 1,\n };\n });\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/commits\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n\n const authUser = c.get(\"authUser\");\n const repoSpecs = parsed.qualifiers.get(\"repo\") ?? [];\n const authors = parsed.qualifiers.get(\"author\") ?? [];\n const committers = parsed.qualifiers.get(\"committer\") ?? [];\n const mergeVals = parsed.qualifiers.get(\"merge\") ?? [];\n\n let list: GitHubCommit[] = [];\n for (const commit of gh.commits.all()) {\n const repo = gh.repos.get(commit.repo_id);\n if (!repo) continue;\n if (!repoVisibleForSearch(repo, gh, authUser)) continue;\n if (repoSpecs.length) {\n const ok = repoSpecs.some((rs) => {\n const r = resolveRepoQualifier(gh, rs);\n return r && r.id === repo.id;\n });\n if (!ok) continue;\n }\n if (authors.length) {\n const ok = authors.some((a) => loginMatchesCommitAuthor(gh, a, commit, \"author\"));\n if (!ok) continue;\n }\n if (committers.length) {\n const ok = committers.some((a) => loginMatchesCommitAuthor(gh, a, commit, \"committer\"));\n if (!ok) continue;\n }\n if (mergeVals.length) {\n const isMerge = commit.parent_shas.length > 1;\n const ok = mergeVals.every((m) => {\n if (m === \"true\") return isMerge;\n if (m === \"false\") return !isMerge;\n return true;\n });\n if (!ok) continue;\n }\n const t = parsed.text.trim();\n if (t.length && !textMatches(commit.message, t)) continue;\n list.push(commit);\n }\n\n function rel(cm: GitHubCommit): number {\n const t = parsed.text.trim().toLowerCase();\n if (!t) return 1;\n return cm.message.toLowerCase().includes(t) ? 2 : 1;\n }\n\n if (sortRaw === \"author-date\") {\n list = [...list].sort((a, b) => {\n const cmp = a.author_date.localeCompare(b.author_date);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else if (sortRaw === \"committer-date\") {\n list = [...list].sort((a, b) => {\n const cmp = a.committer_date.localeCompare(b.committer_date);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else {\n list = [...list].sort((a, b) => rel(b) - rel(a));\n }\n\n const total = list.length;\n const slice = list.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((commit) => {\n const repo = gh.repos.get(commit.repo_id)!;\n return formatSearchCommit(gh, commit, repo, baseUrl);\n });\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/topics\", (c) => {\n const q = c.req.query(\"q\") ?? \"\";\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const text = parsed.text.trim().toLowerCase();\n\n const topicSet = new Map<string, { name: string; updated: string }>();\n for (const repo of gh.repos.all()) {\n for (const t of repo.topics) {\n const key = t.toLowerCase();\n if (!topicSet.has(key)) {\n topicSet.set(key, { name: t, updated: repo.updated_at });\n } else {\n const cur = topicSet.get(key)!;\n if (repo.updated_at > cur.updated) topicSet.set(key, { name: t, updated: repo.updated_at });\n }\n }\n }\n\n let topics = Array.from(topicSet.values());\n if (text.length) {\n topics = topics.filter((t) => t.name.toLowerCase().includes(text));\n }\n\n topics.sort((a, b) => a.name.localeCompare(b.name));\n const total = topics.length;\n const slice = topics.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((t) => ({\n name: t.name,\n display_name: t.name,\n short_description: \"\",\n created_by: null as string | null,\n created_at: t.updated,\n updated_at: t.updated,\n }));\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/labels\", (c) => {\n const q = c.req.query(\"q\") ?? \"\";\n const rawId = c.req.query(\"repository_id\");\n if (rawId === undefined || rawId === \"\") {\n throw new ApiError(422, \"Validation Failed: repository_id is required\");\n }\n const repositoryId = parseInt(rawId, 10);\n if (Number.isNaN(repositoryId)) {\n throw new ApiError(422, \"Validation Failed: invalid repository_id\");\n }\n const repo = gh.repos.get(repositoryId);\n if (!repo) {\n throw new ApiError(404, \"Not Found\");\n }\n\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const text = parsed.text.trim().toLowerCase();\n\n let labels = gh.labels.findBy(\"repo_id\", repositoryId);\n if (text.length) {\n labels = labels.filter(\n (l) =>\n l.name.toLowerCase().includes(text) ||\n (l.description && l.description.toLowerCase().includes(text))\n );\n }\n\n labels.sort((a, b) => a.name.localeCompare(b.name));\n const total = labels.length;\n const slice = labels.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items: slice.map((l) => ({\n id: l.id,\n node_id: l.node_id,\n url: `${baseUrl}/repos/${repo.full_name}/labels/${encodeURIComponent(l.name)}`,\n name: l.name,\n color: l.color,\n default: l.default,\n description: l.description,\n })),\n });\n });\n}\n","import type { RouteContext, AuthUser } from \"@emulators/core\";\nimport {\n ApiError,\n forbidden,\n parseJsonBody,\n parsePagination,\n setLinkHeader,\n unauthorized,\n} from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubArtifact,\n GitHubJob,\n GitHubOrg,\n GitHubRepo,\n GitHubSecret,\n GitHubUser,\n GitHubWorkflow,\n GitHubWorkflowRun,\n} from \"../entities.js\";\nimport {\n formatRepo,\n formatUser,\n generateNodeId,\n generateSha,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoAdmin,\n assertRepoRead,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction listOrgMembersDeduped(\n gh: GitHubStore,\n orgId: number\n): { user: GitHubUser; orgRole: \"admin\" | \"member\" }[] {\n const byUser = new Map<number, { user: GitHubUser; isAdmin: boolean }>();\n for (const team of gh.teams.findBy(\"org_id\", orgId)) {\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n const user = gh.users.get(m.user_id);\n if (!user) continue;\n const isAdmin = m.role === \"maintainer\";\n const prev = byUser.get(user.id);\n if (!prev) {\n byUser.set(user.id, { user, isAdmin });\n } else {\n byUser.set(user.id, { user, isAdmin: prev.isAdmin || isAdmin });\n }\n }\n }\n return [...byUser.values()]\n .map(({ user, isAdmin }) => ({\n user,\n orgRole: isAdmin ? (\"admin\" as const) : (\"member\" as const),\n }))\n .sort((a, b) => a.user.id - b.user.id);\n}\n\nfunction orgRoleForUser(gh: GitHubStore, orgId: number, userId: number): \"admin\" | \"member\" | null {\n const row = listOrgMembersDeduped(gh, orgId).find((r) => r.user.id === userId);\n return row?.orgRole ?? null;\n}\n\nfunction assertOrgAdmin(gh: GitHubStore, authUser: AuthUser | undefined, org: GitHubOrg) {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n if (orgRoleForUser(gh, org.id, user.id) === \"admin\") return;\n throw forbidden();\n}\n\nfunction getOrgByLogin(gh: GitHubStore, login: string): GitHubOrg | undefined {\n return gh.orgs.findOneBy(\"login\", login);\n}\n\nfunction resolveWorkflow(gh: GitHubStore, repoId: number, param: string): GitHubWorkflow | undefined {\n const trimmed = param.trim();\n const asNum = parseInt(trimmed, 10);\n if (!Number.isNaN(asNum) && String(asNum) === trimmed) {\n const w = gh.workflows.get(asNum);\n if (w && w.repo_id === repoId) return w;\n }\n const decoded = decodeURIComponent(trimmed);\n return gh.workflows\n .findBy(\"repo_id\", repoId)\n .find((w) => w.path === decoded || w.path.endsWith(`/${decoded}`) || w.name === decoded);\n}\n\nfunction resolveRefToBranchAndSha(\n gh: GitHubStore,\n repo: GitHubRepo,\n ref: string\n): { branch: string; sha: string } {\n const name = ref.replace(/^refs\\/heads\\//, \"\").replace(/^refs\\/tags\\//, \"\");\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === name);\n if (branch) return { branch: branch.name, sha: branch.sha };\n return { branch: name, sha: generateSha() };\n}\n\nfunction nextRunNumber(gh: GitHubStore, workflowId: number, repoId: number): number {\n const runs = gh.workflowRuns\n .findBy(\"workflow_id\", workflowId)\n .filter((r) => r.repo_id === repoId);\n return runs.reduce((m, r) => Math.max(m, r.run_number), 0) + 1;\n}\n\nfunction findRepoSecret(gh: GitHubStore, repoId: number, name: string): GitHubSecret | undefined {\n return gh.secrets\n .all()\n .find((s) => s.repo_id === repoId && s.org_id === null && s.name === name);\n}\n\nfunction findOrgSecret(gh: GitHubStore, orgId: number, name: string): GitHubSecret | undefined {\n return gh.secrets\n .all()\n .find((s) => s.org_id === orgId && s.repo_id === null && s.name === name);\n}\n\nfunction listRepoSecrets(gh: GitHubStore, repoId: number): GitHubSecret[] {\n return gh.secrets.all().filter((s) => s.repo_id === repoId && s.org_id === null);\n}\n\nfunction listOrgSecrets(gh: GitHubStore, orgId: number): GitHubSecret[] {\n return gh.secrets.all().filter((s) => s.org_id === orgId && s.repo_id === null);\n}\n\nfunction deleteJobsForRun(gh: GitHubStore, runId: number) {\n for (const j of gh.jobs.findBy(\"run_id\", runId)) {\n gh.jobs.delete(j.id);\n }\n}\n\nfunction deleteArtifactsForRun(gh: GitHubStore, runId: number) {\n for (const a of gh.artifacts.findBy(\"run_id\", runId)) {\n gh.artifacts.delete(a.id);\n }\n}\n\nfunction seedStubJobs(gh: GitHubStore, repo: GitHubRepo, run: GitHubWorkflowRun) {\n const job = gh.jobs.insert({\n node_id: \"\",\n repo_id: repo.id,\n run_id: run.id,\n name: \"build\",\n status: run.status === \"completed\" ? \"completed\" : \"in_progress\",\n conclusion: run.status === \"completed\" ? run.conclusion : null,\n started_at: run.run_started_at,\n completed_at: run.status === \"completed\" ? run.updated_at : null,\n runner_id: 1,\n runner_name: \"Hosted Agent\",\n steps: [\n {\n name: \"Set up job\",\n status: run.status === \"completed\" ? \"completed\" : \"in_progress\",\n conclusion: run.status === \"completed\" ? run.conclusion : null,\n number: 1,\n started_at: run.run_started_at,\n completed_at: run.status === \"completed\" ? run.updated_at : null,\n },\n ],\n } as Omit<GitHubJob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.jobs.update(job.id, { node_id: generateNodeId(\"Job\", job.id) });\n}\n\nfunction formatWorkflow(w: GitHubWorkflow, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n id: w.id,\n node_id: w.node_id,\n name: w.name,\n path: w.path,\n state: w.state,\n created_at: w.created_at,\n updated_at: w.updated_at,\n url: `${repoUrl}/actions/workflows/${w.id}`,\n html_url: `${baseUrl}/${repo.full_name}/blob/${repo.default_branch}/${w.path}`,\n badge_url:\n w.badge_url ||\n `${baseUrl}/${repo.full_name}/workflows/${encodeURIComponent(w.path.replace(/^\\/.github\\/workflows\\//, \"\"))}/badge.svg`,\n };\n}\n\nfunction formatWorkflowRun(run: GitHubWorkflowRun, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const wf = gh.workflows.get(run.workflow_id);\n const actor = gh.users.get(run.actor_id);\n const wfPath = wf?.path ?? \".github/workflows/main.yml\";\n return {\n id: run.id,\n name: run.name,\n node_id: run.node_id,\n head_branch: run.head_branch,\n head_sha: run.head_sha,\n path: wfPath,\n display_title: run.name,\n run_number: run.run_number,\n event: run.event,\n status: run.status,\n conclusion: run.conclusion,\n workflow_id: run.workflow_id,\n check_suite_id: null,\n url: `${repoUrl}/actions/runs/${run.id}`,\n html_url: `${baseUrl}/${repo.full_name}/actions/runs/${run.id}`,\n pull_requests: [],\n created_at: run.created_at,\n updated_at: run.updated_at,\n actor: actor ? formatUser(actor, baseUrl) : null,\n run_attempt: run.run_attempt,\n run_started_at: run.run_started_at,\n triggering_actor: actor ? formatUser(actor, baseUrl) : null,\n workflow_url: wf ? `${repoUrl}/actions/workflows/${wf.id}` : null,\n repository: formatRepo(repo, gh, baseUrl),\n head_commit: {\n id: run.head_sha,\n tree_id: generateSha(),\n message: \"Workflow run\",\n timestamp: run.created_at,\n author: actor\n ? { name: actor.login, email: `${actor.login}@users.noreply.github.com` }\n : { name: \"unknown\", email: \"unknown@users.noreply.github.com\" },\n },\n };\n}\n\nfunction formatJob(job: GitHubJob, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const run = gh.workflowRuns.get(job.run_id);\n const headSha = run?.head_sha ?? \"\";\n return {\n id: job.id,\n run_id: job.run_id,\n workflow_name: run?.name ?? \"workflow\",\n head_branch: run?.head_branch ?? \"\",\n run_url: `${repoUrl}/actions/runs/${job.run_id}`,\n node_id: job.node_id,\n head_sha: headSha,\n status: job.status,\n conclusion: job.conclusion,\n started_at: job.started_at,\n completed_at: job.completed_at,\n name: job.name,\n steps: job.steps,\n url: `${repoUrl}/actions/jobs/${job.id}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${headSha}/checks`,\n check_run_url: `${baseUrl}/repos/${repo.full_name}/check-runs/${job.id}`,\n labels: [\"hosted\"],\n runner_id: job.runner_id,\n runner_name: job.runner_name,\n runner_group_id: 1,\n runner_group_name: \"GitHub Actions\",\n created_at: job.created_at,\n updated_at: job.updated_at,\n };\n}\n\nfunction formatArtifact(\n a: GitHubArtifact,\n repo: GitHubRepo,\n gh: GitHubStore,\n baseUrl: string\n) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const run = gh.workflowRuns.get(a.run_id);\n return {\n id: a.id,\n node_id: a.node_id,\n name: a.name,\n size_in_bytes: a.size_in_bytes,\n url: `${repoUrl}/actions/artifacts/${a.id}`,\n archive_download_url: `${repoUrl}/actions/artifacts/${a.id}/zip`,\n expired: a.expired,\n digest: null,\n created_at: a.created_at,\n expires_at: a.expires_at,\n workflow_run: run ? { id: run.id, repository_id: repo.id, head_repository_id: repo.id, head_branch: run.head_branch, head_sha: run.head_sha } : null,\n };\n}\n\nfunction filterRuns(\n gh: GitHubStore,\n runs: GitHubWorkflowRun[],\n q: { actor?: string; branch?: string; event?: string; status?: string }\n) {\n let out = runs;\n if (q.actor) {\n const u = gh.users.findOneBy(\"login\", q.actor);\n out = u ? out.filter((r) => r.actor_id === u.id) : [];\n }\n if (q.branch) {\n out = out.filter((r) => r.head_branch === q.branch);\n }\n if (q.event) {\n out = out.filter((r) => r.event === q.event);\n }\n if (q.status) {\n out = out.filter((r) => r.status === q.status);\n }\n return out.sort((a, b) => b.created_at.localeCompare(a.created_at));\n}\n\nexport function actionsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/actions/workflows\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const workflows = gh.workflows\n .findBy(\"repo_id\", repo.id)\n .sort((a, b) => a.path.localeCompare(b.path));\n return c.json({\n total_count: workflows.length,\n workflows: workflows.map((w) => formatWorkflow(w, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/workflows/:workflow_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n return c.json(formatWorkflow(w, repo, gh, baseUrl));\n });\n\n app.put(\"/repos/:owner/:repo/actions/workflows/:workflow_id/disable\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n gh.workflows.update(w.id, { state: \"disabled_manually\" });\n return c.body(null, 204);\n });\n\n app.put(\"/repos/:owner/:repo/actions/workflows/:workflow_id/enable\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n gh.workflows.update(w.id, { state: \"active\" });\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/actions/workflows/:workflow_id/dispatches\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertAuthenticatedUser(gh, c.get(\"authUser\"));\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n if (w.state !== \"active\") {\n throw new ApiError(422, \"Workflow is not active\");\n }\n const body = await parseJsonBody(c);\n const ref = typeof body.ref === \"string\" ? body.ref : repo.default_branch;\n const { branch, sha } = resolveRefToBranchAndSha(gh, repo, ref);\n const now = timestamp();\n const runNumber = nextRunNumber(gh, w.id, repo.id);\n const run = gh.workflowRuns.insert({\n node_id: \"\",\n repo_id: repo.id,\n workflow_id: w.id,\n name: w.name,\n head_branch: branch,\n head_sha: sha,\n run_number: runNumber,\n event: \"workflow_dispatch\",\n status: \"queued\",\n conclusion: null,\n actor_id: actor.id,\n run_attempt: 1,\n run_started_at: now,\n } as Omit<GitHubWorkflowRun, \"id\" | \"created_at\" | \"updated_at\">);\n gh.workflowRuns.update(run.id, { node_id: generateNodeId(\"WorkflowRun\", run.id) });\n const created = gh.workflowRuns.get(run.id)!;\n seedStubJobs(gh, repo, created);\n const ownerLogin = ownerLoginOf(gh, repo);\n void webhooks.dispatch(\n \"workflow_dispatch\",\n undefined,\n {\n ref: `refs/heads/${branch}`,\n inputs: typeof body.inputs === \"object\" && body.inputs ? body.inputs : {},\n workflow: formatWorkflow(w, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n void webhooks.dispatch(\n \"workflow_run\",\n \"requested\",\n { workflow_run: formatWorkflowRun(created, repo, gh, baseUrl), repository: formatRepo(repo, gh, baseUrl), sender: formatUser(actor, baseUrl) },\n ownerLogin,\n repo.name\n );\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const { page, per_page } = parsePagination(c);\n const actor = c.req.query(\"actor\") ?? undefined;\n const branch = c.req.query(\"branch\") ?? undefined;\n const event = c.req.query(\"event\") ?? undefined;\n const status = c.req.query(\"status\") ?? undefined;\n const all = gh.workflowRuns.findBy(\"repo_id\", repo.id);\n const filtered = filterRuns(gh, all, { actor, branch, event, status });\n const total = filtered.length;\n const slice = filtered.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n workflow_runs: slice.map((r) => formatWorkflowRun(r, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatWorkflowRun(run, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/actions/workflows/:workflow_id/runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n const { page, per_page } = parsePagination(c);\n const actor = c.req.query(\"actor\") ?? undefined;\n const branch = c.req.query(\"branch\") ?? undefined;\n const event = c.req.query(\"event\") ?? undefined;\n const status = c.req.query(\"status\") ?? undefined;\n const all = gh.workflowRuns\n .findBy(\"repo_id\", repo.id)\n .filter((r) => r.workflow_id === w.id);\n const filtered = filterRuns(gh, all, { actor, branch, event, status });\n const total = filtered.length;\n const slice = filtered.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n workflow_runs: slice.map((r) => formatWorkflowRun(r, repo, gh, baseUrl)),\n });\n });\n\n app.post(\"/repos/:owner/:repo/actions/runs/:run_id/cancel\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n gh.workflowRuns.update(run.id, { status: \"completed\", conclusion: \"cancelled\" });\n const updated = gh.workflowRuns.get(run.id)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n const actor = gh.users.get(run.actor_id);\n void webhooks.dispatch(\n \"workflow_run\",\n \"completed\",\n {\n workflow_run: formatWorkflowRun(updated, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: actor ? formatUser(actor, baseUrl) : null,\n },\n ownerLogin,\n repo.name\n );\n return c.body(null, 202);\n });\n\n app.post(\"/repos/:owner/:repo/actions/runs/:run_id/rerun\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const parent = gh.workflowRuns.get(runId);\n if (!parent || parent.repo_id !== repo.id) throw notFoundResponse();\n const wf = gh.workflows.get(parent.workflow_id);\n if (!wf) throw notFoundResponse();\n const now = timestamp();\n const runNumber = nextRunNumber(gh, wf.id, repo.id);\n const run = gh.workflowRuns.insert({\n node_id: \"\",\n repo_id: repo.id,\n workflow_id: wf.id,\n name: parent.name,\n head_branch: parent.head_branch,\n head_sha: parent.head_sha,\n run_number: runNumber,\n event: parent.event,\n status: \"queued\",\n conclusion: null,\n actor_id: parent.actor_id,\n run_attempt: parent.run_attempt + 1,\n run_started_at: now,\n } as Omit<GitHubWorkflowRun, \"id\" | \"created_at\" | \"updated_at\">);\n gh.workflowRuns.update(run.id, { node_id: generateNodeId(\"WorkflowRun\", run.id) });\n const created = gh.workflowRuns.get(run.id)!;\n seedStubJobs(gh, repo, created);\n const ownerLogin = ownerLoginOf(gh, repo);\n const actor = gh.users.get(created.actor_id);\n void webhooks.dispatch(\n \"workflow_run\",\n \"requested\",\n {\n workflow_run: formatWorkflowRun(created, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: actor ? formatUser(actor, baseUrl) : null,\n },\n ownerLogin,\n repo.name\n );\n return c.json(formatWorkflowRun(created, repo, gh, baseUrl), 201);\n });\n\n app.delete(\"/repos/:owner/:repo/actions/runs/:run_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n deleteArtifactsForRun(gh, run.id);\n deleteJobsForRun(gh, run.id);\n gh.workflowRuns.delete(run.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id/logs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n return c.text(\n `2025-01-01T00:00:00.0000000Z Workflow run ${run.id} logs (stub)\\n${run.head_sha}\\n`,\n 200,\n { \"Content-Type\": \"text/plain; charset=utf-8\" }\n );\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id/jobs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n const jobs = gh.jobs.findBy(\"run_id\", runId).filter((j) => j.repo_id === repo.id);\n return c.json({\n total_count: jobs.length,\n jobs: jobs.map((j) => formatJob(j, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/jobs/:job_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const jobId = parseInt(c.req.param(\"job_id\")!, 10);\n const job = gh.jobs.get(jobId);\n if (!job || job.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatJob(job, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/actions/jobs/:job_id/logs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const jobId = parseInt(c.req.param(\"job_id\")!, 10);\n const job = gh.jobs.get(jobId);\n if (!job || job.repo_id !== repo.id) throw notFoundResponse();\n return c.text(`2025-01-01T00:00:00.0000000Z Job ${job.id} logs (stub)\\n`, 200, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/artifacts\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const { page, per_page } = parsePagination(c);\n const all = gh.artifacts\n .findBy(\"repo_id\", repo.id)\n .sort((a, b) => b.created_at.localeCompare(a.created_at));\n const total = all.length;\n const slice = all.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n artifacts: slice.map((a) => formatArtifact(a, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id/artifacts\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n const arts = gh.artifacts.findBy(\"run_id\", runId).filter((a) => a.repo_id === repo.id);\n return c.json({\n total_count: arts.length,\n artifacts: arts.map((a) => formatArtifact(a, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/artifacts/:artifact_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const artifactId = parseInt(c.req.param(\"artifact_id\")!, 10);\n const a = gh.artifacts.get(artifactId);\n if (!a || a.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatArtifact(a, repo, gh, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/actions/artifacts/:artifact_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const artifactId = parseInt(c.req.param(\"artifact_id\")!, 10);\n const a = gh.artifacts.get(artifactId);\n if (!a || a.repo_id !== repo.id) throw notFoundResponse();\n gh.artifacts.delete(a.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/actions/secrets\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const secrets = listRepoSecrets(gh, repo.id).sort((a, b) => a.name.localeCompare(b.name));\n return c.json({\n total_count: secrets.length,\n secrets: secrets.map((s) => ({\n name: s.name,\n created_at: s.created_at,\n updated_at: s.updated_at,\n })),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/secrets/:secret_name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const name = c.req.param(\"secret_name\")!;\n const s = findRepoSecret(gh, repo.id, name);\n if (!s) throw notFoundResponse();\n return c.json({\n name: s.name,\n visibility: s.visibility,\n created_at: s.created_at,\n updated_at: s.updated_at,\n });\n });\n\n app.put(\"/repos/:owner/:repo/actions/secrets/:secret_name\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n await parseJsonBody(c);\n const name = c.req.param(\"secret_name\")!;\n const existing = findRepoSecret(gh, repo.id, name);\n if (existing) {\n gh.secrets.update(existing.id, { visibility: existing.visibility });\n return c.body(null, 204);\n }\n gh.secrets.insert({\n repo_id: repo.id,\n org_id: null,\n name,\n visibility: \"all\",\n } as Omit<GitHubSecret, \"id\" | \"created_at\" | \"updated_at\">);\n return c.body(null, 201);\n });\n\n app.delete(\"/repos/:owner/:repo/actions/secrets/:secret_name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const name = c.req.param(\"secret_name\")!;\n const s = findRepoSecret(gh, repo.id, name);\n if (!s) throw notFoundResponse();\n gh.secrets.delete(s.id);\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/actions/secrets\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n const secrets = listOrgSecrets(gh, org.id).sort((a, b) => a.name.localeCompare(b.name));\n return c.json({\n total_count: secrets.length,\n secrets: secrets.map((s) => ({\n name: s.name,\n created_at: s.created_at,\n updated_at: s.updated_at,\n })),\n });\n });\n\n app.get(\"/orgs/:org/actions/secrets/:secret_name\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n const name = c.req.param(\"secret_name\")!;\n const s = findOrgSecret(gh, org.id, name);\n if (!s) throw notFoundResponse();\n return c.json({\n name: s.name,\n visibility: s.visibility,\n created_at: s.created_at,\n updated_at: s.updated_at,\n });\n });\n\n app.put(\"/orgs/:org/actions/secrets/:secret_name\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n await parseJsonBody(c);\n const name = c.req.param(\"secret_name\")!;\n const existing = findOrgSecret(gh, org.id, name);\n if (existing) {\n gh.secrets.update(existing.id, { visibility: existing.visibility });\n return c.body(null, 204);\n }\n gh.secrets.insert({\n repo_id: null,\n org_id: org.id,\n name,\n visibility: \"all\",\n } as Omit<GitHubSecret, \"id\" | \"created_at\" | \"updated_at\">);\n return c.body(null, 201);\n });\n\n app.delete(\"/orgs/:org/actions/secrets/:secret_name\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n const name = c.req.param(\"secret_name\")!;\n const s = findOrgSecret(gh, org.id, name);\n if (!s) throw notFoundResponse();\n gh.secrets.delete(s.id);\n return c.body(null, 204);\n });\n}\n","import type { RouteContext, WebhookDispatcher } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubCheckRun,\n GitHubCheckSuite,\n GitHubCommit,\n GitHubRepo,\n GitHubUser,\n GitHubCheckAnnotation,\n} from \"../entities.js\";\nimport {\n formatRepo,\n formatUser,\n generateNodeId,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport {\n assertRepoRead,\n assertRepoWrite,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nconst CONCLUSION_RANK: Record<string, number> = {\n success: 0,\n neutral: 1,\n skipped: 2,\n cancelled: 3,\n timed_out: 4,\n action_required: 5,\n failure: 6,\n};\n\nfunction findCommitInRepo(gh: GitHubStore, repoId: number, shaParam: string): GitHubCommit | undefined {\n const want = shaParam.toLowerCase();\n const list = gh.commits.findBy(\"repo_id\", repoId);\n return list.find((c) => c.sha === shaParam || c.sha.toLowerCase() === want || c.sha.startsWith(shaParam));\n}\n\nfunction resolveRefToHeadSha(gh: GitHubStore, repo: GitHubRepo, refParam: string): string | undefined {\n const commit = findCommitInRepo(gh, repo.id, refParam);\n if (commit) return commit.sha;\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === refParam);\n if (branch) return branch.sha;\n const fullRef = refParam.startsWith(\"refs/\") ? refParam : `refs/heads/${refParam}`;\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (r) return r.sha;\n return undefined;\n}\n\nfunction headBranchForSha(gh: GitHubStore, repo: GitHubRepo, headSha: string): string {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.sha === headSha);\n if (branch) return branch.name;\n return repo.default_branch;\n}\n\nfunction getOrCreateCheckSuite(\n gh: GitHubStore,\n repo: GitHubRepo,\n headSha: string,\n headBranch?: string | null\n): GitHubCheckSuite {\n const existing = gh.checkSuites\n .findBy(\"repo_id\", repo.id)\n .find((s) => s.head_sha === headSha);\n if (existing) return existing;\n\n const hb = headBranch?.trim() || headBranchForSha(gh, repo, headSha);\n const row = gh.checkSuites.insert({\n node_id: \"\",\n repo_id: repo.id,\n head_branch: hb,\n head_sha: headSha,\n status: \"queued\",\n conclusion: null,\n before: \"\",\n after: headSha,\n app_id: null,\n } as Omit<GitHubCheckSuite, \"id\" | \"created_at\" | \"updated_at\">);\n gh.checkSuites.update(row.id, { node_id: generateNodeId(\"CheckSuite\", row.id) });\n return gh.checkSuites.get(row.id)!;\n}\n\nfunction worstConclusion(\n conclusions: NonNullable<GitHubCheckRun[\"conclusion\"]>[]\n): NonNullable<GitHubCheckSuite[\"conclusion\"]> {\n let best: NonNullable<GitHubCheckSuite[\"conclusion\"]> = \"success\";\n let rank = -1;\n for (const c of conclusions) {\n const r = CONCLUSION_RANK[c] ?? 3;\n if (r > rank) {\n rank = r;\n best = c;\n }\n }\n return best;\n}\n\nfunction recomputeSuiteFromRuns(runs: GitHubCheckRun[]): {\n status: GitHubCheckSuite[\"status\"];\n conclusion: GitHubCheckSuite[\"conclusion\"];\n} {\n if (runs.length === 0) {\n return { status: \"completed\", conclusion: null };\n }\n const allDone = runs.every((r) => r.status === \"completed\");\n if (allDone) {\n const conclusions = runs\n .map((r) => r.conclusion)\n .filter((c): c is NonNullable<typeof c> => c != null);\n return {\n status: \"completed\",\n conclusion: conclusions.length ? worstConclusion(conclusions) : null,\n };\n }\n const anyInProgress = runs.some((r) => r.status === \"in_progress\");\n if (anyInProgress) {\n return { status: \"in_progress\", conclusion: null };\n }\n const anyQueued = runs.some((r) => r.status === \"queued\");\n const anyCompleted = runs.some((r) => r.status === \"completed\");\n if (anyCompleted && anyQueued) {\n return { status: \"in_progress\", conclusion: null };\n }\n if (anyQueued) {\n return { status: \"queued\", conclusion: null };\n }\n return { status: \"in_progress\", conclusion: null };\n}\n\nfunction recomputeCheckSuite(gh: GitHubStore, suiteId: number) {\n const suite = gh.checkSuites.get(suiteId);\n if (!suite) return;\n const runs = gh.checkRuns\n .findBy(\"repo_id\", suite.repo_id)\n .filter((r) => r.check_suite_id === suiteId);\n const { status, conclusion } = recomputeSuiteFromRuns(runs);\n gh.checkSuites.update(suiteId, { status, conclusion });\n}\n\nfunction parseConclusion(\n raw: unknown\n): GitHubCheckRun[\"conclusion\"] | undefined {\n if (raw === undefined) return undefined;\n if (raw === null) return null;\n if (typeof raw !== \"string\") throw new ApiError(422, \"Invalid conclusion\");\n const allowed = new Set([\n \"success\",\n \"failure\",\n \"neutral\",\n \"cancelled\",\n \"skipped\",\n \"timed_out\",\n \"action_required\",\n ]);\n if (!allowed.has(raw)) throw new ApiError(422, \"Invalid conclusion\");\n return raw as GitHubCheckRun[\"conclusion\"];\n}\n\nfunction parseStatus(raw: unknown, fallback: GitHubCheckRun[\"status\"]): GitHubCheckRun[\"status\"] {\n if (raw === undefined || raw === null) return fallback;\n if (raw !== \"queued\" && raw !== \"in_progress\" && raw !== \"completed\") {\n throw new ApiError(422, \"Invalid status\");\n }\n return raw;\n}\n\nfunction normalizeAnnotations(raw: unknown): GitHubCheckAnnotation[] {\n if (raw === undefined || raw === null) return [];\n if (!Array.isArray(raw)) throw new ApiError(422, \"Invalid annotations\");\n const out: GitHubCheckAnnotation[] = [];\n for (const a of raw) {\n if (!a || typeof a !== \"object\") throw new ApiError(422, \"Invalid annotation\");\n const o = a as Record<string, unknown>;\n const path = typeof o.path === \"string\" ? o.path : null;\n const message = typeof o.message === \"string\" ? o.message : null;\n const start_line = typeof o.start_line === \"number\" ? o.start_line : parseInt(String(o.start_line), 10);\n const end_line = typeof o.end_line === \"number\" ? o.end_line : parseInt(String(o.end_line), 10);\n const annotation_level =\n typeof o.annotation_level === \"string\" ? o.annotation_level : \"notice\";\n if (!path || !message || !Number.isFinite(start_line) || !Number.isFinite(end_line)) {\n throw new ApiError(422, \"Invalid annotation fields\");\n }\n out.push({\n path,\n start_line,\n end_line,\n annotation_level,\n message,\n });\n }\n return out;\n}\n\nfunction formatCheckSuiteBrief(\n suite: GitHubCheckSuite,\n repo: GitHubRepo,\n baseUrl: string\n) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n id: suite.id,\n node_id: suite.node_id,\n head_branch: suite.head_branch,\n head_sha: suite.head_sha,\n url: `${repoUrl}/check-suites/${suite.id}`,\n };\n}\n\nfunction formatRepoBrief(repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const owner = formatRepo(repo, gh, baseUrl).owner;\n return {\n id: repo.id,\n node_id: repo.node_id,\n name: repo.name,\n full_name: repo.full_name,\n private: repo.private,\n owner,\n url: `${baseUrl}/repos/${repo.full_name}`,\n html_url: `${baseUrl}/${repo.full_name}`,\n };\n}\n\nfunction formatCheckRun(\n run: GitHubCheckRun,\n repo: GitHubRepo,\n gh: GitHubStore,\n baseUrl: string\n) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const suite = run.check_suite_id ? gh.checkSuites.get(run.check_suite_id) : null;\n return {\n id: run.id,\n node_id: run.node_id,\n head_sha: run.head_sha,\n name: run.name,\n status: run.status,\n conclusion: run.conclusion,\n started_at: run.started_at,\n completed_at: run.completed_at,\n external_id: run.external_id,\n url: `${repoUrl}/check-runs/${run.id}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${run.head_sha}/checks/${run.id}`,\n details_url: run.details_url,\n output: {\n title: run.output.title,\n summary: run.output.summary,\n text: run.output.text,\n annotations_count: run.output.annotations_count,\n },\n check_suite: suite ? formatCheckSuiteBrief(suite, repo, baseUrl) : null,\n app: null,\n pull_requests: [] as unknown[],\n };\n}\n\nfunction formatCheckSuite(\n suite: GitHubCheckSuite,\n repo: GitHubRepo,\n gh: GitHubStore,\n baseUrl: string\n) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n id: suite.id,\n node_id: suite.node_id,\n head_branch: suite.head_branch,\n head_sha: suite.head_sha,\n status: suite.status,\n conclusion: suite.conclusion,\n url: `${repoUrl}/check-suites/${suite.id}`,\n before: suite.before,\n after: suite.after,\n pull_requests: [],\n app: null,\n repository: formatRepoBrief(repo, gh, baseUrl),\n created_at: suite.created_at,\n updated_at: suite.updated_at,\n };\n}\n\nfunction dispatchCheckRun(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n run: GitHubCheckRun,\n actor: GitHubUser,\n baseUrl: string,\n action: string | undefined\n) {\n const ownerLogin = ownerLoginOf(gh, repo);\n void webhooks.dispatch(\n \"check_run\",\n action,\n {\n action,\n check_run: formatCheckRun(run, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n}\n\nfunction dispatchCheckSuite(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n suite: GitHubCheckSuite,\n actor: GitHubUser,\n baseUrl: string,\n action: string | undefined\n) {\n const ownerLogin = ownerLoginOf(gh, repo);\n void webhooks.dispatch(\n \"check_suite\",\n action,\n {\n action,\n check_suite: formatCheckSuite(suite, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name\n );\n}\n\nexport function checksRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Preferences (static path before :check_suite_id) ---\n app.patch(\"/repos/:owner/:repo/check-suites/preferences\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n const auto =\n Array.isArray(body.auto_trigger_checks) && body.auto_trigger_checks.every((x) => x && typeof x === \"object\")\n ? body.auto_trigger_checks\n : [];\n return c.json({\n preferences: {\n auto_trigger_checks: auto,\n },\n });\n });\n\n app.post(\"/repos/:owner/:repo/check-suites\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (typeof body.head_sha !== \"string\" || !body.head_sha.trim()) {\n throw new ApiError(422, \"head_sha is required\");\n }\n const headSha = body.head_sha.trim();\n const headBranch =\n typeof body.head_branch === \"string\" && body.head_branch.trim() ? body.head_branch.trim() : null;\n\n const suite = getOrCreateCheckSuite(gh, repo, headSha, headBranch);\n if (headBranch && suite.head_branch !== headBranch) {\n gh.checkSuites.update(suite.id, { head_branch: headBranch });\n }\n const updated = gh.checkSuites.get(suite.id)!;\n dispatchCheckSuite(webhooks, gh, repo, updated, actor, baseUrl, \"requested\");\n return c.json(formatCheckSuite(updated, repo, gh, baseUrl), 201);\n });\n\n app.get(\"/repos/:owner/:repo/check-suites/:check_suite_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const suiteId = parseInt(c.req.param(\"check_suite_id\")!, 10);\n const suite = gh.checkSuites.get(suiteId);\n if (!suite || suite.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatCheckSuite(suite, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/check-suites/:check_suite_id/check-runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const suiteId = parseInt(c.req.param(\"check_suite_id\")!, 10);\n const suite = gh.checkSuites.get(suiteId);\n if (!suite || suite.repo_id !== repo.id) throw notFoundResponse();\n const { page, per_page } = parsePagination(c);\n let runs = gh.checkRuns\n .findBy(\"repo_id\", repo.id)\n .filter((r) => r.check_suite_id === suiteId);\n runs = runs.sort((a, b) => b.id - a.id);\n const total = runs.length;\n const slice = runs.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n check_runs: slice.map((r) => formatCheckRun(r, repo, gh, baseUrl)),\n });\n });\n\n app.post(\"/repos/:owner/:repo/check-suites/:check_suite_id/rerequest\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const suiteId = parseInt(c.req.param(\"check_suite_id\")!, 10);\n const suite = gh.checkSuites.get(suiteId);\n if (!suite || suite.repo_id !== repo.id) throw notFoundResponse();\n\n const runs = gh.checkRuns\n .findBy(\"repo_id\", repo.id)\n .filter((r) => r.check_suite_id === suiteId);\n const now = timestamp();\n for (const r of runs) {\n gh.checkRuns.update(r.id, {\n status: \"queued\",\n conclusion: null,\n completed_at: null,\n started_at: null,\n updated_at: now,\n });\n }\n gh.checkSuites.update(suiteId, { status: \"queued\", conclusion: null });\n const suiteAfter = gh.checkSuites.get(suiteId)!;\n dispatchCheckSuite(webhooks, gh, repo, suiteAfter, actor, baseUrl, \"rerequested\");\n return c.body(null, 201);\n });\n\n app.get(\"/repos/:owner/:repo/commits/:ref/check-suites\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const ref = c.req.param(\"ref\")!;\n const headSha = resolveRefToHeadSha(gh, repo, ref);\n if (!headSha) throw notFoundResponse();\n const suites = gh.checkSuites\n .findBy(\"repo_id\", repo.id)\n .filter((s) => s.head_sha === headSha)\n .sort((a, b) => b.id - a.id);\n return c.json({\n total_count: suites.length,\n check_suites: suites.map((s) => formatCheckSuite(s, repo, gh, baseUrl)),\n });\n });\n\n // --- Check runs ---\n app.post(\"/repos/:owner/:repo/check-runs\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n\n if (typeof body.name !== \"string\" || !body.name.trim()) {\n throw new ApiError(422, \"name is required\");\n }\n if (typeof body.head_sha !== \"string\" || !body.head_sha.trim()) {\n throw new ApiError(422, \"head_sha is required\");\n }\n\n const name = body.name.trim();\n const headSha = body.head_sha.trim();\n const status = parseStatus(body.status, \"queued\");\n let conclusion = parseConclusion(body.conclusion);\n if (status === \"completed\" && (conclusion === undefined || conclusion === null)) {\n throw new ApiError(422, \"conclusion is required when status is completed\");\n }\n if (status !== \"completed\") {\n conclusion = null;\n }\n\n const details_url =\n typeof body.details_url === \"string\" || body.details_url === null ? (body.details_url as string | null) : null;\n const external_id =\n typeof body.external_id === \"string\" ? body.external_id : body.external_id == null ? \"\" : String(body.external_id);\n\n const started_at =\n body.started_at === undefined\n ? null\n : body.started_at === null\n ? null\n : typeof body.started_at === \"string\"\n ? body.started_at\n : null;\n let completed_at =\n body.completed_at === undefined\n ? null\n : body.completed_at === null\n ? null\n : typeof body.completed_at === \"string\"\n ? body.completed_at\n : null;\n\n if (status === \"completed\" && !completed_at) {\n completed_at = timestamp();\n }\n\n const outRaw = body.output && typeof body.output === \"object\" ? (body.output as Record<string, unknown>) : {};\n const annotations = normalizeAnnotations(outRaw.annotations);\n const output = {\n title: typeof outRaw.title === \"string\" ? outRaw.title : outRaw.title === null ? null : null,\n summary: typeof outRaw.summary === \"string\" ? outRaw.summary : outRaw.summary === null ? null : null,\n text: typeof outRaw.text === \"string\" ? outRaw.text : outRaw.text === null ? null : null,\n annotations_count: annotations.length,\n annotations,\n };\n\n let actions: GitHubCheckRun[\"actions\"] = null;\n if (Array.isArray(body.actions)) {\n actions = [];\n for (const act of body.actions) {\n if (!act || typeof act !== \"object\") continue;\n const a = act as Record<string, unknown>;\n if (\n typeof a.id === \"string\" &&\n typeof a.label === \"string\" &&\n typeof a.description === \"string\"\n ) {\n actions.push({ id: a.id, label: a.label, description: a.description });\n }\n }\n if (actions.length === 0) actions = null;\n }\n\n const suite = getOrCreateCheckSuite(gh, repo, headSha, null);\n\n const row = gh.checkRuns.insert({\n node_id: \"\",\n repo_id: repo.id,\n head_sha: headSha,\n name,\n status,\n conclusion: conclusion ?? null,\n started_at,\n completed_at,\n external_id,\n details_url,\n actions,\n output,\n check_suite_id: suite.id,\n app_id: typeof body.app_id === \"number\" ? body.app_id : null,\n } as Omit<GitHubCheckRun, \"id\" | \"created_at\" | \"updated_at\">);\n gh.checkRuns.update(row.id, { node_id: generateNodeId(\"CheckRun\", row.id) });\n const run = gh.checkRuns.get(row.id)!;\n\n recomputeCheckSuite(gh, suite.id);\n\n dispatchCheckRun(webhooks, gh, repo, run, actor, baseUrl, \"created\");\n return c.json(formatCheckRun(run, repo, gh, baseUrl), 201);\n });\n\n app.patch(\"/repos/:owner/:repo/check-runs/:check_run_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const prev = gh.checkRuns.get(runId);\n if (!prev || prev.repo_id !== repo.id) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n\n const patch: Partial<GitHubCheckRun> = {};\n\n if (body.name !== undefined) {\n if (typeof body.name !== \"string\" || !body.name.trim()) throw new ApiError(422, \"Invalid name\");\n patch.name = body.name.trim();\n }\n if (body.head_sha !== undefined) {\n if (typeof body.head_sha !== \"string\" || !body.head_sha.trim()) throw new ApiError(422, \"Invalid head_sha\");\n patch.head_sha = body.head_sha.trim();\n }\n if (body.status !== undefined) {\n patch.status = parseStatus(body.status, prev.status);\n }\n if (body.conclusion !== undefined) {\n const pc = parseConclusion(body.conclusion);\n patch.conclusion = pc === undefined ? null : pc;\n }\n if (body.details_url !== undefined) {\n patch.details_url =\n typeof body.details_url === \"string\" || body.details_url === null ? (body.details_url as string | null) : null;\n }\n if (body.external_id !== undefined) {\n patch.external_id =\n typeof body.external_id === \"string\" ? body.external_id : String(body.external_id ?? \"\");\n }\n if (body.started_at !== undefined) {\n patch.started_at =\n body.started_at === null\n ? null\n : typeof body.started_at === \"string\"\n ? body.started_at\n : null;\n }\n if (body.completed_at !== undefined) {\n patch.completed_at =\n body.completed_at === null\n ? null\n : typeof body.completed_at === \"string\"\n ? body.completed_at\n : null;\n }\n if (body.app_id !== undefined) {\n patch.app_id = typeof body.app_id === \"number\" ? body.app_id : null;\n }\n if (body.actions !== undefined) {\n if (body.actions === null) {\n patch.actions = null;\n } else if (Array.isArray(body.actions)) {\n const actions: NonNullable<GitHubCheckRun[\"actions\"]> = [];\n for (const act of body.actions) {\n if (!act || typeof act !== \"object\") continue;\n const a = act as Record<string, unknown>;\n if (\n typeof a.id === \"string\" &&\n typeof a.label === \"string\" &&\n typeof a.description === \"string\"\n ) {\n actions.push({ id: a.id, label: a.label, description: a.description });\n }\n }\n patch.actions = actions.length ? actions : null;\n }\n }\n\n if (body.output !== undefined && body.output !== null && typeof body.output === \"object\") {\n const outRaw = body.output as Record<string, unknown>;\n const annotations = normalizeAnnotations(outRaw.annotations);\n patch.output = {\n title:\n outRaw.title === undefined\n ? prev.output.title\n : typeof outRaw.title === \"string\"\n ? outRaw.title\n : null,\n summary:\n outRaw.summary === undefined\n ? prev.output.summary\n : typeof outRaw.summary === \"string\"\n ? outRaw.summary\n : null,\n text:\n outRaw.text === undefined\n ? prev.output.text\n : typeof outRaw.text === \"string\"\n ? outRaw.text\n : null,\n annotations_count: annotations.length,\n annotations,\n };\n }\n\n const nextStatus = patch.status ?? prev.status;\n let nextConclusion: GitHubCheckRun[\"conclusion\"] =\n patch.conclusion !== undefined ? patch.conclusion : prev.conclusion;\n\n if (patch.head_sha && patch.head_sha !== prev.head_sha) {\n const newSuite = getOrCreateCheckSuite(gh, repo, patch.head_sha, null);\n patch.check_suite_id = newSuite.id;\n }\n\n if (nextStatus === \"completed\") {\n if (nextConclusion === undefined || nextConclusion === null) {\n throw new ApiError(422, \"conclusion is required when status is completed\");\n }\n patch.conclusion = nextConclusion;\n let nextCompleted = patch.completed_at !== undefined ? patch.completed_at : prev.completed_at;\n if (!nextCompleted) {\n patch.completed_at = timestamp();\n }\n } else {\n patch.conclusion = null;\n patch.completed_at = null;\n }\n\n gh.checkRuns.update(runId, patch);\n const run = gh.checkRuns.get(runId)!;\n\n if (run.check_suite_id) {\n recomputeCheckSuite(gh, run.check_suite_id);\n }\n\n if (prev.status !== \"completed\" && run.status === \"completed\") {\n dispatchCheckRun(webhooks, gh, repo, run, actor, baseUrl, \"completed\");\n }\n\n return c.json(formatCheckRun(run, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/check-runs/:check_run_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const run = gh.checkRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatCheckRun(run, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/check-runs/:check_run_id/annotations\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const run = gh.checkRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const annotations = run.output.annotations;\n const total = annotations.length;\n const slice = annotations.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const check_annotations = slice.map((a, i) => ({\n path: a.path,\n blob_href: `${baseUrl}/${repo.full_name}/blob/${run.head_sha}/${a.path}`,\n start_line: a.start_line,\n end_line: a.end_line,\n message: a.message,\n title: null as string | null,\n raw_details: null as string | null,\n start_column: null as number | null,\n end_column: null as number | null,\n annotation_level: a.annotation_level,\n id: (page - 1) * per_page + i + 1,\n }));\n\n return c.json({\n total_count: total,\n check_annotations,\n });\n });\n\n app.post(\"/repos/:owner/:repo/check-runs/:check_run_id/rerequest\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const prev = gh.checkRuns.get(runId);\n if (!prev || prev.repo_id !== repo.id) throw notFoundResponse();\n\n const now = timestamp();\n gh.checkRuns.update(runId, {\n status: \"queued\",\n conclusion: null,\n completed_at: null,\n started_at: null,\n updated_at: now,\n });\n const run = gh.checkRuns.get(runId)!;\n if (run.check_suite_id) {\n recomputeCheckSuite(gh, run.check_suite_id);\n }\n dispatchCheckRun(webhooks, gh, repo, run, actor, baseUrl, \"rerequested\");\n return c.body(null, 201);\n });\n\n app.get(\"/repos/:owner/:repo/commits/:ref/check-runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const ref = c.req.param(\"ref\")!;\n const headSha = resolveRefToHeadSha(gh, repo, ref);\n if (!headSha) throw notFoundResponse();\n\n const check_name = c.req.query(\"check_name\")?.trim();\n const statusQ = c.req.query(\"status\")?.trim() as GitHubCheckRun[\"status\"] | undefined;\n const filter = (c.req.query(\"filter\") ?? \"latest\").toLowerCase();\n\n let runs = gh.checkRuns.findBy(\"repo_id\", repo.id).filter((r) => r.head_sha === headSha);\n if (check_name) {\n runs = runs.filter((r) => r.name === check_name);\n }\n if (statusQ && (statusQ === \"queued\" || statusQ === \"in_progress\" || statusQ === \"completed\")) {\n runs = runs.filter((r) => r.status === statusQ);\n }\n\n runs = runs.sort((a, b) => b.id - a.id);\n\n if (filter === \"latest\") {\n const byName = new Map<string, GitHubCheckRun>();\n for (const r of runs.sort((a, b) => a.id - b.id)) {\n byName.set(r.name, r);\n }\n runs = [...byName.values()].sort((a, b) => b.id - a.id);\n }\n\n return c.json({\n total_count: runs.length,\n check_runs: runs.map((r) => formatCheckRun(r, repo, gh, baseUrl)),\n });\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\n\nexport function rateLimitRoutes({ app }: RouteContext): void {\n app.get(\"/rate_limit\", (c) => {\n const now = Math.floor(Date.now() / 1000);\n const reset = now + 3600;\n const rateLimit = {\n limit: 5000,\n remaining: 4999,\n reset,\n used: 1,\n resource: \"core\",\n };\n\n return c.json({\n resources: {\n core: rateLimit,\n search: { limit: 30, remaining: 29, reset, used: 1, resource: \"search\" },\n graphql: { limit: 5000, remaining: 4999, reset, used: 1, resource: \"graphql\" },\n integration_manifest: { limit: 5000, remaining: 4999, reset, used: 1, resource: \"integration_manifest\" },\n source_import: { limit: 100, remaining: 99, reset, used: 1, resource: \"source_import\" },\n code_scanning_upload: { limit: 500, remaining: 499, reset, used: 1, resource: \"code_scanning_upload\" },\n actions_runner_registration: { limit: 10000, remaining: 9999, reset, used: 1, resource: \"actions_runner_registration\" },\n scim: { limit: 15000, remaining: 14999, reset, used: 1, resource: \"scim\" },\n },\n rate: rateLimit,\n });\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\n\nexport function metaRoutes({ app, baseUrl }: RouteContext): void {\n app.get(\"/meta\", (c) => {\n return c.json({\n verifiable_password_authentication: true,\n ssh_key_fingerprints: {\n SHA256_RSA: \"placeholder\",\n SHA256_DSA: \"placeholder\",\n SHA256_ECDSA: \"placeholder\",\n SHA256_ED25519: \"placeholder\",\n },\n ssh_keys: [\"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPlaceholder\"],\n hooks: [\"127.0.0.1/32\"],\n web: [\"127.0.0.1/32\"],\n api: [\"127.0.0.1/32\"],\n git: [\"127.0.0.1/32\"],\n github_enterprise_importer: [\"127.0.0.1/32\"],\n packages: [\"127.0.0.1/32\"],\n pages: [\"127.0.0.1/32\"],\n importer: [\"127.0.0.1/32\"],\n actions: [\"127.0.0.1/32\"],\n actions_macos: [\"127.0.0.1/32\"],\n dependabot: [\"127.0.0.1/32\"],\n copilot: [\"127.0.0.1/32\"],\n domains: {\n website: [\"localhost\"],\n codespaces: [\"localhost\"],\n copilot: [\"localhost\"],\n packages: [\"localhost\"],\n actions: [\"localhost\"],\n artifact_attestations: { trust_domain: \"localhost\" },\n },\n });\n });\n\n app.get(\"/octocat\", (c) => {\n const say = c.req.query(\"s\") ?? \"emulate says hello!\";\n const art = `\n MMM. .MMM\n MMMMMMMMMMMMMMMMMMM\n MMMMMMMMMMMMMMMMMMM ____________________________\n MMMMMMMMMMMMMMMMMMMMM | |\n MMMMMMMMMMMMMMMMMMMMMMM | ${say.padEnd(26)} |\n MMMMMMMMMMMMMMMMMMMMMMMM |_ ________________________|\n MMMM::- -:::::::- -::MMMM |/\n MM~:~ 00~:::::~ 00~:~MM\n .. .. :~M]:[~:M. . ..\n .MM. ~MM. MM~ .MM.\n MMMM. ~MM:~MM~ .MMMM\n MMMMMM. ~MMMMMMMM~ .MMMMMM\n MMMMMMMMMMMMMMMMMMMMMMMMMMMM\n .MMMMMMMMMMMMMMMMMMMMMM.\n MMMMMMMMMMMMMMMMMM\n ;MMMMMMMMMMMMMMM;\n :MMMMMMMMMMMM:\n .MMMMMMMMMMM.\n MMMMMMMMMMM\n MMMMMMMMM\n MMMMMMM\n MMMMM\n MMM\n M\n`;\n c.header(\"Content-Type\", \"application/octocat-stream\");\n return c.text(art.trim());\n });\n\n app.get(\"/emojis\", (c) => {\n return c.json({\n \"+1\": `${baseUrl}/emojis/+1.png`,\n \"-1\": `${baseUrl}/emojis/-1.png`,\n \"100\": `${baseUrl}/emojis/100.png`,\n \"tada\": `${baseUrl}/emojis/tada.png`,\n \"rocket\": `${baseUrl}/emojis/rocket.png`,\n \"heart\": `${baseUrl}/emojis/heart.png`,\n \"eyes\": `${baseUrl}/emojis/eyes.png`,\n \"thinking\": `${baseUrl}/emojis/thinking.png`,\n \"thumbsup\": `${baseUrl}/emojis/thumbsup.png`,\n \"thumbsdown\": `${baseUrl}/emojis/thumbsdown.png`,\n });\n });\n\n app.get(\"/zen\", (c) => {\n const phrases = [\n \"Non-blocking is better than blocking.\",\n \"Design for failure.\",\n \"Half measures are as bad as nothing at all.\",\n \"Encourage flow.\",\n \"Anything added dilutes everything else.\",\n \"Approachable is better than simple.\",\n \"Mind your words, they are important.\",\n \"Speak like a human.\",\n \"It's not fully shipped until it's fast.\",\n \"Responsive is better than fast.\",\n \"Keep it logically awesome.\",\n \"Favor focus over features.\",\n \"Avoid administrative distraction.\",\n ];\n return c.text(phrases[Math.floor(Math.random() * phrases.length)]);\n });\n\n app.get(\"/versions\", (c) => {\n return c.json([\"2022-11-28\", \"2022-08-09\"]);\n });\n}\n","import { randomBytes } from \"crypto\";\nimport type { Context } from \"hono\";\nimport type { RouteContext, Store, AuthUser, AppEnv } from \"@emulators/core\";\nimport {\n unauthorized,\n escapeHtml,\n escapeAttr,\n renderCardPage,\n renderErrorPage,\n renderSettingsPage,\n renderUserButton,\n matchesRedirectUri,\n constantTimeSecretEqual,\n parseCookies,\n debug,\n} from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport { formatUser, formatUserFull } from \"../helpers.js\";\n\ntype PendingCode = {\n login: string;\n scope: string;\n redirectUri: string;\n clientId: string;\n created_at: number;\n};\n\nconst PENDING_CODE_TTL_MS = 10 * 60 * 1000;\n\nfunction getPendingCodes(store: Store): Map<string, PendingCode> {\n let map = store.getData<Map<string, PendingCode>>(\"github.oauth.pendingCodes\");\n if (!map) {\n map = new Map();\n store.setData(\"github.oauth.pendingCodes\", map);\n }\n return map;\n}\n\nfunction getTokenToClientId(store: Store): Map<string, string> {\n let map = store.getData<Map<string, string>>(\"github.oauth.tokenToClientId\");\n if (!map) {\n map = new Map();\n store.setData(\"github.oauth.tokenToClientId\", map);\n }\n return map;\n}\n\nfunction getSessionMap(store: Store): Map<string, string> {\n let map = store.getData<Map<string, string>>(\"github.oauth.sessionMap\");\n if (!map) {\n map = new Map();\n store.setData(\"github.oauth.sessionMap\", map);\n }\n return map;\n}\n\n/** On read: drops entries older than {@link PENDING_CODE_TTL_MS}. */\nfunction getPendingCodeIfValid(store: Store, code: string): PendingCode | undefined {\n const map = getPendingCodes(store);\n const pending = map.get(code);\n if (!pending) return undefined;\n if (Date.now() - pending.created_at > PENDING_CODE_TTL_MS) {\n map.delete(code);\n return undefined;\n }\n return pending;\n}\n\nconst SERVICE_LABEL = \"GitHub\";\n\nexport function oauthRoutes({ app, store, baseUrl, tokenMap }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n function resolveSessionUser(c: Context<AppEnv>): { login: string; id: number } | null {\n const authUser = c.get(\"authUser\") as AuthUser | undefined;\n if (authUser) {\n const user = gh.users.findOneBy(\"login\", authUser.login);\n if (user) return { login: user.login, id: user.id };\n }\n const cookieHeader = c.req.header(\"Cookie\") ?? \"\";\n const cookies = parseCookies(cookieHeader);\n const sessionId = cookies[\"_emu_session\"];\n if (sessionId) {\n const login = getSessionMap(store).get(sessionId);\n if (login) {\n const user = gh.users.findOneBy(\"login\", login);\n if (user) return { login: user.login, id: user.id };\n }\n }\n return null;\n }\n\n // ---------- OAuth authorize page ----------\n\n app.get(\"/login/oauth/authorize\", (c) => {\n const client_id = c.req.query(\"client_id\") ?? \"\";\n const redirect_uri = c.req.query(\"redirect_uri\") ?? \"\";\n const scope = c.req.query(\"scope\") ?? \"\";\n const state = c.req.query(\"state\") ?? \"\";\n\n const oauthAppsConfigured = gh.oauthApps.all().length > 0;\n let oauthAppForSubtitle: { name: string } | undefined;\n if (oauthAppsConfigured) {\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", client_id);\n if (!oauthApp) {\n return c.html(\n renderErrorPage(\"Application not found\", `The client_id '${client_id}' is not registered.`, SERVICE_LABEL),\n 400\n );\n }\n if (redirect_uri && !matchesRedirectUri(redirect_uri, oauthApp.redirect_uris)) {\n console.warn(`[OAuth] redirect_uri mismatch: got \"${redirect_uri}\", registered: ${JSON.stringify(oauthApp.redirect_uris)}`);\n return c.html(\n renderErrorPage(\"Redirect URI mismatch\", \"The redirect_uri is not registered for this application.\", SERVICE_LABEL),\n 400\n );\n }\n oauthAppForSubtitle = oauthApp;\n }\n\n const users = [...gh.users.all()].sort((a, b) => a.login.localeCompare(b.login));\n\n const subtitleText = oauthAppForSubtitle\n ? `Authorize <strong>${escapeHtml(oauthAppForSubtitle.name)}</strong> to access your account.`\n : \"Choose a seeded user to authorize this application.\";\n\n const userButtons = users\n .map((u) => {\n const brief = formatUser(u, baseUrl);\n const full = formatUserFull(u, baseUrl);\n return renderUserButton({\n letter: (brief.login[0] ?? \"?\").toUpperCase(),\n login: full.login,\n name: full.name ?? undefined,\n email: full.email ?? undefined,\n formAction: \"/login/oauth/callback\",\n hiddenFields: {\n login: u.login,\n redirect_uri,\n scope,\n state,\n client_id,\n },\n });\n })\n .join(\"\\n\");\n\n const body = users.length === 0\n ? '<p class=\"empty\">No users in the emulator store.</p>'\n : userButtons;\n\n return c.html(renderCardPage(\"Sign in to GitHub\", subtitleText, body, SERVICE_LABEL));\n });\n\n // ---------- OAuth callback (user selection) ----------\n\n app.post(\"/login/oauth/callback\", async (c) => {\n const body = (await c.req.parseBody()) as Record<string, string>;\n const login = String(body.login ?? \"\");\n const redirect_uri = String(body.redirect_uri ?? \"\");\n const scope = String(body.scope ?? \"\");\n const state = String(body.state ?? \"\");\n const client_id = String(body.client_id ?? \"\");\n\n const code = randomBytes(20).toString(\"hex\");\n getPendingCodes(store).set(code, {\n login,\n scope,\n redirectUri: redirect_uri,\n clientId: client_id,\n created_at: Date.now(),\n });\n\n debug(\"github.oauth\", `[OAuth callback] generated code: ${code.slice(0, 8)}... for login=${login}, pendingCodes size: ${getPendingCodes(store).size}`);\n\n const sessionId = randomBytes(24).toString(\"base64url\");\n getSessionMap(store).set(sessionId, login);\n c.header(\"Set-Cookie\", `_emu_session=${sessionId}; Path=/; HttpOnly; SameSite=Lax`);\n\n const sep = redirect_uri.includes(\"?\") ? \"&\" : \"?\";\n const target = `${redirect_uri}${sep}code=${encodeURIComponent(code)}&state=${encodeURIComponent(state)}`;\n debug(\"github.oauth\", `[OAuth callback] redirecting to: ${target.slice(0, 120)}...`);\n return c.redirect(target, 302);\n });\n\n // ---------- Token exchange ----------\n\n app.post(\"/login/oauth/access_token\", async (c) => {\n const contentType = c.req.header(\"Content-Type\") ?? \"\";\n const accept = c.req.header(\"Accept\") ?? \"\";\n debug(\"github.oauth\", `[OAuth token] Content-Type: ${contentType}`);\n debug(\"github.oauth\", `[OAuth token] Accept: ${accept}`);\n debug(\"github.oauth\", `[OAuth token] pendingCodes size: ${getPendingCodes(store).size}`);\n debug(\"github.oauth\", `[OAuth token] pendingCodes keys: ${[...getPendingCodes(store).keys()].map(k => k.slice(0, 8) + \"...\").join(\", \")}`);\n\n const rawText = await c.req.text();\n debug(\"github.oauth\", `[OAuth token] raw body: ${rawText.slice(0, 500)}`);\n\n let raw: Record<string, unknown>;\n if (contentType.includes(\"application/json\")) {\n try {\n raw = JSON.parse(rawText);\n } catch {\n raw = {};\n }\n } else {\n raw = Object.fromEntries(new URLSearchParams(rawText));\n }\n\n debug(\"github.oauth\", `[OAuth token] parsed keys: ${Object.keys(raw).join(\", \")}`);\n\n const code = String(raw.code ?? \"\");\n const bodyClientId = String(raw.client_id ?? \"\");\n const bodyClientSecret = String(raw.client_secret ?? \"\").slice(0, 4) + \"****\";\n\n debug(\"github.oauth\", `[OAuth token] code: ${code.slice(0, 8)}... (len=${code.length})`);\n debug(\"github.oauth\", `[OAuth token] client_id: ${bodyClientId}`);\n debug(\"github.oauth\", `[OAuth token] client_secret: ${bodyClientSecret}`);\n\n const actualSecret = String(raw.client_secret ?? \"\");\n\n const incorrectClientCredentials = () => {\n debug(\"github.oauth\", `[OAuth token] REJECTED: incorrect_client_credentials`);\n return c.json(\n {\n error: \"incorrect_client_credentials\",\n error_description: \"The client_id and/or client_secret passed are incorrect.\",\n },\n 200\n );\n };\n\n const oauthAppsConfigured = gh.oauthApps.all().length > 0;\n if (oauthAppsConfigured) {\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", bodyClientId);\n if (!oauthApp) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: client_id not found in oauthApps`);\n return incorrectClientCredentials();\n }\n if (!constantTimeSecretEqual(actualSecret, oauthApp.client_secret)) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: client_secret mismatch`);\n return incorrectClientCredentials();\n }\n debug(\"github.oauth\", `[OAuth token] client credentials OK (app: ${oauthApp.name})`);\n } else {\n debug(\"github.oauth\", `[OAuth token] no oauth apps configured, skipping client validation`);\n }\n\n const pending = getPendingCodeIfValid(store, code);\n if (!pending) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: code not found in pendingCodes or expired`);\n return c.json(\n { error: \"bad_verification_code\", error_description: \"The code passed is incorrect or expired.\" },\n 200\n );\n }\n\n debug(\"github.oauth\", `[OAuth token] code valid, login=${pending.login}, scope=${pending.scope}`);\n getPendingCodes(store).delete(code);\n\n const user = gh.users.findOneBy(\"login\", pending.login);\n if (!user) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: user \"${pending.login}\" not found in store`);\n return c.json(\n { error: \"bad_verification_code\", error_description: \"The code passed is incorrect or expired.\" },\n 200\n );\n }\n\n const token = \"gho_\" + randomBytes(20).toString(\"base64url\");\n const scopes = pending.scope\n ? pending.scope.split(/[,\\s]+/).filter(Boolean)\n : [\"repo\", \"user\"];\n\n if (tokenMap) {\n tokenMap.set(token, { login: user.login, id: user.id, scopes });\n }\n\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", pending.clientId);\n if (oauthApp) {\n const existingGrant = gh.oauthGrants.all().find(\n (g) => g.user_id === user.id && g.client_id === pending.clientId\n );\n const orgAccess: Record<string, \"granted\" | \"denied\" | \"requested\"> = {};\n for (const org of gh.orgs.all()) {\n const isMember = gh.teamMembers.all().some(\n (tm) => tm.user_id === user.id && gh.teams.get(tm.team_id)?.org_id === org.id\n );\n if (isMember) orgAccess[org.login] = \"granted\";\n }\n\n if (existingGrant) {\n gh.oauthGrants.update(existingGrant.id, { scopes, org_access: orgAccess });\n } else {\n gh.oauthGrants.insert({\n user_id: user.id,\n oauth_app_id: oauthApp.id,\n client_id: pending.clientId,\n scopes,\n org_access: orgAccess,\n });\n }\n getTokenToClientId(store).set(token, pending.clientId);\n }\n\n debug(\"github.oauth\", `[OAuth token] SUCCESS: issued token for ${user.login} (scopes: ${scopes.join(\",\")})`);\n\n const wantsFormEncoded = accept.includes(\"application/x-www-form-urlencoded\");\n const scopeOut = pending.scope;\n\n if (wantsFormEncoded) {\n const formBody =\n `access_token=${encodeURIComponent(token)}&token_type=bearer&scope=${encodeURIComponent(scopeOut)}`;\n c.header(\"Content-Type\", \"application/x-www-form-urlencoded\");\n return c.body(formBody, 200);\n }\n\n return c.json({\n access_token: token,\n token_type: \"bearer\",\n scope: scopeOut,\n });\n });\n\n // ---------- User emails ----------\n\n app.get(\"/user/emails\", (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n throw unauthorized();\n }\n const user = gh.users.findOneBy(\"login\", authUser.login);\n if (!user) {\n throw unauthorized();\n }\n const email = user.email || `${user.login}@users.noreply.localhost`;\n return c.json([\n {\n email,\n primary: true,\n verified: true,\n visibility: \"public\",\n },\n ]);\n });\n\n // ---------- Settings: list authorized apps ----------\n\n const SCOPE_LABELS: Record<string, string> = {\n \"repo\": \"Full control of private repositories\",\n \"read:user\": \"Read all user profile data\",\n \"user:email\": \"Access user email addresses (read-only)\",\n \"user\": \"Full control of user profile\",\n \"workflow\": \"Update GitHub action workflows\",\n \"admin:org\": \"Full control of orgs and teams\",\n \"admin:repo_hook\": \"Full control of repository hooks\",\n \"read:org\": \"Read org and team membership\",\n \"write:repo_hook\": \"Write repository hooks\",\n \"read:repo_hook\": \"Read repository hooks\",\n \"delete_repo\": \"Delete repositories\",\n \"gist\": \"Create gists\",\n \"notifications\": \"Access notifications\",\n \"write:packages\": \"Upload packages\",\n \"read:packages\": \"Download packages\",\n \"admin:gpg_key\": \"Full control of GPG keys\",\n \"admin:public_key\": \"Full control of public keys\",\n };\n\n function scopeLabel(scope: string): string {\n return SCOPE_LABELS[scope] ?? scope;\n }\n\n const sidebarHtml = `\n <a href=\"/settings/applications\" class=\"active\">Authorized Apps</a>`;\n\n app.get(\"/settings/applications\", (c) => {\n const sessionUser = resolveSessionUser(c);\n if (!sessionUser) {\n return c.html(renderErrorPage(\"Unauthorized\", \"You must be authenticated to view this page.\", SERVICE_LABEL), 401);\n }\n\n const grants = gh.oauthGrants.findBy(\"user_id\", sessionUser.id);\n\n let bodyHtml: string;\n if (grants.length === 0) {\n bodyHtml = `\n <div class=\"section-heading\">Authorized OAuth Apps</div>\n <div class=\"s-card\">\n <p class=\"empty\">No authorized applications. Apps you authorize will appear here.</p>\n </div>`;\n } else {\n const appLinks = grants.map((grant) => {\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", grant.client_id);\n const name = oauthApp?.name ?? grant.client_id;\n const letter = escapeHtml((name[0] ?? \"?\").toUpperCase());\n const scopeText = grant.scopes.length > 0 ? grant.scopes.join(\", \") : \"No scopes\";\n return `<a href=\"/settings/connections/applications/${escapeAttr(grant.client_id)}\" class=\"app-link\">\n <div class=\"s-icon\">${letter}</div>\n <div>\n <div class=\"app-link-name\">${escapeHtml(name)}</div>\n <div class=\"app-link-scopes\">${escapeHtml(scopeText)}</div>\n </div>\n </a>`;\n }).join(\"\\n\");\n\n bodyHtml = `\n <div class=\"section-heading\">Authorized OAuth Apps</div>\n <div class=\"s-card\">${appLinks}</div>`;\n }\n\n return c.html(renderSettingsPage(\"Authorized OAuth Apps\", sidebarHtml, bodyHtml, SERVICE_LABEL));\n });\n\n // ---------- Settings: app detail ----------\n\n app.get(\"/settings/connections/applications/:client_id\", (c) => {\n const sessionUser = resolveSessionUser(c);\n if (!sessionUser) {\n return c.html(renderErrorPage(\"Unauthorized\", \"You must be authenticated to view this page.\", SERVICE_LABEL), 401);\n }\n\n const clientId = c.req.param(\"client_id\");\n\n const grant = gh.oauthGrants.all().find(\n (g) => g.user_id === sessionUser.id && g.client_id === clientId\n );\n if (!grant) {\n return c.html(renderErrorPage(\"Not Found\", \"No authorization found for this application.\", SERVICE_LABEL), 404);\n }\n\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", clientId);\n const appName = oauthApp?.name ?? clientId;\n const appLetter = escapeHtml((appName[0] ?? \"?\").toUpperCase());\n const lastUsed = new Date(grant.updated_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\", month: \"long\", day: \"numeric\",\n });\n\n const permRows = grant.scopes.map((s) =>\n `<li><span class=\"check\">&#10003;</span> ${escapeHtml(scopeLabel(s))}</li>`\n ).join(\"\\n\");\n\n const orgRows = Object.entries(grant.org_access).map(([org, status]) => {\n const letter = escapeHtml((org[0] ?? \"?\").toUpperCase());\n const badgeClass = status === \"granted\" ? \"badge-granted\"\n : status === \"denied\" ? \"badge-denied\"\n : \"badge-requested\";\n const icon = status === \"granted\" ? \"&#10003;\" : status === \"denied\" ? \"&#10007;\" : \"&#8943;\";\n return `<div class=\"org-row\">\n <div class=\"org-icon\">${letter}</div>\n <span class=\"org-name\">${escapeHtml(org)}</span>\n <span class=\"badge ${badgeClass}\">${icon}</span>\n </div>`;\n }).join(\"\\n\");\n\n const bodyHtml = `\n <div class=\"s-card\">\n <div class=\"s-card-header\">\n <div class=\"s-icon\">${appLetter}</div>\n <div>\n <div class=\"s-title\">${escapeHtml(appName)}</div>\n <div class=\"s-subtitle\">Last used: ${escapeHtml(lastUsed)}</div>\n </div>\n </div>\n </div>\n\n <div class=\"s-card\">\n <div class=\"section-heading\">\n <span>Permissions</span>\n <form method=\"post\" action=\"/settings/connections/applications/${escapeAttr(clientId)}/revoke\" style=\"display:inline\">\n <button type=\"submit\" class=\"btn-revoke\">Revoke access</button>\n </form>\n </div>\n <ul class=\"perm-list\">\n ${permRows || '<li style=\"color:#1a8c00\">No specific permissions granted.</li>'}\n </ul>\n </div>\n\n ${orgRows ? `<div class=\"s-card\">\n <div class=\"section-heading\">Organization access</div>\n ${orgRows}\n <p class=\"info-text\">Applications act on your behalf. Organizations control which apps may access their private data.</p>\n </div>` : \"\"}`;\n\n return c.html(renderSettingsPage(appName, sidebarHtml, bodyHtml, SERVICE_LABEL));\n });\n\n // ---------- Settings: revoke ----------\n\n app.post(\"/settings/connections/applications/:client_id/revoke\", (c) => {\n const sessionUser = resolveSessionUser(c);\n if (!sessionUser) {\n return c.html(renderErrorPage(\"Unauthorized\", \"You must be authenticated to perform this action.\", SERVICE_LABEL), 401);\n }\n\n const clientId = c.req.param(\"client_id\");\n\n const grant = gh.oauthGrants.all().find(\n (g) => g.user_id === sessionUser.id && g.client_id === clientId\n );\n if (grant) {\n gh.oauthGrants.delete(grant.id);\n }\n\n if (tokenMap) {\n for (const [token, tokenUser] of tokenMap.entries()) {\n if (tokenUser.login === sessionUser.login && getTokenToClientId(store).get(token) === clientId) {\n tokenMap.delete(token);\n getTokenToClientId(store).delete(token);\n }\n }\n }\n\n return c.redirect(\"/settings/applications\", 302);\n });\n}\n","import { randomBytes } from \"crypto\";\nimport type { RouteContext, AuthApp } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport { generateNodeId } from \"../helpers.js\";\n\nexport function appsRoutes({ app, store, baseUrl, tokenMap }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n function requireApp(c: any): AuthApp | null {\n const authApp = c.get(\"authApp\") as AuthApp | undefined;\n if (!authApp) {\n c.status(401);\n return null;\n }\n return authApp;\n }\n\n app.get(\"/app\", (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json({\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n }, 401);\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === authApp.appId);\n if (!ghApp) {\n return c.json({ message: \"Not Found\" }, 404);\n }\n\n const installations = gh.appInstallations.findBy(\"app_id\", ghApp.app_id);\n\n return c.json({\n id: ghApp.app_id,\n slug: ghApp.slug,\n node_id: generateNodeId(\"App\", ghApp.app_id),\n name: ghApp.name,\n description: ghApp.description,\n external_url: `${baseUrl}/apps/${ghApp.slug}`,\n html_url: `${baseUrl}/apps/${ghApp.slug}`,\n created_at: ghApp.created_at,\n updated_at: ghApp.updated_at,\n permissions: ghApp.permissions,\n events: ghApp.events,\n installations_count: installations.length,\n owner: null,\n });\n });\n\n app.get(\"/app/installations\", (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json({\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n }, 401);\n }\n\n const installations = gh.appInstallations.findBy(\"app_id\", authApp.appId);\n const ghApp = gh.apps.all().find((a) => a.app_id === authApp.appId);\n\n return c.json(\n installations.map((inst) => formatInstallation(inst, ghApp, baseUrl))\n );\n });\n\n app.get(\"/app/installations/:installation_id\", (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json({\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n }, 401);\n }\n\n const installationId = parseInt(c.req.param(\"installation_id\"), 10);\n const inst = gh.appInstallations.all().find(\n (i) => i.installation_id === installationId && i.app_id === authApp.appId\n );\n\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === authApp.appId);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n });\n\n app.post(\"/app/installations/:installation_id/access_tokens\", async (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json({\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n }, 401);\n }\n\n const installationId = parseInt(c.req.param(\"installation_id\"), 10);\n const inst = gh.appInstallations.all().find(\n (i) => i.installation_id === installationId && i.app_id === authApp.appId\n );\n\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n let requestedPermissions = inst.permissions;\n let requestedRepoIds = inst.repository_ids;\n\n try {\n const body = await c.req.json() as Record<string, unknown>;\n if (body.permissions && typeof body.permissions === \"object\") {\n requestedPermissions = body.permissions as Record<string, string>;\n }\n if (Array.isArray(body.repository_ids)) {\n requestedRepoIds = (body.repository_ids as number[]).filter(\n (id) => inst.repository_selection === \"all\" || inst.repository_ids.includes(id)\n );\n }\n } catch {\n // No body or invalid JSON, use installation defaults\n }\n\n const token = \"ghs_\" + randomBytes(20).toString(\"base64url\");\n const expiresAt = new Date(Date.now() + 60 * 60 * 1000).toISOString();\n\n if (tokenMap) {\n tokenMap.set(token, {\n login: inst.account_login,\n id: inst.account_id,\n scopes: Object.entries(requestedPermissions).map(([k, v]) => `${k}:${v}`),\n });\n }\n\n const repos = requestedRepoIds\n .map((id) => gh.repos.get(id))\n .filter(Boolean)\n .map((r) => ({\n id: r!.id,\n node_id: r!.node_id,\n name: r!.name,\n full_name: r!.full_name,\n private: r!.private,\n }));\n\n return c.json({\n token,\n expires_at: expiresAt,\n permissions: requestedPermissions,\n repository_selection: inst.repository_selection,\n ...(inst.repository_selection === \"selected\" ? { repositories: repos } : {}),\n }, 201);\n });\n\n app.get(\"/repos/:owner/:repo/installation\", (c) => {\n const owner = c.req.param(\"owner\");\n const repoName = c.req.param(\"repo\");\n const fullName = `${owner}/${repoName}`;\n const repo = gh.repos.findOneBy(\"full_name\", fullName);\n if (!repo) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ownerEntity = gh.users.findOneBy(\"login\", owner)\n ?? gh.orgs.findOneBy(\"login\", owner);\n\n for (const inst of gh.appInstallations.all()) {\n if (inst.repository_selection === \"all\" && ownerEntity && inst.account_id === ownerEntity.id) {\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n }\n if (inst.repository_selection === \"selected\" && inst.repository_ids.includes(repo.id)) {\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n }\n }\n\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n });\n\n app.get(\"/orgs/:org/installation\", (c) => {\n const orgLogin = c.req.param(\"org\");\n const org = gh.orgs.findOneBy(\"login\", orgLogin);\n if (!org) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const inst = gh.appInstallations.all().find(\n (i) => i.account_id === org.id && i.account_type === \"Organization\"\n );\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n });\n\n app.get(\"/users/:username/installation\", (c) => {\n const username = c.req.param(\"username\");\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const inst = gh.appInstallations.all().find(\n (i) => i.account_id === user.id && i.account_type === \"User\"\n );\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n });\n\n function formatInstallation(inst: any, ghApp: any, baseUrl: string) {\n const account = inst.account_type === \"Organization\"\n ? gh.orgs.get(inst.account_id)\n : gh.users.get(inst.account_id);\n\n return {\n id: inst.installation_id,\n account: account ? {\n login: account.login,\n id: account.id,\n node_id: account.node_id,\n type: inst.account_type,\n avatar_url: `${baseUrl}/avatars/u/${account.login}`,\n url: `${baseUrl}/${inst.account_type === \"Organization\" ? \"orgs\" : \"users\"}/${account.login}`,\n } : null,\n repository_selection: inst.repository_selection,\n access_tokens_url: `${baseUrl}/app/installations/${inst.installation_id}/access_tokens`,\n repositories_url: `${baseUrl}/installation/repositories`,\n html_url: `${baseUrl}/settings/installations/${inst.installation_id}`,\n app_id: inst.app_id,\n app_slug: ghApp?.slug ?? null,\n target_type: inst.account_type,\n permissions: inst.permissions,\n events: inst.events,\n created_at: inst.created_at,\n updated_at: inst.updated_at,\n single_file_name: null,\n has_multiple_single_files: false,\n single_file_paths: [],\n suspended_by: null,\n suspended_at: inst.suspended_at,\n };\n }\n}\n"],"mappings":"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","names":["ownerLogin","ownerLogin","c","ownerLogin","adjustRepoOpenIssues","head","ownerLogin","lookupUserByLogin","findPull","ownerLogin","findPull","adjustPrReviewCommentCount","sortComments","parseCommentSort","ownerLogin","findIssueByNumber","insertIssueEvent","getOrCreateLabel","cmp","ownerLogin","m","r","blob","repoUrl","saved","notFound","ownerLogin","ownerLogin","teamsForOrg","listOrgMembersDeduped","orgRoleForUser","getOrgByLogin","ownerLogin","s","listOrgMembersDeduped","orgRoleForUser","assertOrgAdmin","getOrgByLogin","ownerLogin","findCommitInRepo","ownerLogin","randomBytes","randomBytes","oauthApp","randomBytes","randomBytes","baseUrl","ownerLogin"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/store.ts","../src/helpers.ts","../../core/src/store.ts","../../core/src/server.ts","../../core/src/webhooks.ts","../../core/src/middleware/error-handler.ts","../../core/src/middleware/auth.ts","../../core/src/debug.ts","../../core/src/fonts.ts","../../core/src/middleware/pagination.ts","../../core/src/ui.ts","../../core/src/oauth-helpers.ts","../../core/src/persistence.ts","../src/route-helpers.ts","../src/routes/users.ts","../src/routes/repos.ts","../src/routes/issues.ts","../src/routes/pulls.ts","../src/routes/comments.ts","../src/routes/reviews.ts","../src/routes/labels.ts","../src/routes/branches.ts","../src/routes/orgs.ts","../src/routes/releases.ts","../src/routes/webhooks.ts","../src/routes/search.ts","../src/routes/actions.ts","../src/routes/checks.ts","../src/routes/rate-limit.ts","../src/routes/meta.ts","../src/routes/oauth.ts","../src/routes/apps.ts"],"sourcesContent":["import { createHmac } from \"crypto\";\nimport type { Hono } from \"hono\";\nimport type { ServicePlugin, Store, WebhookDispatcher, TokenMap, AppEnv, RouteContext } from \"@emulators/core\";\nimport { getGitHubStore } from \"./store.js\";\nimport type { GitHubStore } from \"./store.js\";\nimport type { GitHubAppInstallation } from \"./entities.js\";\nimport { generateNodeId, generateSha } from \"./helpers.js\";\nimport { usersRoutes } from \"./routes/users.js\";\nimport { reposRoutes } from \"./routes/repos.js\";\nimport { issuesRoutes } from \"./routes/issues.js\";\nimport { pullsRoutes } from \"./routes/pulls.js\";\nimport { commentsRoutes } from \"./routes/comments.js\";\nimport { reviewsRoutes } from \"./routes/reviews.js\";\nimport { labelsAndMilestonesRoutes } from \"./routes/labels.js\";\nimport { branchesAndGitRoutes } from \"./routes/branches.js\";\nimport { orgsAndTeamsRoutes } from \"./routes/orgs.js\";\nimport { releasesRoutes } from \"./routes/releases.js\";\nimport { webhooksRoutes } from \"./routes/webhooks.js\";\nimport { searchRoutes } from \"./routes/search.js\";\nimport { actionsRoutes } from \"./routes/actions.js\";\nimport { checksRoutes } from \"./routes/checks.js\";\nimport { rateLimitRoutes } from \"./routes/rate-limit.js\";\nimport { metaRoutes } from \"./routes/meta.js\";\nimport { oauthRoutes } from \"./routes/oauth.js\";\nimport { appsRoutes } from \"./routes/apps.js\";\n\nexport { getGitHubStore, type GitHubStore } from \"./store.js\";\nexport * from \"./entities.js\";\n\nexport interface GitHubSeedConfig {\n port?: number;\n users?: Array<{\n login: string;\n name?: string;\n email?: string;\n bio?: string;\n company?: string;\n location?: string;\n blog?: string;\n twitter_username?: string;\n site_admin?: boolean;\n }>;\n orgs?: Array<{\n login: string;\n name?: string;\n description?: string;\n email?: string;\n }>;\n tokens?: Record<string, { login: string; scopes?: string[] }>;\n repos?: Array<{\n owner: string;\n name: string;\n description?: string;\n private?: boolean;\n language?: string;\n topics?: string[];\n default_branch?: string;\n auto_init?: boolean;\n }>;\n oauth_apps?: Array<{\n client_id: string;\n client_secret: string;\n name: string;\n redirect_uris: string[];\n }>;\n apps?: Array<{\n app_id: number;\n slug: string;\n name: string;\n private_key: string;\n permissions?: Record<string, string>;\n events?: string[];\n webhook_url?: string;\n webhook_secret?: string;\n description?: string;\n installations?: Array<{\n installation_id: number;\n account: string;\n repository_selection?: \"all\" | \"selected\";\n repositories?: string[];\n permissions?: Record<string, string>;\n events?: string[];\n }>;\n }>;\n}\n\nfunction seedDefaults(store: Store, baseUrl: string): void {\n const gh = getGitHubStore(store);\n\n const ghost = gh.users.insert({\n login: \"ghost\",\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/ghost`,\n gravatar_id: \"\",\n type: \"User\",\n site_admin: false,\n name: \"Ghost\",\n company: null,\n blog: \"\",\n location: null,\n email: null,\n hireable: null,\n bio: null,\n twitter_username: null,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n });\n gh.users.update(ghost.id, { node_id: generateNodeId(\"User\", ghost.id) });\n\n const admin = gh.users.insert({\n login: \"admin\",\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/admin`,\n gravatar_id: \"\",\n type: \"User\",\n site_admin: true,\n name: \"Admin\",\n company: null,\n blog: \"\",\n location: null,\n email: \"admin@localhost\",\n hireable: null,\n bio: \"Default admin user\",\n twitter_username: null,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n });\n gh.users.update(admin.id, { node_id: generateNodeId(\"User\", admin.id) });\n}\n\nexport function seedFromConfig(store: Store, baseUrl: string, config: GitHubSeedConfig): void {\n const gh = getGitHubStore(store);\n\n if (config.users) {\n for (const u of config.users) {\n const existing = gh.users.findOneBy(\"login\", u.login);\n if (existing) continue;\n const user = gh.users.insert({\n login: u.login,\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/${u.login}`,\n gravatar_id: \"\",\n type: \"User\",\n site_admin: u.site_admin ?? false,\n name: u.name ?? null,\n company: u.company ?? null,\n blog: u.blog ?? \"\",\n location: u.location ?? null,\n email: u.email ?? null,\n hireable: null,\n bio: u.bio ?? null,\n twitter_username: u.twitter_username ?? null,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n });\n gh.users.update(user.id, { node_id: generateNodeId(\"User\", user.id) });\n }\n }\n\n if (config.orgs) {\n for (const o of config.orgs) {\n const existing = gh.orgs.findOneBy(\"login\", o.login);\n if (existing) continue;\n const org = gh.orgs.insert({\n login: o.login,\n node_id: \"\",\n description: o.description ?? null,\n name: o.name ?? null,\n company: null,\n blog: \"\",\n location: null,\n email: o.email ?? null,\n twitter_username: null,\n is_verified: false,\n has_organization_projects: true,\n has_repository_projects: true,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n members_can_create_repositories: true,\n default_repository_permission: \"read\",\n billing_email: null,\n });\n gh.orgs.update(org.id, { node_id: generateNodeId(\"Org\", org.id) });\n }\n }\n\n if (config.repos) {\n for (const r of config.repos) {\n const ownerUser = gh.users.findOneBy(\"login\", r.owner);\n const owner = ownerUser ?? gh.orgs.findOneBy(\"login\", r.owner);\n if (!owner) continue;\n\n const fullName = `${r.owner}/${r.name}`;\n const existing = gh.repos.findOneBy(\"full_name\", fullName);\n if (existing) continue;\n\n const ownerType = ownerUser ? \"User\" : \"Organization\";\n const defaultBranch = r.default_branch ?? \"main\";\n\n const repo = gh.repos.insert({\n node_id: \"\",\n name: r.name,\n full_name: fullName,\n owner_id: owner.id,\n owner_type: ownerType,\n private: r.private ?? false,\n description: r.description ?? null,\n fork: false,\n forked_from_id: null,\n homepage: null,\n language: r.language ?? null,\n languages: r.language ? { [r.language]: 10000 } : {},\n forks_count: 0,\n stargazers_count: 0,\n watchers_count: 0,\n size: 0,\n default_branch: defaultBranch,\n open_issues_count: 0,\n topics: r.topics ?? [],\n has_issues: true,\n has_projects: true,\n has_wiki: true,\n has_pages: false,\n has_downloads: true,\n has_discussions: false,\n archived: false,\n disabled: false,\n visibility: r.private ? \"private\" : \"public\",\n pushed_at: null,\n allow_rebase_merge: true,\n allow_squash_merge: true,\n allow_merge_commit: true,\n allow_auto_merge: false,\n delete_branch_on_merge: false,\n allow_forking: true,\n is_template: false,\n license: null,\n });\n gh.repos.update(repo.id, { node_id: generateNodeId(\"Repository\", repo.id) });\n\n if (r.auto_init !== false) {\n const sha = generateSha();\n const treeSha = generateSha();\n\n const commit = gh.commits.insert({\n repo_id: repo.id,\n sha,\n node_id: \"\",\n message: \"Initial commit\",\n author_name: r.owner,\n author_email: `${r.owner}@localhost`,\n author_date: repo.created_at,\n committer_name: r.owner,\n committer_email: `${r.owner}@localhost`,\n committer_date: repo.created_at,\n tree_sha: treeSha,\n parent_shas: [],\n user_id: owner.id,\n });\n gh.commits.update(commit.id, { node_id: generateNodeId(\"Commit\", commit.id) });\n\n const tree = gh.trees.insert({\n repo_id: repo.id,\n sha: treeSha,\n node_id: \"\",\n tree: [{ path: \"README.md\", mode: \"100644\", type: \"blob\", sha: generateSha(), size: 20 }],\n truncated: false,\n });\n gh.trees.update(tree.id, { node_id: generateNodeId(\"Tree\", tree.id) });\n\n gh.branches.insert({\n repo_id: repo.id,\n name: defaultBranch,\n sha,\n protected: false,\n });\n\n const refRow = gh.refs.insert({\n repo_id: repo.id,\n ref: `refs/heads/${defaultBranch}`,\n sha,\n node_id: \"\",\n });\n gh.refs.update(refRow.id, { node_id: generateNodeId(\"Ref\", refRow.id) });\n\n gh.repos.update(repo.id, { pushed_at: repo.created_at, size: 1 });\n }\n\n if (ownerType === \"User\") {\n const user = gh.users.findOneBy(\"login\", r.owner);\n if (user && !r.private) {\n gh.users.update(user.id, { public_repos: user.public_repos + 1 });\n }\n } else {\n const org = gh.orgs.findOneBy(\"login\", r.owner);\n if (org && !r.private) {\n gh.orgs.update(org.id, { public_repos: org.public_repos + 1 });\n }\n }\n }\n }\n\n if (config.oauth_apps) {\n for (const oa of config.oauth_apps) {\n const existing = gh.oauthApps.findOneBy(\"client_id\", oa.client_id);\n if (existing) continue;\n gh.oauthApps.insert({\n client_id: oa.client_id,\n client_secret: oa.client_secret,\n name: oa.name,\n redirect_uris: oa.redirect_uris,\n });\n }\n }\n\n if (config.apps) {\n for (const a of config.apps) {\n const existingApp = gh.apps.findOneBy(\"slug\", a.slug);\n if (existingApp) continue;\n\n gh.apps.insert({\n app_id: a.app_id,\n slug: a.slug,\n name: a.name,\n private_key: a.private_key,\n permissions: a.permissions ?? {},\n events: a.events ?? [],\n webhook_url: a.webhook_url ?? null,\n webhook_secret: a.webhook_secret ?? null,\n description: a.description ?? null,\n });\n\n if (a.installations) {\n for (const inst of a.installations) {\n const account = gh.users.findOneBy(\"login\", inst.account) ?? gh.orgs.findOneBy(\"login\", inst.account);\n if (!account) continue;\n\n const accountType = gh.users.findOneBy(\"login\", inst.account) ? (\"User\" as const) : (\"Organization\" as const);\n\n const repoIds: number[] = [];\n if (inst.repositories) {\n for (const repoFullName of inst.repositories) {\n const fullName = repoFullName.includes(\"/\") ? repoFullName : `${inst.account}/${repoFullName}`;\n const repo = gh.repos.findOneBy(\"full_name\", fullName);\n if (repo) repoIds.push(repo.id);\n }\n }\n\n gh.appInstallations.insert({\n installation_id: inst.installation_id,\n app_id: a.app_id,\n account_type: accountType,\n account_id: account.id,\n account_login: inst.account,\n repository_selection: inst.repository_selection ?? \"all\",\n repository_ids: repoIds,\n permissions: inst.permissions ?? a.permissions ?? {},\n events: inst.events ?? a.events ?? [],\n suspended_at: null,\n });\n }\n }\n }\n }\n}\n\nfunction findInstallationsForRepo(\n gh: GitHubStore,\n ownerLogin: string,\n repoName: string | undefined,\n event: string,\n): GitHubAppInstallation[] {\n const ownerEntity = gh.users.findOneBy(\"login\", ownerLogin) ?? gh.orgs.findOneBy(\"login\", ownerLogin);\n if (!ownerEntity) return [];\n\n const repoEntity = repoName ? gh.repos.findOneBy(\"full_name\", `${ownerLogin}/${repoName}`) : null;\n\n const results: GitHubAppInstallation[] = [];\n for (const inst of gh.appInstallations.all()) {\n if (inst.account_id !== ownerEntity.id) continue;\n if (inst.suspended_at) continue;\n\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n if (!ghApp) continue;\n if (!ghApp.events.includes(event) && !ghApp.events.includes(\"*\")) continue;\n\n if (repoEntity && inst.repository_selection === \"selected\") {\n if (!inst.repository_ids.includes(repoEntity.id)) continue;\n }\n\n results.push(inst);\n }\n return results;\n}\n\nfunction enrichPayloadWithInstallation(payload: unknown, installation: GitHubAppInstallation): unknown {\n if (!payload || typeof payload !== \"object\") return payload;\n return {\n ...(payload as Record<string, unknown>),\n installation: {\n id: installation.installation_id,\n node_id: generateNodeId(\"Installation\", installation.installation_id),\n },\n };\n}\n\nasync function deliverToAppWebhookUrls(\n gh: GitHubStore,\n event: string,\n action: string | undefined,\n payload: unknown,\n ownerLogin: string,\n repoName: string | undefined,\n): Promise<void> {\n const installations = findInstallationsForRepo(gh, ownerLogin, repoName, event);\n\n for (const inst of installations) {\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n if (!ghApp?.webhook_url) continue;\n\n const enriched = enrichPayloadWithInstallation(payload, inst);\n const body = JSON.stringify(enriched);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Event\": event,\n \"X-GitHub-Delivery\": String(Date.now()),\n };\n if (ghApp.webhook_secret) {\n const hmac = createHmac(\"sha256\", ghApp.webhook_secret).update(body).digest(\"hex\");\n headers[\"X-Hub-Signature-256\"] = `sha256=${hmac}`;\n }\n\n try {\n await fetch(ghApp.webhook_url, {\n method: \"POST\",\n headers,\n body,\n signal: AbortSignal.timeout(10000),\n });\n } catch {\n // Best-effort delivery\n }\n }\n}\n\nexport const githubPlugin: ServicePlugin = {\n name: \"github\",\n register(app: Hono<AppEnv>, store: Store, webhooks: WebhookDispatcher, baseUrl: string, tokenMap?: TokenMap): void {\n const gh = getGitHubStore(store);\n\n const originalDispatch = webhooks.dispatch.bind(webhooks);\n webhooks.dispatch = async (\n event: string,\n action: string | undefined,\n payload: unknown,\n owner: string,\n repo?: string,\n ): Promise<void> => {\n const installations = findInstallationsForRepo(gh, owner, repo, event);\n\n const enrichedPayload =\n installations.length > 0 ? enrichPayloadWithInstallation(payload, installations[0]) : payload;\n\n await originalDispatch(event, action, enrichedPayload, owner, repo);\n await deliverToAppWebhookUrls(gh, event, action, payload, owner, repo);\n };\n\n const ctx: RouteContext = { app, store, webhooks, baseUrl, tokenMap };\n usersRoutes(ctx);\n reposRoutes(ctx);\n issuesRoutes(ctx);\n pullsRoutes(ctx);\n commentsRoutes(ctx);\n reviewsRoutes(ctx);\n labelsAndMilestonesRoutes(ctx);\n branchesAndGitRoutes(ctx);\n orgsAndTeamsRoutes(ctx);\n releasesRoutes(ctx);\n webhooksRoutes(ctx);\n searchRoutes(ctx);\n actionsRoutes(ctx);\n checksRoutes(ctx);\n rateLimitRoutes(ctx);\n metaRoutes(ctx);\n oauthRoutes(ctx);\n appsRoutes(ctx);\n },\n seed(store: Store, baseUrl: string): void {\n seedDefaults(store, baseUrl);\n },\n};\n\nexport default githubPlugin;\n","import { Store, type Collection } from \"@emulators/core\";\nimport type {\n GitHubUser,\n GitHubOrg,\n GitHubTeam,\n GitHubTeamMember,\n GitHubTeamRepo,\n GitHubRepo,\n GitHubCollaborator,\n GitHubIssue,\n GitHubPullRequest,\n GitHubLabel,\n GitHubMilestone,\n GitHubComment,\n GitHubReview,\n GitHubIssueEvent,\n GitHubBranch,\n GitHubBranchProtection,\n GitHubRef,\n GitHubCommit,\n GitHubTree,\n GitHubBlob,\n GitHubTag,\n GitHubRelease,\n GitHubReleaseAsset,\n GitHubWebhook,\n GitHubWorkflow,\n GitHubWorkflowRun,\n GitHubJob,\n GitHubArtifact,\n GitHubSecret,\n GitHubCheckRun,\n GitHubCheckSuite,\n GitHubOAuthApp,\n GitHubApp,\n GitHubAppInstallation,\n GitHubOAuthGrant,\n} from \"./entities.js\";\n\nexport interface GitHubStore {\n users: Collection<GitHubUser>;\n orgs: Collection<GitHubOrg>;\n teams: Collection<GitHubTeam>;\n teamMembers: Collection<GitHubTeamMember>;\n teamRepos: Collection<GitHubTeamRepo>;\n repos: Collection<GitHubRepo>;\n collaborators: Collection<GitHubCollaborator>;\n issues: Collection<GitHubIssue>;\n pullRequests: Collection<GitHubPullRequest>;\n labels: Collection<GitHubLabel>;\n milestones: Collection<GitHubMilestone>;\n comments: Collection<GitHubComment>;\n reviews: Collection<GitHubReview>;\n issueEvents: Collection<GitHubIssueEvent>;\n branches: Collection<GitHubBranch>;\n branchProtections: Collection<GitHubBranchProtection>;\n refs: Collection<GitHubRef>;\n commits: Collection<GitHubCommit>;\n trees: Collection<GitHubTree>;\n blobs: Collection<GitHubBlob>;\n tags: Collection<GitHubTag>;\n releases: Collection<GitHubRelease>;\n releaseAssets: Collection<GitHubReleaseAsset>;\n webhooks: Collection<GitHubWebhook>;\n workflows: Collection<GitHubWorkflow>;\n workflowRuns: Collection<GitHubWorkflowRun>;\n jobs: Collection<GitHubJob>;\n artifacts: Collection<GitHubArtifact>;\n secrets: Collection<GitHubSecret>;\n checkRuns: Collection<GitHubCheckRun>;\n checkSuites: Collection<GitHubCheckSuite>;\n oauthApps: Collection<GitHubOAuthApp>;\n apps: Collection<GitHubApp>;\n appInstallations: Collection<GitHubAppInstallation>;\n oauthGrants: Collection<GitHubOAuthGrant>;\n}\n\nexport function getGitHubStore(store: Store): GitHubStore {\n return {\n users: store.collection<GitHubUser>(\"github.users\", [\"login\"]),\n orgs: store.collection<GitHubOrg>(\"github.orgs\", [\"login\"]),\n teams: store.collection<GitHubTeam>(\"github.teams\", [\"org_id\", \"slug\"]),\n teamMembers: store.collection<GitHubTeamMember>(\"github.team_members\", [\"team_id\", \"user_id\"]),\n teamRepos: store.collection<GitHubTeamRepo>(\"github.team_repos\", [\"team_id\", \"repo_id\"]),\n repos: store.collection<GitHubRepo>(\"github.repos\", [\"owner_id\", \"full_name\"]),\n collaborators: store.collection<GitHubCollaborator>(\"github.collaborators\", [\"repo_id\", \"user_id\"]),\n issues: store.collection<GitHubIssue>(\"github.issues\", [\"repo_id\", \"number\"]),\n pullRequests: store.collection<GitHubPullRequest>(\"github.pull_requests\", [\"repo_id\", \"number\"]),\n labels: store.collection<GitHubLabel>(\"github.labels\", [\"repo_id\"]),\n milestones: store.collection<GitHubMilestone>(\"github.milestones\", [\"repo_id\", \"number\"]),\n comments: store.collection<GitHubComment>(\"github.comments\", [\"repo_id\"]),\n reviews: store.collection<GitHubReview>(\"github.reviews\", [\"repo_id\", \"pull_number\"]),\n issueEvents: store.collection<GitHubIssueEvent>(\"github.issue_events\", [\"repo_id\", \"issue_number\"]),\n branches: store.collection<GitHubBranch>(\"github.branches\", [\"repo_id\"]),\n branchProtections: store.collection<GitHubBranchProtection>(\"github.branch_protections\", [\"repo_id\"]),\n refs: store.collection<GitHubRef>(\"github.refs\", [\"repo_id\"]),\n commits: store.collection<GitHubCommit>(\"github.commits\", [\"repo_id\", \"sha\"]),\n trees: store.collection<GitHubTree>(\"github.trees\", [\"repo_id\", \"sha\"]),\n blobs: store.collection<GitHubBlob>(\"github.blobs\", [\"repo_id\", \"sha\"]),\n tags: store.collection<GitHubTag>(\"github.tags\", [\"repo_id\"]),\n releases: store.collection<GitHubRelease>(\"github.releases\", [\"repo_id\"]),\n releaseAssets: store.collection<GitHubReleaseAsset>(\"github.release_assets\", [\"release_id\", \"repo_id\"]),\n webhooks: store.collection<GitHubWebhook>(\"github.webhooks\", [\"repo_id\", \"org_id\"]),\n workflows: store.collection<GitHubWorkflow>(\"github.workflows\", [\"repo_id\"]),\n workflowRuns: store.collection<GitHubWorkflowRun>(\"github.workflow_runs\", [\"repo_id\", \"workflow_id\"]),\n jobs: store.collection<GitHubJob>(\"github.jobs\", [\"run_id\"]),\n artifacts: store.collection<GitHubArtifact>(\"github.artifacts\", [\"run_id\", \"repo_id\"]),\n secrets: store.collection<GitHubSecret>(\"github.secrets\", [\"repo_id\", \"org_id\"]),\n checkRuns: store.collection<GitHubCheckRun>(\"github.check_runs\", [\"repo_id\", \"head_sha\"]),\n checkSuites: store.collection<GitHubCheckSuite>(\"github.check_suites\", [\"repo_id\", \"head_sha\"]),\n oauthApps: store.collection<GitHubOAuthApp>(\"github.oauth_apps\", [\"client_id\"]),\n apps: store.collection<GitHubApp>(\"github.apps\", [\"slug\"]),\n appInstallations: store.collection<GitHubAppInstallation>(\"github.app_installations\", [\n \"app_id\",\n \"installation_id\",\n ]),\n oauthGrants: store.collection<GitHubOAuthGrant>(\"github.oauth_grants\", [\"user_id\", \"client_id\"]),\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type {\n GitHubUser,\n GitHubOrg,\n GitHubRepo,\n GitHubIssue,\n GitHubPullRequest,\n GitHubLabel,\n GitHubMilestone,\n GitHubComment,\n GitHubRelease,\n GitHubTeam,\n GitHubBranch,\n GitHubCommit,\n GitHubCheckRun,\n GitHubCheckSuite,\n GitHubReview,\n GitHubWorkflow,\n GitHubWorkflowRun,\n GitHubJob,\n GitHubArtifact,\n GitHubReleaseAsset,\n GitHubWebhook,\n GitHubRef,\n GitHubTag,\n GitHubBlob,\n GitHubTree,\n} from \"./entities.js\";\nimport type { GitHubStore } from \"./store.js\";\n\nexport function generateNodeId(type: string, id: number): string {\n return Buffer.from(`0:${type}${id}`).toString(\"base64\").replace(/=+$/, \"\");\n}\n\nexport function generateSha(): string {\n return randomBytes(20).toString(\"hex\");\n}\n\nexport function timestamp(): string {\n return new Date().toISOString();\n}\n\nexport function userUrl(baseUrl: string, login: string) {\n return {\n url: `${baseUrl}/users/${login}`,\n html_url: `${baseUrl}/${login}`,\n repos_url: `${baseUrl}/users/${login}/repos`,\n followers_url: `${baseUrl}/users/${login}/followers`,\n following_url: `${baseUrl}/users/${login}/following{/other_user}`,\n gists_url: `${baseUrl}/users/${login}/gists{/gist_id}`,\n starred_url: `${baseUrl}/users/${login}/starred{/owner}{/repo}`,\n subscriptions_url: `${baseUrl}/users/${login}/subscriptions`,\n organizations_url: `${baseUrl}/users/${login}/orgs`,\n events_url: `${baseUrl}/users/${login}/events{/privacy}`,\n received_events_url: `${baseUrl}/users/${login}/received_events`,\n avatar_url: `${baseUrl}/avatars/u/${login}`,\n };\n}\n\nexport function formatUser(user: GitHubUser, baseUrl: string) {\n const urls = userUrl(baseUrl, user.login);\n return {\n login: user.login,\n id: user.id,\n node_id: user.node_id,\n avatar_url: urls.avatar_url,\n gravatar_id: user.gravatar_id,\n url: urls.url,\n html_url: urls.html_url,\n followers_url: urls.followers_url,\n following_url: urls.following_url,\n gists_url: urls.gists_url,\n starred_url: urls.starred_url,\n subscriptions_url: urls.subscriptions_url,\n organizations_url: urls.organizations_url,\n repos_url: urls.repos_url,\n events_url: urls.events_url,\n received_events_url: urls.received_events_url,\n type: user.type,\n site_admin: user.site_admin,\n user_view_type: \"public\",\n };\n}\n\nexport function formatUserFull(user: GitHubUser, baseUrl: string) {\n return {\n ...formatUser(user, baseUrl),\n name: user.name,\n company: user.company,\n blog: user.blog,\n location: user.location,\n email: user.email,\n hireable: user.hireable,\n bio: user.bio,\n twitter_username: user.twitter_username,\n public_repos: user.public_repos,\n public_gists: user.public_gists,\n followers: user.followers,\n following: user.following,\n created_at: user.created_at,\n updated_at: user.updated_at,\n };\n}\n\nexport function formatOwner(store: GitHubStore, ownerId: number, ownerType: string, baseUrl: string) {\n if (ownerType === \"Organization\") {\n const org = store.orgs.get(ownerId);\n if (!org) return null;\n return formatOrgBrief(org, baseUrl);\n }\n const user = store.users.get(ownerId);\n if (!user) return null;\n return formatUser(user, baseUrl);\n}\n\nexport function formatOrgBrief(org: GitHubOrg, baseUrl: string) {\n return {\n login: org.login,\n id: org.id,\n node_id: org.node_id,\n url: `${baseUrl}/orgs/${org.login}`,\n html_url: `${baseUrl}/${org.login}`,\n repos_url: `${baseUrl}/orgs/${org.login}/repos`,\n events_url: `${baseUrl}/orgs/${org.login}/events`,\n hooks_url: `${baseUrl}/orgs/${org.login}/hooks`,\n issues_url: `${baseUrl}/orgs/${org.login}/issues`,\n members_url: `${baseUrl}/orgs/${org.login}/members{/member}`,\n public_members_url: `${baseUrl}/orgs/${org.login}/public_members{/member}`,\n avatar_url: `${baseUrl}/avatars/o/${org.login}`,\n description: org.description,\n type: \"Organization\",\n site_admin: false,\n user_view_type: \"public\",\n };\n}\n\nfunction permissionsFromLevel(level: string) {\n const levels = [\"pull\", \"triage\", \"push\", \"maintain\", \"admin\"];\n const idx = levels.indexOf(level);\n return {\n admin: idx >= 4,\n maintain: idx >= 3,\n push: idx >= 2,\n triage: idx >= 1,\n pull: idx >= 0,\n };\n}\n\nfunction computeRepoPermissions(store: GitHubStore, repo: GitHubRepo, authUserId: number) {\n if (repo.owner_type === \"User\" && repo.owner_id === authUserId) {\n return { admin: true, maintain: true, push: true, triage: true, pull: true };\n }\n if (repo.owner_type === \"Organization\") {\n for (const team of store.teams.all()) {\n if (team.org_id !== repo.owner_id) continue;\n const member = store.teamMembers.findBy(\"team_id\", team.id).find((m) => m.user_id === authUserId);\n if (member) {\n return { admin: true, maintain: true, push: true, triage: true, pull: true };\n }\n }\n }\n const collab = store.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === authUserId);\n if (collab) {\n return permissionsFromLevel(collab.permission);\n }\n if (!repo.private) {\n return { admin: false, maintain: false, push: false, triage: false, pull: true };\n }\n return { admin: false, maintain: false, push: false, triage: false, pull: false };\n}\n\nexport function computeAuthorAssociation(store: GitHubStore, userId: number, repoId: number): string {\n const repo = store.repos.get(repoId);\n if (!repo) return \"NONE\";\n\n if (repo.owner_type === \"User\" && repo.owner_id === userId) return \"OWNER\";\n\n if (repo.owner_type === \"Organization\") {\n for (const team of store.teams.all()) {\n if (team.org_id !== repo.owner_id) continue;\n const member = store.teamMembers.findBy(\"team_id\", team.id).find((m) => m.user_id === userId);\n if (member) return \"MEMBER\";\n }\n }\n\n const collab = store.collaborators.findBy(\"repo_id\", repoId).find((c) => c.user_id === userId);\n if (collab) return \"COLLABORATOR\";\n\n return \"NONE\";\n}\n\nexport function formatOrgFull(org: GitHubOrg, baseUrl: string) {\n return {\n ...formatOrgBrief(org, baseUrl),\n name: org.name,\n company: org.company,\n blog: org.blog,\n location: org.location,\n email: org.email,\n twitter_username: org.twitter_username,\n is_verified: org.is_verified,\n has_organization_projects: org.has_organization_projects,\n has_repository_projects: org.has_repository_projects,\n public_repos: org.public_repos,\n public_gists: org.public_gists,\n followers: org.followers,\n following: org.following,\n created_at: org.created_at,\n updated_at: org.updated_at,\n members_can_create_repositories: org.members_can_create_repositories,\n default_repository_permission: org.default_repository_permission,\n billing_email: org.billing_email ?? null,\n };\n}\n\nexport function formatRepo(repo: GitHubRepo, store: GitHubStore, baseUrl: string, authUserId?: number) {\n const owner = formatOwner(store, repo.owner_id, repo.owner_type, baseUrl);\n const ownerLogin = owner?.login ?? \"unknown\";\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const htmlUrl = `${baseUrl}/${repo.full_name}`;\n\n return {\n id: repo.id,\n node_id: repo.node_id,\n name: repo.name,\n full_name: repo.full_name,\n private: repo.private,\n owner,\n html_url: htmlUrl,\n description: repo.description,\n fork: repo.fork,\n url: repoUrl,\n forks_url: `${repoUrl}/forks`,\n keys_url: `${repoUrl}/keys{/key_id}`,\n collaborators_url: `${repoUrl}/collaborators{/collaborator}`,\n teams_url: `${repoUrl}/teams`,\n hooks_url: `${repoUrl}/hooks`,\n issue_events_url: `${repoUrl}/issues/events{/number}`,\n events_url: `${repoUrl}/events`,\n assignees_url: `${repoUrl}/assignees{/user}`,\n branches_url: `${repoUrl}/branches{/branch}`,\n tags_url: `${repoUrl}/tags`,\n blobs_url: `${repoUrl}/git/blobs{/sha}`,\n git_tags_url: `${repoUrl}/git/tags{/sha}`,\n git_refs_url: `${repoUrl}/git/ref{/sha}`,\n trees_url: `${repoUrl}/git/trees{/sha}`,\n statuses_url: `${repoUrl}/statuses/{sha}`,\n languages_url: `${repoUrl}/languages`,\n stargazers_url: `${repoUrl}/stargazers`,\n contributors_url: `${repoUrl}/contributors`,\n subscribers_url: `${repoUrl}/subscribers`,\n subscription_url: `${repoUrl}/subscription`,\n commits_url: `${repoUrl}/commits{/sha}`,\n git_commits_url: `${repoUrl}/git/commits{/sha}`,\n comments_url: `${repoUrl}/comments{/number}`,\n issue_comment_url: `${repoUrl}/issues/comments{/number}`,\n contents_url: `${repoUrl}/contents/{+path}`,\n compare_url: `${repoUrl}/compare/{base}...{head}`,\n merges_url: `${repoUrl}/merges`,\n archive_url: `${repoUrl}/{archive_format}{/ref}`,\n downloads_url: `${repoUrl}/downloads`,\n issues_url: `${repoUrl}/issues{/number}`,\n pulls_url: `${repoUrl}/pulls{/number}`,\n milestones_url: `${repoUrl}/milestones{/number}`,\n notifications_url: `${repoUrl}/notifications{?since,all,participating}`,\n labels_url: `${repoUrl}/labels{/name}`,\n releases_url: `${repoUrl}/releases{/id}`,\n deployments_url: `${repoUrl}/deployments`,\n created_at: repo.created_at,\n updated_at: repo.updated_at,\n pushed_at: repo.pushed_at,\n git_url: `git://${baseUrl.replace(/^https?:\\/\\//, \"\")}/${repo.full_name}.git`,\n ssh_url: `git@${baseUrl.replace(/^https?:\\/\\//, \"\")}:${repo.full_name}.git`,\n clone_url: `${htmlUrl}.git`,\n svn_url: htmlUrl,\n homepage: repo.homepage,\n size: repo.size,\n stargazers_count: repo.stargazers_count,\n watchers_count: repo.watchers_count,\n language: repo.language,\n has_issues: repo.has_issues,\n has_projects: repo.has_projects,\n has_downloads: repo.has_downloads,\n has_wiki: repo.has_wiki,\n has_pages: repo.has_pages,\n has_discussions: repo.has_discussions,\n forks_count: repo.forks_count,\n mirror_url: null,\n archived: repo.archived,\n disabled: repo.disabled,\n open_issues_count: repo.open_issues_count,\n license: repo.license,\n allow_forking: repo.allow_forking,\n is_template: repo.is_template,\n topics: repo.topics,\n visibility: repo.visibility,\n forks: repo.forks_count,\n open_issues: repo.open_issues_count,\n watchers: repo.watchers_count,\n default_branch: repo.default_branch,\n permissions:\n authUserId !== undefined\n ? computeRepoPermissions(store, repo, authUserId)\n : {\n admin: true,\n maintain: true,\n push: true,\n triage: true,\n pull: true,\n },\n allow_rebase_merge: repo.allow_rebase_merge,\n allow_squash_merge: repo.allow_squash_merge,\n allow_merge_commit: repo.allow_merge_commit,\n allow_auto_merge: repo.allow_auto_merge,\n delete_branch_on_merge: repo.delete_branch_on_merge,\n };\n}\n\nexport function formatIssue(issue: GitHubIssue, store: GitHubStore, baseUrl: string) {\n const repo = store.repos.get(issue.repo_id);\n if (!repo) return null;\n const user = store.users.get(issue.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n\n const labels = issue.label_ids\n .map((id) => store.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n\n const assignees = issue.assignee_ids\n .map((id) => store.users.get(id))\n .filter(Boolean)\n .map((u) => formatUser(u!, baseUrl));\n\n const milestone = issue.milestone_id ? store.milestones.get(issue.milestone_id) : null;\n const closedBy = issue.closed_by_id ? store.users.get(issue.closed_by_id) : null;\n\n return {\n url: `${repoUrl}/issues/${issue.number}`,\n repository_url: repoUrl,\n labels_url: `${repoUrl}/issues/${issue.number}/labels{/name}`,\n comments_url: `${repoUrl}/issues/${issue.number}/comments`,\n events_url: `${repoUrl}/issues/${issue.number}/events`,\n html_url: `${baseUrl}/${repo.full_name}/issues/${issue.number}`,\n id: issue.id,\n node_id: issue.node_id,\n number: issue.number,\n title: issue.title,\n user: user ? formatUser(user, baseUrl) : null,\n labels,\n state: issue.state,\n state_reason: issue.state_reason,\n locked: issue.locked,\n active_lock_reason: issue.active_lock_reason,\n assignee: assignees[0] ?? null,\n assignees,\n milestone: milestone ? formatMilestone(milestone, repo, store, baseUrl) : null,\n comments: issue.comments,\n created_at: issue.created_at,\n updated_at: issue.updated_at,\n closed_at: issue.closed_at,\n closed_by: closedBy ? formatUser(closedBy, baseUrl) : null,\n body: issue.body,\n reactions: defaultReactions(`${repoUrl}/issues/${issue.number}`),\n timeline_url: `${repoUrl}/issues/${issue.number}/timeline`,\n performed_via_github_app: null,\n author_association: computeAuthorAssociation(store, issue.user_id, issue.repo_id),\n };\n}\n\nexport function formatPullRequest(pr: GitHubPullRequest, store: GitHubStore, baseUrl: string) {\n const repo = store.repos.get(pr.repo_id);\n if (!repo) return null;\n const user = store.users.get(pr.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const headRepo = store.repos.get(pr.head_repo_id);\n const baseRepo = store.repos.get(pr.base_repo_id);\n\n const labels = pr.label_ids\n .map((id) => store.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n\n const assignees = pr.assignee_ids\n .map((id) => store.users.get(id))\n .filter(Boolean)\n .map((u) => formatUser(u!, baseUrl));\n\n const requestedReviewers = pr.requested_reviewer_ids\n .map((id) => store.users.get(id))\n .filter(Boolean)\n .map((u) => formatUser(u!, baseUrl));\n\n const requestedTeams = pr.requested_team_ids\n .map((id) => store.teams.get(id))\n .filter(Boolean)\n .map((t) => formatTeamBrief(t!, store, baseUrl));\n\n const milestone = pr.milestone_id ? store.milestones.get(pr.milestone_id) : null;\n const mergedBy = pr.merged_by_id ? store.users.get(pr.merged_by_id) : null;\n\n return {\n url: `${repoUrl}/pulls/${pr.number}`,\n id: pr.id,\n node_id: pr.node_id,\n html_url: `${baseUrl}/${repo.full_name}/pull/${pr.number}`,\n diff_url: `${baseUrl}/${repo.full_name}/pull/${pr.number}.diff`,\n patch_url: `${baseUrl}/${repo.full_name}/pull/${pr.number}.patch`,\n issue_url: `${repoUrl}/issues/${pr.number}`,\n number: pr.number,\n state: pr.state,\n locked: pr.locked,\n title: pr.title,\n user: user ? formatUser(user, baseUrl) : null,\n body: pr.body,\n created_at: pr.created_at,\n updated_at: pr.updated_at,\n closed_at: pr.closed_at,\n merged_at: pr.merged_at,\n merge_commit_sha: pr.merge_commit_sha,\n assignee: assignees[0] ?? null,\n assignees,\n requested_reviewers: requestedReviewers,\n requested_teams: requestedTeams,\n labels,\n milestone: milestone ? formatMilestone(milestone, repo, store, baseUrl) : null,\n draft: pr.draft,\n commits_url: `${repoUrl}/pulls/${pr.number}/commits`,\n review_comments_url: `${repoUrl}/pulls/${pr.number}/comments`,\n review_comment_url: `${repoUrl}/pulls/comments{/number}`,\n comments_url: `${repoUrl}/issues/${pr.number}/comments`,\n statuses_url: `${repoUrl}/statuses/${pr.head_sha}`,\n head: {\n label: `${headRepo?.full_name?.split(\"/\")[0] ?? \"unknown\"}:${pr.head_ref}`,\n ref: pr.head_ref,\n sha: pr.head_sha,\n user: headRepo ? formatOwner(store, headRepo.owner_id, headRepo.owner_type, baseUrl) : null,\n repo: headRepo ? formatRepo(headRepo, store, baseUrl) : null,\n },\n base: {\n label: `${baseRepo?.full_name?.split(\"/\")[0] ?? \"unknown\"}:${pr.base_ref}`,\n ref: pr.base_ref,\n sha: pr.base_sha,\n user: baseRepo ? formatOwner(store, baseRepo.owner_id, baseRepo.owner_type, baseUrl) : null,\n repo: baseRepo ? formatRepo(baseRepo, store, baseUrl) : null,\n },\n _links: {\n self: { href: `${repoUrl}/pulls/${pr.number}` },\n html: { href: `${baseUrl}/${repo.full_name}/pull/${pr.number}` },\n issue: { href: `${repoUrl}/issues/${pr.number}` },\n comments: { href: `${repoUrl}/issues/${pr.number}/comments` },\n review_comments: { href: `${repoUrl}/pulls/${pr.number}/comments` },\n review_comment: { href: `${repoUrl}/pulls/comments{/number}` },\n commits: { href: `${repoUrl}/pulls/${pr.number}/commits` },\n statuses: { href: `${repoUrl}/statuses/${pr.head_sha}` },\n },\n author_association: computeAuthorAssociation(store, pr.user_id, pr.repo_id),\n auto_merge: pr.auto_merge,\n merged: pr.merged,\n mergeable: pr.mergeable,\n rebaseable: true,\n mergeable_state: pr.mergeable_state,\n merged_by: mergedBy ? formatUser(mergedBy, baseUrl) : null,\n comments: pr.comments,\n review_comments: pr.review_comments,\n maintainer_can_modify: true,\n commits: pr.commits,\n additions: pr.additions,\n deletions: pr.deletions,\n changed_files: pr.changed_files,\n };\n}\n\nexport function formatLabel(label: GitHubLabel, repo: GitHubRepo, baseUrl: string) {\n return {\n id: label.id,\n node_id: label.node_id,\n url: `${baseUrl}/repos/${repo.full_name}/labels/${encodeURIComponent(label.name)}`,\n name: label.name,\n description: label.description,\n color: label.color,\n default: label.default,\n };\n}\n\nexport function formatMilestone(m: GitHubMilestone, repo: GitHubRepo, store: GitHubStore, baseUrl: string) {\n const creator = store.users.get(m.creator_id);\n return {\n url: `${baseUrl}/repos/${repo.full_name}/milestones/${m.number}`,\n html_url: `${baseUrl}/${repo.full_name}/milestone/${m.number}`,\n labels_url: `${baseUrl}/repos/${repo.full_name}/milestones/${m.number}/labels`,\n id: m.id,\n node_id: m.node_id,\n number: m.number,\n title: m.title,\n description: m.description,\n creator: creator ? formatUser(creator, baseUrl) : null,\n open_issues: m.open_issues,\n closed_issues: m.closed_issues,\n state: m.state,\n created_at: m.created_at,\n updated_at: m.updated_at,\n due_on: m.due_on,\n closed_at: m.closed_at,\n };\n}\n\nexport function formatComment(comment: GitHubComment, store: GitHubStore, baseUrl: string) {\n const repo = store.repos.get(comment.repo_id);\n if (!repo) return null;\n const user = store.users.get(comment.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n\n if (comment.comment_type === \"issue\") {\n return {\n url: `${repoUrl}/issues/comments/${comment.id}`,\n html_url: `${baseUrl}/${repo.full_name}/issues/${comment.issue_number}#issuecomment-${comment.id}`,\n issue_url: `${repoUrl}/issues/${comment.issue_number}`,\n id: comment.id,\n node_id: comment.node_id,\n user: user ? formatUser(user, baseUrl) : null,\n created_at: comment.created_at,\n updated_at: comment.updated_at,\n author_association: computeAuthorAssociation(store, comment.user_id, comment.repo_id),\n body: comment.body,\n reactions: defaultReactions(`${repoUrl}/issues/comments/${comment.id}`),\n performed_via_github_app: null,\n };\n }\n\n if (comment.comment_type === \"review\") {\n return {\n url: `${repoUrl}/pulls/comments/${comment.id}`,\n html_url: `${baseUrl}/${repo.full_name}/pull/${comment.pull_number}#discussion_r${comment.id}`,\n pull_request_url: `${repoUrl}/pulls/${comment.pull_number}`,\n id: comment.id,\n node_id: comment.node_id,\n diff_hunk: \"\",\n path: comment.path ?? \"\",\n position: comment.position,\n original_position: comment.position,\n commit_id: comment.commit_sha ?? \"\",\n original_commit_id: comment.commit_sha ?? \"\",\n in_reply_to_id: comment.in_reply_to_id,\n user: user ? formatUser(user, baseUrl) : null,\n body: comment.body,\n created_at: comment.created_at,\n updated_at: comment.updated_at,\n author_association: computeAuthorAssociation(store, comment.user_id, comment.repo_id),\n reactions: defaultReactions(`${repoUrl}/pulls/comments/${comment.id}`),\n line: comment.line,\n side: comment.side ?? \"RIGHT\",\n subject_type: comment.subject_type ?? \"line\",\n pull_request_review_id: comment.review_id,\n };\n }\n\n return {\n url: `${repoUrl}/comments/${comment.id}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${comment.commit_sha}#commitcomment-${comment.id}`,\n id: comment.id,\n node_id: comment.node_id,\n user: user ? formatUser(user, baseUrl) : null,\n body: comment.body,\n path: comment.path,\n position: comment.position,\n line: comment.line,\n commit_id: comment.commit_sha,\n created_at: comment.created_at,\n updated_at: comment.updated_at,\n author_association: computeAuthorAssociation(store, comment.user_id, comment.repo_id),\n reactions: defaultReactions(`${repoUrl}/comments/${comment.id}`),\n };\n}\n\nexport function formatReview(review: GitHubReview, store: GitHubStore, baseUrl: string) {\n const repo = store.repos.get(review.repo_id);\n if (!repo) return null;\n const user = store.users.get(review.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n\n return {\n id: review.id,\n node_id: review.node_id,\n user: user ? formatUser(user, baseUrl) : null,\n body: review.body ?? \"\",\n state: review.state,\n html_url: `${baseUrl}/${repo.full_name}/pull/${review.pull_number}#pullrequestreview-${review.id}`,\n pull_request_url: `${repoUrl}/pulls/${review.pull_number}`,\n _links: {\n html: { href: `${baseUrl}/${repo.full_name}/pull/${review.pull_number}#pullrequestreview-${review.id}` },\n pull_request: { href: `${repoUrl}/pulls/${review.pull_number}` },\n },\n submitted_at: review.submitted_at,\n commit_id: review.commit_id,\n author_association: computeAuthorAssociation(store, review.user_id, review.repo_id),\n created_at: review.created_at,\n updated_at: review.updated_at,\n };\n}\n\nexport function formatTeamBrief(team: GitHubTeam, store: GitHubStore, baseUrl: string) {\n const org = store.orgs.get(team.org_id);\n return {\n id: team.id,\n node_id: team.node_id,\n url: `${baseUrl}/teams/${team.id}`,\n html_url: `${baseUrl}/orgs/${org?.login}/teams/${team.slug}`,\n name: team.name,\n slug: team.slug,\n description: team.description,\n privacy: team.privacy,\n permission: team.permission,\n members_url: `${baseUrl}/teams/${team.id}/members{/member}`,\n repositories_url: `${baseUrl}/teams/${team.id}/repos`,\n };\n}\n\nexport function formatBranch(branch: GitHubBranch, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n name: branch.name,\n commit: {\n sha: branch.sha,\n url: `${repoUrl}/commits/${branch.sha}`,\n },\n protected: branch.protected,\n protection_url: `${repoUrl}/branches/${branch.name}/protection`,\n };\n}\n\nexport function formatRelease(release: GitHubRelease, store: GitHubStore, baseUrl: string) {\n const repo = store.repos.get(release.repo_id);\n if (!repo) return null;\n const author = store.users.get(release.author_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const assets = store.releaseAssets.findBy(\"release_id\", release.id);\n\n return {\n url: `${repoUrl}/releases/${release.id}`,\n html_url: `${baseUrl}/${repo.full_name}/releases/tag/${release.tag_name}`,\n assets_url: `${repoUrl}/releases/${release.id}/assets`,\n upload_url: `${repoUrl}/releases/${release.id}/assets{?name,label}`,\n tarball_url: `${repoUrl}/tarball/${release.tag_name}`,\n zipball_url: `${repoUrl}/zipball/${release.tag_name}`,\n id: release.id,\n node_id: release.node_id,\n tag_name: release.tag_name,\n target_commitish: release.target_commitish,\n name: release.name,\n draft: release.draft,\n prerelease: release.prerelease,\n created_at: release.created_at,\n published_at: release.published_at,\n author: author ? formatUser(author, baseUrl) : null,\n assets: assets.map((a) => formatReleaseAsset(a, repo, baseUrl)),\n body: release.body,\n };\n}\n\nexport function formatReleaseAsset(asset: GitHubReleaseAsset, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const uploader = null;\n return {\n url: `${repoUrl}/releases/assets/${asset.id}`,\n id: asset.id,\n node_id: asset.node_id,\n name: asset.name,\n label: asset.label,\n uploader,\n content_type: asset.content_type,\n state: asset.state,\n size: asset.size,\n download_count: asset.download_count,\n created_at: asset.created_at,\n updated_at: asset.updated_at,\n browser_download_url: `${baseUrl}/${repo.full_name}/releases/download/${asset.name}`,\n };\n}\n\nexport function formatWebhook(wh: GitHubWebhook, baseUrl: string, ownerPath: string) {\n const pathPrefix = wh.repo_id != null ? `repos/${ownerPath}` : `orgs/${ownerPath}`;\n return {\n type: wh.repo_id ? \"Repository\" : \"Organization\",\n id: wh.id,\n name: wh.name,\n active: wh.active,\n events: wh.events,\n config: {\n content_type: wh.config.content_type,\n insecure_ssl: wh.config.insecure_ssl,\n url: wh.config.url,\n },\n updated_at: wh.updated_at,\n created_at: wh.created_at,\n url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}`,\n test_url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}/tests`,\n ping_url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}/pings`,\n deliveries_url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}/deliveries`,\n last_response: wh.last_response,\n };\n}\n\nfunction defaultReactions(url: string) {\n return {\n url: `${url}/reactions`,\n total_count: 0,\n \"+1\": 0,\n \"-1\": 0,\n laugh: 0,\n hooray: 0,\n confused: 0,\n heart: 0,\n rocket: 0,\n eyes: 0,\n };\n}\n\nexport function lookupRepo(store: GitHubStore, owner: string, repoName: string) {\n const fullName = `${owner}/${repoName}`;\n return store.repos.findOneBy(\"full_name\", fullName);\n}\n\nexport function lookupOwner(store: GitHubStore, login: string) {\n const user = store.users.findOneBy(\"login\", login);\n if (user) return { type: \"User\" as const, id: user.id, login: user.login };\n const org = store.orgs.findOneBy(\"login\", login);\n if (org) return { type: \"Organization\" as const, id: org.id, login: org.login };\n return null;\n}\n\nexport function getNextIssueNumber(store: GitHubStore, repoId: number): number {\n const issues = store.issues.findBy(\"repo_id\", repoId);\n const prs = store.pullRequests.findBy(\"repo_id\", repoId);\n const maxIssue = issues.reduce((max, i) => Math.max(max, i.number), 0);\n const maxPr = prs.reduce((max, p) => Math.max(max, p.number), 0);\n return Math.max(maxIssue, maxPr) + 1;\n}\n\nexport function getNextMilestoneNumber(store: GitHubStore, repoId: number): number {\n const milestones = store.milestones.findBy(\"repo_id\", repoId);\n return milestones.reduce((max, m) => Math.max(max, m.number), 0) + 1;\n}\n","export interface Entity {\n id: number;\n created_at: string;\n updated_at: string;\n}\n\nexport type InsertInput<T extends Entity> = Omit<T, \"id\" | \"created_at\" | \"updated_at\"> & { id?: number };\n\nexport type FilterFn<T> = (item: T) => boolean;\nexport type SortFn<T> = (a: T, b: T) => number;\n\nexport interface QueryOptions<T> {\n filter?: FilterFn<T>;\n sort?: SortFn<T>;\n page?: number;\n per_page?: number;\n}\n\nexport interface PaginatedResult<T> {\n items: T[];\n total_count: number;\n page: number;\n per_page: number;\n has_next: boolean;\n has_prev: boolean;\n}\n\nexport interface CollectionSnapshot<T extends Entity = Entity> {\n items: T[];\n autoId: number;\n indexFields: string[];\n}\n\nexport interface StoreSnapshot {\n collections: Record<string, CollectionSnapshot>;\n data: Record<string, unknown>;\n}\n\nexport function serializeValue(value: unknown): unknown {\n if (value instanceof Map) {\n return { __type: \"Map\" as const, entries: [...value.entries()].map(([k, v]) => [k, serializeValue(v)]) };\n }\n if (value instanceof Set) {\n return { __type: \"Set\" as const, values: [...value.values()] };\n }\n return value;\n}\n\nexport function deserializeValue(value: unknown): unknown {\n if (value !== null && typeof value === \"object\" && \"__type\" in value) {\n const tagged = value as Record<string, unknown>;\n if (tagged.__type === \"Map\") {\n const entries = tagged.entries as [unknown, unknown][];\n return new Map(entries.map(([k, v]) => [k, deserializeValue(v)]));\n }\n if (tagged.__type === \"Set\") {\n return new Set(tagged.values as unknown[]);\n }\n }\n return value;\n}\n\nexport class Collection<T extends Entity> {\n private items = new Map<number, T>();\n private indexes = new Map<string, Map<string | number, Set<number>>>();\n private autoId = 1;\n readonly fieldNames: string[];\n\n constructor(private indexFields: (keyof T)[] = []) {\n this.fieldNames = indexFields.map(String).sort();\n for (const field of indexFields) {\n this.indexes.set(String(field), new Map());\n }\n }\n\n private addToIndex(item: T): void {\n for (const field of this.indexFields) {\n const value = item[field];\n if (value === undefined || value === null) continue;\n const indexMap = this.indexes.get(String(field))!;\n const key = String(value);\n if (!indexMap.has(key)) {\n indexMap.set(key, new Set());\n }\n indexMap.get(key)!.add(item.id);\n }\n }\n\n private removeFromIndex(item: T): void {\n for (const field of this.indexFields) {\n const value = item[field];\n if (value === undefined || value === null) continue;\n const indexMap = this.indexes.get(String(field))!;\n const key = String(value);\n indexMap.get(key)?.delete(item.id);\n }\n }\n\n insert(data: InsertInput<T>): T {\n const now = new Date().toISOString();\n const explicitId = data.id != null && data.id > 0 ? data.id : undefined;\n const id = explicitId ?? this.autoId++;\n if (id >= this.autoId) {\n this.autoId = id + 1;\n }\n const item = {\n ...data,\n id,\n created_at: now,\n updated_at: now,\n } as unknown as T;\n this.items.set(id, item);\n this.addToIndex(item);\n return item;\n }\n\n get(id: number): T | undefined {\n return this.items.get(id);\n }\n\n findBy(field: keyof T, value: T[keyof T] | string | number): T[] {\n if (this.indexes.has(String(field))) {\n const ids = this.indexes.get(String(field))!.get(String(value));\n if (!ids) return [];\n return Array.from(ids)\n .map((id) => this.items.get(id)!)\n .filter(Boolean);\n }\n return this.all().filter((item) => item[field] === value);\n }\n\n findOneBy(field: keyof T, value: T[keyof T] | string | number): T | undefined {\n return this.findBy(field, value)[0];\n }\n\n update(id: number, data: Partial<T>): T | undefined {\n const existing = this.items.get(id);\n if (!existing) return undefined;\n this.removeFromIndex(existing);\n const updated = {\n ...existing,\n ...data,\n id,\n updated_at: new Date().toISOString(),\n } as T;\n this.items.set(id, updated);\n this.addToIndex(updated);\n return updated;\n }\n\n delete(id: number): boolean {\n const existing = this.items.get(id);\n if (!existing) return false;\n this.removeFromIndex(existing);\n return this.items.delete(id);\n }\n\n all(): T[] {\n return Array.from(this.items.values());\n }\n\n query(options: QueryOptions<T> = {}): PaginatedResult<T> {\n let results = this.all();\n\n if (options.filter) {\n results = results.filter(options.filter);\n }\n\n const total_count = results.length;\n\n if (options.sort) {\n results.sort(options.sort);\n }\n\n const page = options.page ?? 1;\n const per_page = Math.min(options.per_page ?? 30, 100);\n const start = (page - 1) * per_page;\n const paged = results.slice(start, start + per_page);\n\n return {\n items: paged,\n total_count,\n page,\n per_page,\n has_next: start + per_page < total_count,\n has_prev: page > 1,\n };\n }\n\n count(filter?: FilterFn<T>): number {\n if (!filter) return this.items.size;\n return this.all().filter(filter).length;\n }\n\n clear(): void {\n this.items.clear();\n for (const indexMap of this.indexes.values()) {\n indexMap.clear();\n }\n this.autoId = 1;\n }\n\n snapshot(): CollectionSnapshot<T> {\n return {\n items: this.all(),\n autoId: this.autoId,\n indexFields: this.fieldNames,\n };\n }\n\n restore(snap: CollectionSnapshot<T>): void {\n this.clear();\n this.autoId = snap.autoId;\n for (const item of snap.items) {\n this.items.set(item.id, item);\n this.addToIndex(item);\n }\n }\n}\n\nexport class Store {\n private collections = new Map<string, Collection<any>>();\n private _data = new Map<string, unknown>();\n\n collection<T extends Entity>(name: string, indexFields: (keyof T)[] = []): Collection<T> {\n const existing = this.collections.get(name);\n if (existing) {\n if (indexFields.length > 0) {\n const requested = indexFields.map(String).sort();\n if (existing.fieldNames.length !== requested.length || existing.fieldNames.some((f, i) => f !== requested[i])) {\n throw new Error(\n `Collection \"${name}\" already exists with indexes [${existing.fieldNames}] but was requested with [${requested}]`,\n );\n }\n }\n return existing as Collection<T>;\n }\n const col = new Collection<T>(indexFields);\n this.collections.set(name, col);\n return col;\n }\n\n getData<V>(key: string): V | undefined {\n return this._data.get(key) as V | undefined;\n }\n\n setData<V>(key: string, value: V): void {\n this._data.set(key, value);\n }\n\n reset(): void {\n for (const collection of this.collections.values()) {\n collection.clear();\n }\n this._data.clear();\n }\n\n snapshot(): StoreSnapshot {\n const collections: Record<string, CollectionSnapshot> = {};\n for (const [name, col] of this.collections) {\n collections[name] = col.snapshot();\n }\n const data: Record<string, unknown> = {};\n for (const [key, value] of this._data) {\n data[key] = serializeValue(value);\n }\n return { collections, data };\n }\n\n restore(snap: StoreSnapshot): void {\n const snapshotNames = new Set(Object.keys(snap.collections));\n for (const name of this.collections.keys()) {\n if (!snapshotNames.has(name)) {\n this.collections.delete(name);\n }\n }\n for (const [name, colSnap] of Object.entries(snap.collections)) {\n const indexFields = colSnap.indexFields as (keyof Entity)[];\n const col = this.collection(name, indexFields);\n col.restore(colSnap as CollectionSnapshot<any>);\n }\n this._data.clear();\n for (const [key, value] of Object.entries(snap.data)) {\n this._data.set(key, deserializeValue(value));\n }\n }\n}\n","import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { Store } from \"./store.js\";\nimport { WebhookDispatcher } from \"./webhooks.js\";\nimport { createApiErrorHandler, createErrorHandler } from \"./middleware/error-handler.js\";\nimport {\n authMiddleware,\n type AuthFallback,\n type TokenMap,\n type AppKeyResolver,\n type AppEnv,\n} from \"./middleware/auth.js\";\nimport type { ServicePlugin } from \"./plugin.js\";\nimport { registerFontRoutes } from \"./fonts.js\";\n\nexport interface ServerOptions {\n port?: number;\n baseUrl?: string;\n docsUrl?: string;\n tokens?: Record<string, { login: string; id: number; scopes?: string[] }>;\n appKeyResolver?: AppKeyResolver;\n fallbackUser?: AuthFallback;\n}\n\nexport function createServer(plugin: ServicePlugin, options: ServerOptions = {}) {\n const port = options.port ?? 4000;\n const baseUrl = options.baseUrl ?? `http://localhost:${port}`;\n\n const app = new Hono<AppEnv>();\n const store = new Store();\n const webhooks = new WebhookDispatcher();\n\n const tokenMap: TokenMap = new Map();\n if (options.tokens) {\n for (const [token, user] of Object.entries(options.tokens)) {\n tokenMap.set(token, {\n login: user.login,\n id: user.id,\n scopes: user.scopes ?? [\"repo\", \"user\", \"admin:org\", \"admin:repo_hook\"],\n });\n }\n }\n\n const docsUrl = options.docsUrl ?? `https://emulate.dev/${plugin.name}`;\n\n registerFontRoutes(app);\n\n app.onError(createApiErrorHandler(docsUrl));\n app.use(\"*\", cors());\n app.use(\"*\", createErrorHandler(docsUrl));\n app.use(\"*\", authMiddleware(tokenMap, options.appKeyResolver, options.fallbackUser));\n\n const rateLimitCounters = new Map<string, { remaining: number; resetAt: number }>();\n let lastPruneAt = Math.floor(Date.now() / 1000);\n\n app.use(\"*\", async (c, next) => {\n const token = c.get(\"authToken\") ?? \"__anonymous__\";\n const now = Math.floor(Date.now() / 1000);\n\n if (now - lastPruneAt > 3600) {\n for (const [key, val] of rateLimitCounters) {\n if (val.resetAt <= now) rateLimitCounters.delete(key);\n }\n lastPruneAt = now;\n }\n\n let counter = rateLimitCounters.get(token);\n if (!counter || counter.resetAt <= now) {\n counter = { remaining: 5000, resetAt: now + 3600 };\n rateLimitCounters.set(token, counter);\n }\n\n counter.remaining = Math.max(0, counter.remaining - 1);\n\n c.header(\"X-RateLimit-Limit\", \"5000\");\n c.header(\"X-RateLimit-Remaining\", String(counter.remaining));\n c.header(\"X-RateLimit-Reset\", String(counter.resetAt));\n c.header(\"X-RateLimit-Resource\", \"core\");\n\n if (counter.remaining === 0) {\n return c.json(\n {\n message: \"API rate limit exceeded\",\n documentation_url: docsUrl,\n },\n 403,\n );\n }\n\n await next();\n });\n\n plugin.register(app, store, webhooks, baseUrl, tokenMap);\n\n app.notFound((c) =>\n c.json(\n {\n message: \"Not Found\",\n documentation_url: docsUrl,\n },\n 404,\n ),\n );\n\n return { app, store, webhooks, port, baseUrl, tokenMap };\n}\n","import { createHmac } from \"crypto\";\n\nexport interface WebhookSubscription {\n id: number;\n url: string;\n events: string[];\n active: boolean;\n secret?: string;\n owner: string;\n repo?: string;\n}\n\nexport interface WebhookDelivery {\n id: number;\n hook_id: number;\n event: string;\n action?: string;\n payload: unknown;\n status_code: number | null;\n delivered_at: string;\n duration: number | null;\n success: boolean;\n}\n\nconst MAX_DELIVERIES = 1000;\n\nexport class WebhookDispatcher {\n private subscriptions: WebhookSubscription[] = [];\n private deliveries: WebhookDelivery[] = [];\n private subscriptionIdCounter = 1;\n private deliveryIdCounter = 1;\n\n register(sub: Omit<WebhookSubscription, \"id\"> & { id?: number }): WebhookSubscription {\n const { id: explicitId, ...rest } = sub;\n const id = explicitId !== undefined ? explicitId : this.subscriptionIdCounter++;\n if (id >= this.subscriptionIdCounter) {\n this.subscriptionIdCounter = id + 1;\n }\n const subscription: WebhookSubscription = { ...rest, id };\n this.subscriptions.push(subscription);\n return subscription;\n }\n\n unregister(id: number): boolean {\n const idx = this.subscriptions.findIndex((s) => s.id === id);\n if (idx === -1) return false;\n this.subscriptions.splice(idx, 1);\n return true;\n }\n\n getSubscription(id: number): WebhookSubscription | undefined {\n return this.subscriptions.find((s) => s.id === id);\n }\n\n getSubscriptions(owner?: string, repo?: string): WebhookSubscription[] {\n return this.subscriptions.filter((s) => {\n if (owner && s.owner !== owner) return false;\n if (repo !== undefined && s.repo !== repo) return false;\n return true;\n });\n }\n\n updateSubscription(\n id: number,\n data: Partial<Pick<WebhookSubscription, \"url\" | \"events\" | \"active\" | \"secret\">>,\n ): WebhookSubscription | undefined {\n const sub = this.subscriptions.find((s) => s.id === id);\n if (!sub) return undefined;\n Object.assign(sub, data);\n return sub;\n }\n\n async dispatch(\n event: string,\n action: string | undefined,\n payload: unknown,\n owner: string,\n repo?: string,\n ): Promise<void> {\n const matchingSubs = this.subscriptions.filter((s) => {\n if (!s.active) return false;\n if (s.owner !== owner) return false;\n if (repo !== undefined) {\n if (s.repo !== repo) return false;\n } else if (s.repo !== undefined) {\n return false;\n }\n return event === \"ping\" || s.events.includes(\"*\") || s.events.includes(event);\n });\n\n for (const sub of matchingSubs) {\n const delivery: WebhookDelivery = {\n id: this.deliveryIdCounter++,\n hook_id: sub.id,\n event,\n action,\n payload,\n status_code: null,\n delivered_at: new Date().toISOString(),\n duration: null,\n success: false,\n };\n\n const body = JSON.stringify(payload);\n\n const signatureHeaders: Record<string, string> = {};\n if (sub.secret) {\n const hmac = createHmac(\"sha256\", sub.secret).update(body).digest(\"hex\");\n signatureHeaders[\"X-Hub-Signature-256\"] = `sha256=${hmac}`;\n }\n\n try {\n const start = Date.now();\n const response = await fetch(sub.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Event\": event,\n \"X-GitHub-Delivery\": String(delivery.id),\n ...signatureHeaders,\n },\n body,\n signal: AbortSignal.timeout(10000),\n });\n delivery.duration = Date.now() - start;\n delivery.status_code = response.status;\n delivery.success = response.ok;\n } catch {\n delivery.duration = 0;\n delivery.success = false;\n }\n\n this.deliveries.push(delivery);\n if (this.deliveries.length > MAX_DELIVERIES) {\n this.deliveries.splice(0, this.deliveries.length - MAX_DELIVERIES);\n }\n }\n }\n\n getDeliveries(hookId?: number): WebhookDelivery[] {\n if (hookId !== undefined) {\n return this.deliveries.filter((d) => d.hook_id === hookId);\n }\n return [...this.deliveries];\n }\n\n clear(): void {\n this.subscriptions.length = 0;\n this.deliveries.length = 0;\n this.subscriptionIdCounter = 1;\n this.deliveryIdCounter = 1;\n }\n}\n","import type { Context, ErrorHandler, MiddlewareHandler } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst DEFAULT_DOCS_URL = \"https://emulate.dev\";\n\nfunction getDocsUrl(c: Context): string {\n return (c.get(\"docsUrl\") as string | undefined) ?? DEFAULT_DOCS_URL;\n}\n\nfunction errorStatus(err: unknown): number {\n if (err && typeof err === \"object\" && \"status\" in err) {\n const s = (err as { status: unknown }).status;\n if (typeof s === \"number\" && Number.isFinite(s)) return s;\n }\n return 500;\n}\n\n/**\n * Use with `app.onError(...)`. Hono routes handler throws to the app error handler, not to outer middleware try/catch.\n */\nexport function createApiErrorHandler(documentationUrl?: string): ErrorHandler {\n return (err, c) => {\n if (documentationUrl) {\n c.set(\"docsUrl\", documentationUrl);\n }\n const status = errorStatus(err);\n const message = err instanceof Error ? err.message : \"Internal Server Error\";\n return c.json(\n {\n message,\n documentation_url: getDocsUrl(c),\n },\n status as ContentfulStatusCode,\n );\n };\n}\n\n/** Sets `docsUrl` on the context for successful responses; register `createApiErrorHandler` for thrown `ApiError`s. */\nexport function createErrorHandler(documentationUrl?: string): MiddlewareHandler {\n return async (c, next) => {\n if (documentationUrl) {\n c.set(\"docsUrl\", documentationUrl);\n }\n await next();\n };\n}\n\nexport const errorHandler: MiddlewareHandler = createErrorHandler();\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n message: string,\n public errors?: Array<{ resource: string; field: string; code: string }>,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport function notFound(resource?: string): ApiError {\n return new ApiError(404, resource ? `${resource} not found` : \"Not Found\");\n}\n\nexport function validationError(message: string, errors?: ApiError[\"errors\"]): ApiError {\n return new ApiError(422, message, errors);\n}\n\nexport function unauthorized(): ApiError {\n return new ApiError(401, \"Requires authentication\");\n}\n\nexport function forbidden(): ApiError {\n return new ApiError(403, \"Forbidden\");\n}\n\nexport async function parseJsonBody(c: Context): Promise<Record<string, unknown>> {\n try {\n const body = await c.req.json();\n if (body && typeof body === \"object\" && !Array.isArray(body)) {\n return body as Record<string, unknown>;\n }\n return {};\n } catch {\n throw new ApiError(400, \"Problems parsing JSON\");\n }\n}\n","import type { Context, Next } from \"hono\";\nimport { jwtVerify, importPKCS8 } from \"jose\";\nimport { debug } from \"../debug.js\";\n\nexport interface AuthUser {\n login: string;\n id: number;\n scopes: string[];\n}\n\nexport interface AuthApp {\n appId: number;\n slug: string;\n name: string;\n}\n\nexport interface AuthInstallation {\n installationId: number;\n appId: number;\n permissions: Record<string, string>;\n repositoryIds: number[];\n repositorySelection: \"all\" | \"selected\";\n}\n\nexport type TokenMap = Map<string, AuthUser>;\n\nexport interface TokenEntry {\n token: string;\n login: string;\n id: number;\n scopes: string[];\n}\n\nexport function serializeTokenMap(tokenMap: TokenMap): TokenEntry[] {\n return [...tokenMap.entries()].map(([token, user]) => ({\n token,\n login: user.login,\n id: user.id,\n scopes: user.scopes,\n }));\n}\n\nexport function restoreTokenMap(tokenMap: TokenMap, tokens: TokenEntry[]): void {\n tokenMap.clear();\n for (const t of tokens) {\n tokenMap.set(t.token, { login: t.login, id: t.id, scopes: t.scopes });\n }\n}\n\nexport type AppEnv = {\n Variables: {\n authUser?: AuthUser;\n authApp?: AuthApp;\n authToken?: string;\n authScopes?: string[];\n docsUrl?: string;\n };\n};\n\nexport interface AppKeyResolver {\n (appId: number): { privateKey: string; slug: string; name: string } | null;\n}\n\nexport interface AuthFallback {\n login: string;\n id: number;\n scopes: string[];\n}\n\nexport function authMiddleware(tokens: TokenMap, appKeyResolver?: AppKeyResolver, fallbackUser?: AuthFallback) {\n return async (c: Context, next: Next) => {\n const authHeader = c.req.header(\"Authorization\");\n if (authHeader) {\n const token = authHeader.replace(/^(Bearer|token)\\s+/i, \"\").trim();\n\n if (token.startsWith(\"eyJ\") && appKeyResolver) {\n try {\n const [, payloadB64] = token.split(\".\");\n const payload = JSON.parse(Buffer.from(payloadB64, \"base64url\").toString());\n const appId = typeof payload.iss === \"string\" ? parseInt(payload.iss, 10) : payload.iss;\n\n if (typeof appId === \"number\" && !isNaN(appId)) {\n const appInfo = appKeyResolver(appId);\n if (appInfo) {\n const key = await importPKCS8(appInfo.privateKey, \"RS256\");\n await jwtVerify(token, key, { algorithms: [\"RS256\"] });\n c.set(\"authApp\", {\n appId,\n slug: appInfo.slug,\n name: appInfo.name,\n } satisfies AuthApp);\n }\n }\n } catch {\n // JWT verification failed\n }\n } else {\n let user = tokens.get(token);\n if (!user && fallbackUser && token.length > 0) {\n debug(\"auth\", \"fallback user for unknown token\", { login: fallbackUser.login, id: fallbackUser.id });\n user = { login: fallbackUser.login, id: fallbackUser.id, scopes: fallbackUser.scopes };\n }\n if (user) {\n c.set(\"authUser\", user);\n c.set(\"authToken\", token);\n c.set(\"authScopes\", user.scopes);\n }\n }\n }\n await next();\n };\n}\n\nexport function requireAuth() {\n return async (c: Context, next: Next) => {\n if (!c.get(\"authUser\")) {\n const docsUrl = (c.get(\"docsUrl\") as string | undefined) ?? \"https://emulate.dev\";\n return c.json(\n {\n message: \"Requires authentication\",\n documentation_url: docsUrl,\n },\n 401,\n );\n }\n await next();\n };\n}\n\nexport function requireAppAuth() {\n return async (c: Context, next: Next) => {\n if (!c.get(\"authApp\")) {\n const docsUrl = (c.get(\"docsUrl\") as string | undefined) ?? \"https://emulate.dev\";\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: docsUrl,\n },\n 401,\n );\n }\n await next();\n };\n}\n","const isDebug =\n typeof process !== \"undefined\" &&\n (process.env.DEBUG === \"1\" || process.env.DEBUG === \"true\" || process.env.EMULATE_DEBUG === \"1\");\n\nexport function debug(label: string, ...args: unknown[]): void {\n if (isDebug) {\n console.log(`[${label}]`, ...args);\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport type { Hono } from \"hono\";\nimport type { AppEnv } from \"./middleware/auth.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst FONTS: Record<string, Buffer> = {\n \"geist-sans.woff2\": readFileSync(join(__dirname, \"fonts\", \"geist-sans.woff2\")),\n \"GeistPixel-Square.woff2\": readFileSync(join(__dirname, \"fonts\", \"GeistPixel-Square.woff2\")),\n};\n\nconst FAVICON = readFileSync(join(__dirname, \"fonts\", \"favicon.ico\"));\n\nexport function registerFontRoutes(app: Hono<AppEnv>): void {\n app.get(\"/_emulate/fonts/:name\", (c) => {\n const name = c.req.param(\"name\");\n const buf = FONTS[name];\n if (!buf) return c.notFound();\n return new Response(buf, {\n headers: {\n \"Content-Type\": \"font/woff2\",\n \"Cache-Control\": \"public, max-age=31536000, immutable\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n });\n\n app.get(\"/_emulate/favicon.ico\", (c) => {\n return new Response(FAVICON, {\n headers: {\n \"Content-Type\": \"image/x-icon\",\n \"Cache-Control\": \"public, max-age=31536000, immutable\",\n },\n });\n });\n}\n","import type { Context } from \"hono\";\n\nexport interface PaginationParams {\n page: number;\n per_page: number;\n}\n\nexport function parsePagination(c: Context): PaginationParams {\n const page = Math.max(1, parseInt(c.req.query(\"page\") ?? \"1\", 10) || 1);\n const per_page = Math.min(100, Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30));\n return { page, per_page };\n}\n\nexport function setLinkHeader(c: Context, totalCount: number, page: number, perPage: number): void {\n const lastPage = Math.max(1, Math.ceil(totalCount / perPage));\n const baseUrl = new URL(c.req.url);\n const links: string[] = [];\n\n const makeLink = (p: number, rel: string) => {\n baseUrl.searchParams.set(\"page\", String(p));\n baseUrl.searchParams.set(\"per_page\", String(perPage));\n return `<${baseUrl.toString()}>; rel=\"${rel}\"`;\n };\n\n if (page < lastPage) {\n links.push(makeLink(page + 1, \"next\"));\n links.push(makeLink(lastPage, \"last\"));\n }\n if (page > 1) {\n links.push(makeLink(1, \"first\"));\n links.push(makeLink(page - 1, \"prev\"));\n }\n\n if (links.length > 0) {\n c.header(\"Link\", links.join(\", \"));\n }\n}\n","export function escapeHtml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\n}\n\nexport function escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, \"&#39;\");\n}\n\nconst CSS = `\n@font-face{\n font-family:'Geist';font-style:normal;font-weight:100 900;font-display:swap;\n src:url('/_emulate/fonts/geist-sans.woff2') format('woff2');\n}\n@font-face{\n font-family:'Geist Pixel';font-style:normal;font-weight:400;font-display:swap;\n src:url('/_emulate/fonts/GeistPixel-Square.woff2') format('woff2');\n}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{\n font-family:'Geist',-apple-system,BlinkMacSystemFont,sans-serif;\n background:#000;color:#33ff00;min-height:100vh;\n -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;\n}\n.emu-bar{\n border-bottom:1px solid #0a3300;padding:10px 20px;\n display:flex;align-items:center;gap:10px;font-size:.8125rem;color:#1a8c00;\n}\n.emu-bar-title{font-weight:600;color:#33ff00;font-family:'Geist Pixel',monospace;}\n.emu-bar-links{margin-left:auto;display:flex;gap:16px;}\n.emu-bar-links a{\n color:#1a8c00;font-size:.75rem;text-decoration:none;transition:color .15s;\n}\n.emu-bar-links a:hover{color:#33ff00;}\n.emu-bar-links a .full{display:inline;}\n.emu-bar-links a .short{display:none;}\n@media(max-width:600px){\n .emu-bar-links a .full{display:none;}\n .emu-bar-links a .short{display:inline;}\n}\n\n.content{\n display:flex;align-items:center;justify-content:center;\n min-height:calc(100vh - 42px);padding:24px 16px;\n}\n.content-inner{width:100%;max-width:420px;}\n.card-title{\n font-family:'Geist Pixel',monospace;\n font-size:1.125rem;font-weight:600;margin-bottom:4px;color:#33ff00;\n}\n.card-subtitle{color:#1a8c00;font-size:.8125rem;margin-bottom:18px;line-height:1.45;}\n.powered-by{\n position:fixed;bottom:0;left:0;right:0;\n text-align:center;padding:12px;font-size:.6875rem;color:#0a3300;\n font-family:'Geist Pixel',monospace;\n}\n.powered-by a{color:#1a8c00;text-decoration:none;transition:color .15s;}\n.powered-by a:hover{color:#33ff00;}\n\n.error-title{\n font-family:'Geist Pixel',monospace;\n color:#ff4444;font-size:1.125rem;font-weight:600;margin-bottom:8px;\n}\n.error-msg{color:#1a8c00;font-size:.875rem;line-height:1.5;}\n.error-card{text-align:center;}\n\n.user-form{margin-bottom:8px;}\n.user-form:last-of-type{margin-bottom:0;}\n.user-btn{\n width:100%;display:flex;align-items:center;gap:12px;\n padding:10px 12px;border:1px solid #0a3300;border-radius:8px;\n background:#000;color:inherit;cursor:pointer;text-align:left;\n font:inherit;transition:border-color .15s;\n}\n.user-btn:hover{border-color:#33ff00;}\n.avatar{\n width:36px;height:36px;border-radius:50%;\n background:#0a3300;color:#33ff00;font-weight:600;font-size:.875rem;\n display:flex;align-items:center;justify-content:center;flex-shrink:0;\n font-family:'Geist Pixel',monospace;\n}\n.user-text{min-width:0;}\n.user-login{font-weight:600;font-size:.875rem;display:block;color:#33ff00;}\n.user-meta{color:#1a8c00;font-size:.75rem;margin-top:1px;}\n.user-email{font-size:.6875rem;color:#116600;word-break:break-all;margin-top:1px;}\n\n.settings-layout{\n max-width:920px;margin:0 auto;padding:28px 20px;\n display:flex;gap:28px;\n}\n.settings-sidebar{width:200px;flex-shrink:0;}\n.settings-sidebar a{\n display:block;padding:6px 10px;border-radius:6px;color:#1a8c00;\n text-decoration:none;font-size:.8125rem;transition:color .15s;\n}\n.settings-sidebar a:hover{color:#33ff00;}\n.settings-sidebar a.active{color:#33ff00;font-weight:600;}\n.settings-main{flex:1;min-width:0;}\n\n.s-card{\n padding:18px 0;margin-bottom:14px;border-bottom:1px solid #0a3300;\n}\n.s-card:last-child{border-bottom:none;}\n.s-card-header{display:flex;align-items:center;gap:14px;margin-bottom:14px;}\n.s-icon{\n width:42px;height:42px;border-radius:8px;\n background:#0a3300;display:flex;align-items:center;justify-content:center;\n font-size:1.125rem;font-weight:700;color:#116600;flex-shrink:0;\n font-family:'Geist Pixel',monospace;\n}\n.s-title{\n font-family:'Geist Pixel',monospace;\n font-size:1.25rem;font-weight:600;color:#33ff00;\n}\n.s-subtitle{font-size:.75rem;color:#1a8c00;margin-top:2px;}\n.section-heading{\n font-size:.9375rem;font-weight:600;margin-bottom:10px;color:#33ff00;\n display:flex;align-items:center;justify-content:space-between;\n}\n.perm-list{list-style:none;}\n.perm-list li{padding:5px 0;font-size:.8125rem;display:flex;align-items:center;gap:6px;color:#1a8c00;}\n.check{color:#33ff00;}\n.org-row{\n display:flex;align-items:center;gap:8px;padding:7px 0;\n border-bottom:1px solid #0a3300;font-size:.8125rem;\n}\n.org-row:last-child{border-bottom:none;}\n.org-icon{\n width:22px;height:22px;border-radius:4px;background:#0a3300;\n display:flex;align-items:center;justify-content:center;\n font-size:.625rem;font-weight:700;color:#116600;flex-shrink:0;\n font-family:'Geist Pixel',monospace;\n}\n.org-name{font-weight:600;color:#33ff00;}\n.badge{font-size:.6875rem;padding:1px 7px;border-radius:999px;font-weight:500;}\n.badge-granted{background:#0a3300;color:#33ff00;}\n.badge-denied{background:#1a0a0a;color:#ff4444;}\n.badge-requested{background:#0a3300;color:#1a8c00;}\n.btn-revoke{\n display:inline-block;padding:5px 14px;border-radius:6px;\n border:1px solid #0a3300;background:transparent;color:#ff4444;\n font-size:.75rem;font-weight:600;cursor:pointer;transition:border-color .15s;\n}\n.btn-revoke:hover{border-color:#ff4444;}\n.info-text{color:#1a8c00;font-size:.75rem;line-height:1.5;margin-top:10px;}\n.app-link{\n display:flex;align-items:center;gap:12px;padding:12px;\n border:1px solid #0a3300;border-radius:8px;background:#000;\n text-decoration:none;color:inherit;margin-bottom:8px;transition:border-color .15s;\n}\n.app-link:hover{border-color:#33ff00;}\n.app-link-name{font-weight:600;font-size:.875rem;color:#33ff00;}\n.app-link-scopes{font-size:.6875rem;color:#1a8c00;margin-top:1px;}\n.empty{color:#1a8c00;text-align:center;padding:28px 0;font-size:.875rem;}\n\n.inspector-layout{max-width:960px;margin:0 auto;padding:28px 20px;}\n.inspector-tabs{display:flex;gap:4px;margin-bottom:20px;}\n.inspector-tabs a{\n padding:7px 16px;border-radius:6px;text-decoration:none;\n font-size:.8125rem;color:#1a8c00;border:1px solid transparent;\n transition:color .15s,border-color .15s;\n}\n.inspector-tabs a:hover{color:#33ff00;}\n.inspector-tabs a.active{color:#33ff00;font-weight:600;border-color:#0a3300;background:#0a3300;}\n.inspector-section{margin-bottom:24px;}\n.inspector-section h2{\n font-family:'Geist Pixel',monospace;\n font-size:1rem;font-weight:600;color:#33ff00;margin-bottom:10px;\n}\n.inspector-section h3{\n font-family:'Geist Pixel',monospace;\n font-size:.875rem;font-weight:600;color:#1a8c00;margin:16px 0 8px;\n}\n.inspector-table{width:100%;border-collapse:collapse;margin-bottom:12px;}\n.inspector-table th,.inspector-table td{\n text-align:left;padding:8px 12px;border-bottom:1px solid #0a3300;\n font-size:.8125rem;\n}\n.inspector-table th{color:#1a8c00;font-weight:600;font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;}\n.inspector-table td{color:#33ff00;}\n.inspector-table tbody tr{transition:background .1s;}\n.inspector-table tbody tr:hover{background:#0a3300;}\n.inspector-empty{color:#1a8c00;text-align:center;padding:20px 0;font-size:.8125rem;}\n\n.checkout-layout{\n display:flex;min-height:calc(100vh - 42px);\n}\n.checkout-summary{\n flex:1;background:#020;padding:48px 40px 48px 10%;\n display:flex;flex-direction:column;justify-content:center;\n border-right:1px solid #0a3300;\n}\n.checkout-form-side{\n flex:1;background:#000;padding:48px 10% 48px 40px;\n display:flex;flex-direction:column;justify-content:center;\n}\n.checkout-merchant{\n display:flex;align-items:center;gap:10px;margin-bottom:6px;\n}\n.checkout-merchant-name{\n font-family:'Geist Pixel',monospace;\n font-size:.9375rem;font-weight:600;color:#33ff00;\n}\n.checkout-test-badge{\n font-size:.625rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;\n background:#0a3300;color:#1a8c00;padding:2px 8px;border-radius:4px;\n}\n.checkout-total{\n font-family:'Geist Pixel',monospace;\n font-size:2rem;font-weight:700;color:#33ff00;margin:8px 0 28px;\n}\n.checkout-line-item{\n display:flex;align-items:center;gap:14px;padding:14px 0;\n border-bottom:1px solid #0a3300;\n}\n.checkout-line-item:first-child{border-top:1px solid #0a3300;}\n.checkout-item-icon{\n width:42px;height:42px;border-radius:6px;background:#0a3300;\n display:flex;align-items:center;justify-content:center;flex-shrink:0;\n font-family:'Geist Pixel',monospace;font-size:.875rem;font-weight:700;color:#116600;\n}\n.checkout-item-details{flex:1;min-width:0;}\n.checkout-item-name{font-size:.875rem;font-weight:600;color:#33ff00;}\n.checkout-item-qty{font-size:.75rem;color:#1a8c00;margin-top:2px;}\n.checkout-item-price{\n font-size:.875rem;font-weight:600;color:#33ff00;text-align:right;white-space:nowrap;\n}\n.checkout-item-unit{font-size:.6875rem;color:#1a8c00;text-align:right;margin-top:2px;}\n.checkout-totals{margin-top:20px;}\n.checkout-totals-row{\n display:flex;justify-content:space-between;padding:6px 0;\n font-size:.8125rem;color:#1a8c00;\n}\n.checkout-totals-row.total{\n border-top:1px solid #0a3300;margin-top:8px;padding-top:14px;\n font-size:.9375rem;font-weight:600;color:#33ff00;\n}\n.checkout-form-section{margin-bottom:24px;}\n.checkout-form-label{\n font-size:.8125rem;font-weight:600;color:#33ff00;margin-bottom:8px;display:block;\n}\n.checkout-input{\n width:100%;padding:10px 12px;border:1px solid #0a3300;border-radius:6px;\n background:#020;color:#33ff00;font:inherit;font-size:.875rem;\n transition:border-color .15s;outline:none;\n}\n.checkout-input:focus{border-color:#33ff00;}\n.checkout-input::placeholder{color:#116600;}\n.checkout-card-box{\n border:1px solid #0a3300;border-radius:6px;padding:14px;\n background:#020;\n}\n.checkout-card-row{\n display:flex;gap:12px;margin-top:10px;\n}\n.checkout-card-row .checkout-input{flex:1;}\n.checkout-sim-note{\n font-size:.6875rem;color:#1a8c00;margin-top:10px;text-align:center;\n font-style:italic;\n}\n.checkout-pay-btn{\n width:100%;padding:14px;border:none;border-radius:8px;\n background:#33ff00;color:#000;font:inherit;font-size:.9375rem;font-weight:700;\n cursor:pointer;transition:background .15s;\n font-family:'Geist Pixel',monospace;\n}\n.checkout-pay-btn:hover{background:#44ff22;}\n.checkout-cancel{\n text-align:center;margin-top:14px;\n}\n.checkout-cancel a{\n color:#1a8c00;text-decoration:none;font-size:.8125rem;\n transition:color .15s;\n}\n.checkout-cancel a:hover{color:#33ff00;}\n@media(max-width:768px){\n .checkout-layout{flex-direction:column;}\n .checkout-summary{padding:32px 20px;border-right:none;border-bottom:1px solid #0a3300;}\n .checkout-form-side{padding:32px 20px;}\n}\n`;\n\nconst POWERED_BY = `<div class=\"powered-by\">Powered by <a href=\"https://emulate.dev\" target=\"_blank\" rel=\"noopener\">emulate</a></div>`;\n\nfunction emuBar(service?: string): string {\n const title = service ? `${escapeHtml(service)} Emulator` : \"Emulator\";\n return `<div class=\"emu-bar\">\n <span class=\"emu-bar-title\">${title}</span>\n <nav class=\"emu-bar-links\">\n <a href=\"https://github.com/vercel-labs/emulate/issues\" target=\"_blank\" rel=\"noopener\"><span class=\"full\">Report Issue</span><span class=\"short\">Report</span></a>\n <a href=\"https://github.com/vercel-labs/emulate\" target=\"_blank\" rel=\"noopener\"><span class=\"full\">Source Code</span><span class=\"short\">Source</span></a>\n <a href=\"https://emulate.dev\" target=\"_blank\" rel=\"noopener\"><span class=\"full\">Learn More</span><span class=\"short\">Learn</span></a>\n </nav>\n</div>`;\n}\n\nfunction head(title: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"/>\n<link rel=\"icon\" href=\"/_emulate/favicon.ico\"/>\n<title>${escapeHtml(title)} | emulate</title>\n<style>${CSS}</style>\n</head>`;\n}\n\nexport function renderCardPage(title: string, subtitle: string, body: string, service?: string): string {\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"content\">\n <div class=\"content-inner\">\n <div class=\"card-title\">${escapeHtml(title)}</div>\n <div class=\"card-subtitle\">${subtitle}</div>\n ${body}\n </div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport function renderErrorPage(title: string, message: string, service?: string): string {\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"content\">\n <div class=\"content-inner error-card\">\n <div class=\"error-title\">${escapeHtml(title)}</div>\n <div class=\"error-msg\">${escapeHtml(message)}</div>\n </div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport function renderSettingsPage(title: string, sidebarHtml: string, bodyHtml: string, service?: string): string {\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"settings-layout\">\n <nav class=\"settings-sidebar\">${sidebarHtml}</nav>\n <div class=\"settings-main\">${bodyHtml}</div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport interface InspectorTab {\n id: string;\n label: string;\n href: string;\n}\n\nexport function renderInspectorPage(\n title: string,\n tabs: InspectorTab[],\n activeTab: string,\n body: string,\n service?: string,\n): string {\n const tabLinks = tabs\n .map(\n (t) => `<a href=\"${escapeAttr(t.href)}\" class=\"${t.id === activeTab ? \"active\" : \"\"}\">${escapeHtml(t.label)}</a>`,\n )\n .join(\"\");\n\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"inspector-layout\">\n <nav class=\"inspector-tabs\">${tabLinks}</nav>\n ${body}\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport function renderFormPostPage(action: string, fields: Record<string, string>, service?: string): string {\n const hiddens = Object.entries(fields)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `<input type=\"hidden\" name=\"${escapeAttr(k)}\" value=\"${escapeAttr(v)}\"/>`)\n .join(\"\\n\");\n\n return `${head(\"Redirecting\")}\n<body onload=\"document.forms[0].submit()\">\n${emuBar(service)}\n<div class=\"content\">\n <div class=\"content-inner\" style=\"text-align:center\">\n <div class=\"card-subtitle\">Redirecting&hellip;</div>\n <form method=\"POST\" action=\"${escapeAttr(action)}\">\n${hiddens}\n <noscript><button type=\"submit\" class=\"user-btn\" style=\"margin-top:12px;justify-content:center\">\n <span class=\"user-login\">Continue</span>\n </button></noscript>\n </form>\n </div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport interface CheckoutLineItem {\n name: string;\n quantity: number;\n unitPrice: number;\n totalPrice: number;\n currency: string;\n}\n\nexport interface CheckoutPageOptions {\n merchantName?: string;\n lineItems: CheckoutLineItem[];\n subtotal: number;\n total: number;\n currency: string;\n sessionId: string;\n cancelUrl?: string | null;\n}\n\nexport function renderCheckoutPage(opts: CheckoutPageOptions, service?: string): string {\n const fmt = (cents: number, cur: string) => `$${(cents / 100).toFixed(2)} ${cur.toUpperCase()}`;\n const fmtShort = (cents: number) => `$${(cents / 100).toFixed(2)}`;\n\n const itemsHtml =\n opts.lineItems.length > 0\n ? opts.lineItems\n .map((li) => {\n const initial = li.name.charAt(0).toUpperCase();\n const unitNote =\n li.quantity > 1 ? `<div class=\"checkout-item-unit\">${fmtShort(li.unitPrice)} each</div>` : \"\";\n return `<div class=\"checkout-line-item\">\n <div class=\"checkout-item-icon\">${escapeHtml(initial)}</div>\n <div class=\"checkout-item-details\">\n <div class=\"checkout-item-name\">${escapeHtml(li.name)}</div>\n <div class=\"checkout-item-qty\">Qty ${li.quantity}</div>\n </div>\n <div>\n <div class=\"checkout-item-price\">${fmtShort(li.totalPrice)}</div>\n ${unitNote}\n </div>\n</div>`;\n })\n .join(\"\")\n : '<p class=\"empty\">No line items</p>';\n\n const totalsHtml = `<div class=\"checkout-totals\">\n <div class=\"checkout-totals-row\">\n <span>Subtotal</span><span>${fmtShort(opts.subtotal)}</span>\n </div>\n <div class=\"checkout-totals-row total\">\n <span>Total due</span><span>${fmt(opts.total, opts.currency)}</span>\n </div>\n</div>`;\n\n const cancelHtml = opts.cancelUrl\n ? `<div class=\"checkout-cancel\"><a href=\"${escapeAttr(opts.cancelUrl)}\">Cancel</a></div>`\n : \"\";\n\n const merchant = opts.merchantName ? escapeHtml(opts.merchantName) : \"Checkout\";\n\n return `${head(\"Checkout\")}\n<body>\n${emuBar(service)}\n<div class=\"checkout-layout\">\n <div class=\"checkout-summary\">\n <div class=\"checkout-merchant\">\n <span class=\"checkout-merchant-name\">${merchant}</span>\n <span class=\"checkout-test-badge\">Test Mode</span>\n </div>\n <div class=\"checkout-total\">${fmtShort(opts.total)}</div>\n ${itemsHtml}\n ${totalsHtml}\n </div>\n <div class=\"checkout-form-side\">\n <form method=\"post\" action=\"/checkout/${escapeAttr(opts.sessionId)}/complete\">\n <div class=\"checkout-form-section\">\n <label class=\"checkout-form-label\">Email</label>\n <input type=\"email\" name=\"email\" class=\"checkout-input\" placeholder=\"you@example.com\"/>\n </div>\n <div class=\"checkout-form-section\">\n <label class=\"checkout-form-label\">Card information</label>\n <div class=\"checkout-card-box\">\n <input type=\"text\" class=\"checkout-input\" placeholder=\"1234 1234 1234 1234\" disabled/>\n <div class=\"checkout-card-row\">\n <input type=\"text\" class=\"checkout-input\" placeholder=\"MM / YY\" disabled/>\n <input type=\"text\" class=\"checkout-input\" placeholder=\"CVC\" disabled/>\n </div>\n </div>\n <div class=\"checkout-sim-note\">Card fields are simulated. Payment will be auto-approved.</div>\n </div>\n <button type=\"submit\" class=\"checkout-pay-btn\">Pay ${fmtShort(opts.total)}</button>\n </form>\n ${cancelHtml}\n </div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport interface UserButtonOptions {\n letter: string;\n login: string;\n name?: string;\n email?: string;\n formAction: string;\n hiddenFields: Record<string, string>;\n}\n\nexport function renderUserButton(opts: UserButtonOptions): string {\n const hiddens = Object.entries(opts.hiddenFields)\n .map(([k, v]) => `<input type=\"hidden\" name=\"${escapeAttr(k)}\" value=\"${escapeAttr(v)}\"/>`)\n .join(\"\");\n\n const nameLine = opts.name ? `<div class=\"user-meta\">${escapeHtml(opts.name)}</div>` : \"\";\n const emailLine = opts.email ? `<div class=\"user-email\">${escapeHtml(opts.email)}</div>` : \"\";\n\n return `<form class=\"user-form\" method=\"post\" action=\"${escapeAttr(opts.formAction)}\">\n${hiddens}\n<button type=\"submit\" class=\"user-btn\">\n <span class=\"avatar\">${escapeHtml(opts.letter)}</span>\n <span class=\"user-text\">\n <span class=\"user-login\">${escapeHtml(opts.login)}</span>\n ${nameLine}${emailLine}\n </span>\n</button>\n</form>`;\n}\n","import { timingSafeEqual } from \"crypto\";\n\nexport function normalizeUri(uri: string): string {\n try {\n const u = new URL(uri);\n return `${u.origin}${u.pathname.replace(/\\/+$/, \"\")}`;\n } catch {\n return uri.replace(/\\/+$/, \"\").split(\"?\")[0];\n }\n}\n\nexport function matchesRedirectUri(incoming: string, registered: string[]): boolean {\n const normalized = normalizeUri(incoming);\n return registered.some((r) => normalizeUri(r) === normalized);\n}\n\nexport function constantTimeSecretEqual(a: string, b: string): boolean {\n const bufA = Buffer.from(a, \"utf-8\");\n const bufB = Buffer.from(b, \"utf-8\");\n if (bufA.length !== bufB.length) return false;\n return timingSafeEqual(bufA, bufB);\n}\n\nexport function bodyStr(v: unknown): string {\n if (typeof v === \"string\") return v;\n if (Array.isArray(v) && typeof v[0] === \"string\") return v[0];\n return \"\";\n}\n\nexport function parseCookies(header: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const part of header.split(\";\")) {\n const [k, ...v] = part.split(\"=\");\n if (k) cookies[k.trim()] = v.join(\"=\").trim();\n }\n return cookies;\n}\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nexport interface PersistenceAdapter {\n load(): Promise<string | null>;\n save(data: string): Promise<void>;\n}\n\nexport function filePersistence(path: string): PersistenceAdapter {\n return {\n async load() {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return null;\n }\n },\n async save(data: string) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, data, \"utf-8\");\n },\n };\n}\n","import type { AuthUser } from \"@emulators/core\";\nimport { notFound, unauthorized, forbidden } from \"@emulators/core\";\nimport type { GitHubStore } from \"./store.js\";\nimport type { GitHubRepo, GitHubUser } from \"./entities.js\";\n\nexport { notFound as notFoundResponse };\n\nexport function ownerLoginOf(gh: GitHubStore, repo: GitHubRepo): string {\n if (repo.owner_type === \"User\") {\n return gh.users.get(repo.owner_id)?.login ?? \"unknown\";\n }\n return gh.orgs.get(repo.owner_id)?.login ?? \"unknown\";\n}\n\nexport function isOrgMember(gh: GitHubStore, userId: number, orgId: number): boolean {\n for (const team of gh.teams.all()) {\n if (team.org_id !== orgId) continue;\n const m = gh.teamMembers.findBy(\"team_id\", team.id).find((x) => x.user_id === userId);\n if (m) return true;\n }\n return false;\n}\n\nexport function getActorUser(gh: GitHubStore, authUser: AuthUser): GitHubUser | undefined {\n return gh.users.findOneBy(\"login\", authUser.login);\n}\n\nexport function canAccessRepo(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): boolean {\n if (!repo.private) return true;\n if (!authUser) return false;\n const user = getActorUser(gh, authUser);\n if (!user) return false;\n if (repo.owner_type === \"User\" && repo.owner_id === user.id) return true;\n if (repo.owner_type === \"Organization\" && isOrgMember(gh, user.id, repo.owner_id)) return true;\n return Boolean(gh.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === user.id));\n}\n\nexport function assertRepoRead(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): void {\n if (canAccessRepo(gh, authUser, repo)) return;\n if (!authUser) throw unauthorized();\n throw forbidden();\n}\n\nexport function assertAuthenticatedUser(gh: GitHubStore, authUser: AuthUser | undefined): GitHubUser {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n return user;\n}\n\nexport function hasRepoAdmin(gh: GitHubStore, user: GitHubUser, repo: GitHubRepo): boolean {\n if (repo.owner_type === \"User\" && repo.owner_id === user.id) return true;\n if (repo.owner_type === \"Organization\" && isOrgMember(gh, user.id, repo.owner_id)) return true;\n const collab = gh.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === user.id);\n return collab?.permission === \"admin\" || collab?.permission === \"maintain\";\n}\n\nexport function assertRepoAdmin(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): GitHubUser {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n if (hasRepoAdmin(gh, user, repo)) return user;\n throw forbidden();\n}\n\nexport function assertRepoWrite(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): GitHubUser {\n const user = assertAuthenticatedUser(gh, authUser);\n if (!repo.private) return user;\n if (!canAccessRepo(gh, authUser, repo)) throw forbidden();\n return user;\n}\n\nexport function assertIssueWrite(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): GitHubUser {\n const user = assertAuthenticatedUser(gh, authUser);\n if (!repo.private) return user;\n if (!canAccessRepo(gh, authUser, repo)) throw forbidden();\n return user;\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader, unauthorized } from \"@emulators/core\";\nimport { assertAuthenticatedUser, canAccessRepo, notFoundResponse } from \"../route-helpers.js\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubRepo, GitHubUser } from \"../entities.js\";\nimport { formatOrgBrief, formatRepo, formatUser, formatUserFull } from \"../helpers.js\";\n\nfunction listReposForUser(gh: GitHubStore, user: GitHubUser, type: \"all\" | \"owner\" | \"member\"): GitHubRepo[] {\n const owned = gh.repos.all().filter((r) => r.owner_id === user.id && r.owner_type === \"User\");\n const member = gh.collaborators\n .findBy(\"user_id\", user.id)\n .map((c) => gh.repos.get(c.repo_id))\n .filter((r): r is GitHubRepo => Boolean(r))\n .filter((r) => !(r.owner_id === user.id && r.owner_type === \"User\"));\n\n if (type === \"owner\") return owned;\n if (type === \"member\") return member;\n\n const map = new Map<number, GitHubRepo>();\n for (const r of owned) map.set(r.id, r);\n for (const r of member) map.set(r.id, r);\n return Array.from(map.values());\n}\n\nfunction sortRepos(\n repos: GitHubRepo[],\n sort: \"created\" | \"updated\" | \"pushed\" | \"full_name\",\n direction: \"asc\" | \"desc\",\n): GitHubRepo[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const sorted = [...repos];\n sorted.sort((a, b) => {\n if (sort === \"full_name\") {\n return a.full_name.localeCompare(b.full_name) * mul;\n }\n const field = sort === \"created\" ? \"created_at\" : sort === \"updated\" ? \"updated_at\" : \"pushed_at\";\n const av = a[field] ?? \"\";\n const bv = b[field] ?? \"\";\n if (av < bv) return -1 * mul;\n if (av > bv) return 1 * mul;\n return 0;\n });\n return sorted;\n}\n\nfunction orgsForUser(gh: GitHubStore, userId: number) {\n const memberships = gh.teamMembers.findBy(\"user_id\", userId);\n const orgIds = new Set<number>();\n for (const m of memberships) {\n const team = gh.teams.get(m.team_id);\n if (team) orgIds.add(team.org_id);\n }\n const orgs = [...orgIds].map((id) => gh.orgs.get(id)).filter((o): o is NonNullable<typeof o> => Boolean(o));\n orgs.sort((a, b) => a.login.localeCompare(b.login));\n return orgs;\n}\n\nexport function usersRoutes({ app, store, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/user\", (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n throw unauthorized();\n }\n const user = gh.users.findOneBy(\"login\", authUser.login);\n if (!user) {\n throw notFoundResponse();\n }\n return c.json(formatUserFull(user, baseUrl));\n });\n\n app.patch(\"/user\", async (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n throw unauthorized();\n }\n const existing = gh.users.findOneBy(\"login\", authUser.login);\n if (!existing) {\n throw notFoundResponse();\n }\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubUser> = {};\n\n if (\"name\" in body) {\n if (body.name === null) patch.name = null;\n else if (typeof body.name === \"string\") patch.name = body.name;\n }\n if (\"email\" in body) {\n if (body.email === null) patch.email = null;\n else if (typeof body.email === \"string\") patch.email = body.email;\n }\n if (\"blog\" in body && typeof body.blog === \"string\") {\n patch.blog = body.blog;\n }\n if (\"twitter_username\" in body) {\n if (body.twitter_username === null) patch.twitter_username = null;\n else if (typeof body.twitter_username === \"string\") {\n patch.twitter_username = body.twitter_username;\n }\n }\n if (\"company\" in body) {\n if (body.company === null) patch.company = null;\n else if (typeof body.company === \"string\") patch.company = body.company;\n }\n if (\"location\" in body) {\n if (body.location === null) patch.location = null;\n else if (typeof body.location === \"string\") patch.location = body.location;\n }\n if (\"hireable\" in body) {\n if (body.hireable === null) patch.hireable = null;\n else if (typeof body.hireable === \"boolean\") patch.hireable = body.hireable;\n }\n if (\"bio\" in body) {\n if (body.bio === null) patch.bio = null;\n else if (typeof body.bio === \"string\") patch.bio = body.bio;\n }\n\n const updated = gh.users.update(existing.id, patch);\n if (!updated) {\n throw notFoundResponse();\n }\n return c.json(formatUserFull(updated, baseUrl));\n });\n\n app.get(\"/user/repos\", (c) => {\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n\n const typeRaw = (c.req.query(\"type\") ?? \"all\").toLowerCase();\n if (typeRaw !== \"all\" && typeRaw !== \"owner\" && typeRaw !== \"member\") {\n throw new ApiError(422, \"Invalid type parameter\");\n }\n const type = typeRaw as \"all\" | \"owner\" | \"member\";\n\n const sortRaw = (c.req.query(\"sort\") ?? \"full_name\").toLowerCase();\n if (sortRaw !== \"created\" && sortRaw !== \"updated\" && sortRaw !== \"pushed\" && sortRaw !== \"full_name\") {\n throw new ApiError(422, \"Invalid sort parameter\");\n }\n const sort = sortRaw as \"created\" | \"updated\" | \"pushed\" | \"full_name\";\n\n const direction =\n (c.req.query(\"direction\")?.toLowerCase() as \"asc\" | \"desc\" | undefined) ??\n (sort === \"full_name\" ? \"asc\" : \"desc\");\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw new ApiError(422, \"Invalid direction parameter\");\n }\n\n const { page, per_page } = parsePagination(c);\n const allRepos = sortRepos(listReposForUser(gh, user, type), sort, direction).filter((r) =>\n canAccessRepo(gh, authUser, r),\n );\n const total = allRepos.length;\n const start = (page - 1) * per_page;\n const items = allRepos.slice(start, start + per_page).map((r) => formatRepo(r, gh, baseUrl));\n\n setLinkHeader(c, total, page, per_page);\n return c.json(items);\n });\n\n app.get(\"/users\", (c) => {\n const since = Math.max(0, parseInt(c.req.query(\"since\") ?? \"0\", 10) || 0);\n const perPage = Math.min(100, Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30));\n\n const ordered = gh.users\n .all()\n .filter((u) => u.id > since)\n .sort((a, b) => a.id - b.id);\n const page = ordered.slice(0, perPage);\n\n if (page.length === perPage && ordered.length > perPage) {\n const lastId = page[page.length - 1]!.id;\n const nextUrl = new URL(c.req.url);\n nextUrl.searchParams.set(\"since\", String(lastId));\n nextUrl.searchParams.set(\"per_page\", String(perPage));\n c.header(\"Link\", `<${nextUrl.toString()}>; rel=\"next\"`);\n }\n\n return c.json(page.map((u) => formatUser(u, baseUrl)));\n });\n\n app.get(\"/users/:username/repos\", (c) => {\n const username = c.req.param(\"username\")!;\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n throw notFoundResponse();\n }\n\n const typeRaw = (c.req.query(\"type\") ?? \"owner\").toLowerCase();\n if (typeRaw !== \"all\" && typeRaw !== \"owner\" && typeRaw !== \"member\") {\n throw new ApiError(422, \"Invalid type parameter\");\n }\n const type = typeRaw as \"all\" | \"owner\" | \"member\";\n\n const sortRaw = (c.req.query(\"sort\") ?? \"full_name\").toLowerCase();\n if (sortRaw !== \"created\" && sortRaw !== \"updated\" && sortRaw !== \"pushed\" && sortRaw !== \"full_name\") {\n throw new ApiError(422, \"Invalid sort parameter\");\n }\n const sort = sortRaw as \"created\" | \"updated\" | \"pushed\" | \"full_name\";\n\n const direction =\n (c.req.query(\"direction\")?.toLowerCase() as \"asc\" | \"desc\" | undefined) ??\n (sort === \"full_name\" ? \"asc\" : \"desc\");\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw new ApiError(422, \"Invalid direction parameter\");\n }\n\n const { page, per_page } = parsePagination(c);\n const allRepos = sortRepos(listReposForUser(gh, user, type), sort, direction);\n const total = allRepos.length;\n const start = (page - 1) * per_page;\n const items = allRepos.slice(start, start + per_page).map((r) => formatRepo(r, gh, baseUrl));\n\n setLinkHeader(c, total, page, per_page);\n return c.json(items);\n });\n\n app.get(\"/users/:username/orgs\", (c) => {\n const username = c.req.param(\"username\")!;\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n throw notFoundResponse();\n }\n\n const orgs = orgsForUser(gh, user.id);\n return c.json(orgs.map((o) => formatOrgBrief(o, baseUrl)));\n });\n\n app.get(\"/users/:username/followers\", (c) => {\n const username = c.req.param(\"username\")!;\n if (!gh.users.findOneBy(\"login\", username)) {\n throw notFoundResponse();\n }\n\n const { page, per_page } = parsePagination(c);\n setLinkHeader(c, 0, page, per_page);\n return c.json([]);\n });\n\n app.get(\"/users/:username/following\", (c) => {\n const username = c.req.param(\"username\")!;\n if (!gh.users.findOneBy(\"login\", username)) {\n throw notFoundResponse();\n }\n\n const { page, per_page } = parsePagination(c);\n setLinkHeader(c, 0, page, per_page);\n return c.json([]);\n });\n\n app.get(\"/users/:username/hovercard\", (c) => {\n const username = c.req.param(\"username\")!;\n if (!gh.users.findOneBy(\"login\", username)) {\n throw notFoundResponse();\n }\n\n return c.json({ contexts: [] });\n });\n\n app.get(\"/users/:username\", (c) => {\n const username = c.req.param(\"username\")!;\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n throw notFoundResponse();\n }\n return c.json(formatUserFull(user, baseUrl));\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport { ApiError, forbidden, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoRead,\n hasRepoAdmin,\n isOrgMember,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBlob,\n GitHubBranch,\n GitHubCollaborator,\n GitHubCommit,\n GitHubRef,\n GitHubRepo,\n GitHubTag,\n GitHubTree,\n GitHubUser,\n} from \"../entities.js\";\nimport type { Collection, Entity } from \"@emulators/core\";\nimport { formatRepo, formatUser, generateNodeId, generateSha, lookupOwner, lookupRepo, timestamp } from \"../helpers.js\";\n\nconst LICENSE_TEMPLATES: Record<string, { key: string; name: string; spdx_id: string }> = {\n mit: { key: \"mit\", name: \"MIT License\", spdx_id: \"MIT\" },\n \"apache-2.0\": { key: \"apache-2.0\", name: \"Apache License 2.0\", spdx_id: \"Apache-2.0\" },\n \"gpl-3.0\": { key: \"gpl-3.0\", name: \"GNU General Public License v3.0\", spdx_id: \"GPL-3.0\" },\n \"bsd-3-clause\": {\n key: \"bsd-3-clause\",\n name: 'BSD 3-Clause \"New\" or \"Revised\" License',\n spdx_id: \"BSD-3-Clause\",\n },\n unlicense: { key: \"unlicense\", name: \"The Unlicense\", spdx_id: \"Unlicense\" },\n};\n\nfunction resolveLicenseTemplate(template: string) {\n const key = template.trim().toLowerCase();\n return LICENSE_TEMPLATES[key] ?? null;\n}\n\nfunction validateRepoName(name: unknown): string {\n if (typeof name !== \"string\" || !name.trim()) {\n throw new ApiError(422, \"Invalid repository name\");\n }\n const trimmed = name.trim();\n if (trimmed.length > 100 || !/^[a-zA-Z0-9._-]+$/.test(trimmed)) {\n throw new ApiError(422, \"Invalid repository name\");\n }\n return trimmed;\n}\n\nfunction seedInitialGit(gh: GitHubStore, repo: GitHubRepo, actor: GitHubUser | null, readmeTitle?: string) {\n const repoId = repo.id;\n const readme = `# ${readmeTitle ?? repo.name}\\n`;\n const size = Buffer.byteLength(readme, \"utf8\");\n\n const blob = gh.blobs.insert({\n repo_id: repoId,\n sha: generateSha(),\n node_id: \"\",\n content: readme,\n encoding: \"utf-8\",\n size,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n\n const tree = gh.trees.insert({\n repo_id: repoId,\n sha: generateSha(),\n node_id: \"\",\n tree: [{ path: \"README.md\", mode: \"100644\", type: \"blob\", sha: blob.sha }],\n truncated: false,\n } as Omit<GitHubTree, \"id\" | \"created_at\" | \"updated_at\">);\n gh.trees.update(tree.id, { node_id: generateNodeId(\"Tree\", tree.id) });\n\n const authorName = actor?.name ?? actor?.login ?? \"User\";\n const login = actor?.login ?? \"user\";\n const email = actor?.email ?? `${login}@users.noreply.github.com`;\n const now = timestamp();\n\n const commit = gh.commits.insert({\n repo_id: repoId,\n sha: generateSha(),\n node_id: \"\",\n message: \"Initial commit\",\n author_name: authorName,\n author_email: email,\n author_date: now,\n committer_name: authorName,\n committer_email: email,\n committer_date: now,\n tree_sha: tree.sha,\n parent_shas: [],\n user_id: actor?.id ?? null,\n } as Omit<GitHubCommit, \"id\" | \"created_at\" | \"updated_at\">);\n gh.commits.update(commit.id, { node_id: generateNodeId(\"Commit\", commit.id) });\n\n gh.branches.insert({\n repo_id: repoId,\n name: repo.default_branch,\n sha: commit.sha,\n protected: false,\n } as Omit<GitHubBranch, \"id\" | \"created_at\" | \"updated_at\">);\n\n const ref = gh.refs.insert({\n repo_id: repoId,\n ref: `refs/heads/${repo.default_branch}`,\n sha: commit.sha,\n node_id: \"\",\n } as Omit<GitHubRef, \"id\" | \"created_at\" | \"updated_at\">);\n gh.refs.update(ref.id, { node_id: generateNodeId(\"Ref\", ref.id) });\n\n gh.repos.update(repo.id, {\n size,\n pushed_at: now,\n language: \"Markdown\",\n languages: { Markdown: size },\n });\n}\n\nfunction bumpPublicRepos(gh: GitHubStore, ownerId: number, ownerType: \"User\" | \"Organization\", delta: number) {\n if (delta === 0) return;\n if (ownerType === \"User\") {\n const u = gh.users.get(ownerId);\n if (u) gh.users.update(ownerId, { public_repos: Math.max(0, u.public_repos + delta) });\n } else {\n const o = gh.orgs.get(ownerId);\n if (o) gh.orgs.update(ownerId, { public_repos: Math.max(0, o.public_repos + delta) });\n }\n}\n\ntype CreateRepoRecordParams = {\n name: unknown;\n description: string | null;\n private: boolean;\n homepage: string | null;\n has_issues: boolean;\n has_wiki: boolean;\n has_projects: boolean;\n auto_init: boolean;\n license_template: string | null | undefined;\n gitignore_template: string | null | undefined;\n owner_id: number;\n owner_type: \"User\" | \"Organization\";\n owner_login: string;\n default_branch: string;\n baseUrl: string;\n allow_rebase_merge?: boolean;\n allow_squash_merge?: boolean;\n allow_merge_commit?: boolean;\n delete_branch_on_merge?: boolean;\n};\n\nfunction createRepoRecord(gh: GitHubStore, params: CreateRepoRecordParams, actor: GitHubUser): GitHubRepo {\n const name = validateRepoName(params.name);\n const fullName = `${params.owner_login}/${name}`;\n if (gh.repos.findOneBy(\"full_name\", fullName)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n\n const isPrivate = params.private;\n const visibility = isPrivate ? \"private\" : (\"public\" as GitHubRepo[\"visibility\"]);\n\n const license = typeof params.license_template === \"string\" ? resolveLicenseTemplate(params.license_template) : null;\n\n const repo = gh.repos.insert({\n node_id: \"\",\n name,\n full_name: fullName,\n owner_id: params.owner_id,\n owner_type: params.owner_type,\n private: isPrivate,\n description: params.description,\n fork: false,\n forked_from_id: null,\n homepage: params.homepage,\n language: null,\n languages: {},\n forks_count: 0,\n stargazers_count: 0,\n watchers_count: 0,\n size: 0,\n default_branch: params.default_branch,\n open_issues_count: 0,\n topics: [],\n has_issues: params.has_issues,\n has_projects: params.has_projects,\n has_wiki: params.has_wiki,\n has_pages: false,\n has_downloads: true,\n has_discussions: false,\n archived: false,\n disabled: false,\n visibility,\n pushed_at: null,\n allow_rebase_merge: params.allow_rebase_merge ?? true,\n allow_squash_merge: params.allow_squash_merge ?? true,\n allow_merge_commit: params.allow_merge_commit ?? true,\n allow_auto_merge: false,\n delete_branch_on_merge: params.delete_branch_on_merge ?? false,\n allow_forking: true,\n is_template: false,\n license,\n } as Omit<GitHubRepo, \"id\" | \"created_at\" | \"updated_at\">);\n\n gh.repos.update(repo.id, { node_id: generateNodeId(\"Repository\", repo.id) });\n\n if (!isPrivate) {\n bumpPublicRepos(gh, params.owner_id, params.owner_type, 1);\n }\n\n const updated = gh.repos.get(repo.id)!;\n if (params.auto_init) {\n seedInitialGit(gh, updated, actor);\n }\n\n return gh.repos.get(repo.id)!;\n}\n\nfunction deleteRepoCascade(gh: GitHubStore, repo: GitHubRepo) {\n const repoId = repo.id;\n const wasPublic = !repo.private;\n\n const delByRepo = <T extends Entity>(col: Collection<T>) => {\n for (const item of col.findBy(\"repo_id\" as keyof T, repoId as T[keyof T])) {\n col.delete(item.id);\n }\n };\n\n delByRepo(gh.collaborators);\n delByRepo(gh.issues);\n delByRepo(gh.pullRequests);\n delByRepo(gh.labels);\n delByRepo(gh.milestones);\n delByRepo(gh.comments);\n delByRepo(gh.reviews);\n delByRepo(gh.issueEvents);\n delByRepo(gh.branches);\n delByRepo(gh.branchProtections);\n delByRepo(gh.refs);\n delByRepo(gh.commits);\n delByRepo(gh.trees);\n delByRepo(gh.blobs);\n delByRepo(gh.tags);\n\n for (const rel of gh.releases.findBy(\"repo_id\", repoId)) {\n for (const a of gh.releaseAssets.findBy(\"release_id\", rel.id)) {\n gh.releaseAssets.delete(a.id);\n }\n gh.releases.delete(rel.id);\n }\n\n delByRepo(gh.webhooks);\n delByRepo(gh.workflows);\n for (const run of gh.workflowRuns.findBy(\"repo_id\", repoId)) {\n for (const j of gh.jobs.findBy(\"run_id\", run.id)) {\n gh.jobs.delete(j.id);\n }\n for (const a of gh.artifacts.findBy(\"run_id\", run.id)) {\n gh.artifacts.delete(a.id);\n }\n gh.workflowRuns.delete(run.id);\n }\n\n delByRepo(gh.secrets);\n delByRepo(gh.checkRuns);\n delByRepo(gh.checkSuites);\n\n gh.repos.delete(repoId);\n\n if (wasPublic) {\n bumpPublicRepos(gh, repo.owner_id, repo.owner_type, -1);\n }\n\n if (repo.forked_from_id) {\n const parent = gh.repos.get(repo.forked_from_id);\n if (parent && parent.forks_count > 0) {\n gh.repos.update(parent.id, { forks_count: parent.forks_count - 1 });\n }\n }\n}\n\nfunction formatTagItem(tag: GitHubTag, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n name: tag.tag,\n zipball_url: `${repoUrl}/zipball/${encodeURIComponent(tag.tag)}`,\n tarball_url: `${repoUrl}/tarball/${encodeURIComponent(tag.tag)}`,\n commit: {\n sha: tag.sha,\n url: `${repoUrl}/commits/${tag.sha}`,\n },\n node_id: tag.node_id,\n };\n}\n\nfunction parsePermission(raw: unknown): \"pull\" | \"triage\" | \"push\" | \"maintain\" | \"admin\" | undefined {\n if (raw === undefined) return undefined;\n if (raw === \"pull\" || raw === \"triage\" || raw === \"push\" || raw === \"maintain\" || raw === \"admin\") {\n return raw;\n }\n return undefined;\n}\n\nexport function reposRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n return c.json(formatRepo(repo, gh, baseUrl));\n });\n\n app.post(\"/user/repos\", async (c) => {\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n const body = await parseJsonBody(c);\n\n const finalRepo = createRepoRecord(\n gh,\n {\n name: body.name,\n description: typeof body.description === \"string\" ? body.description : null,\n private: typeof body.private === \"boolean\" ? body.private : false,\n homepage: typeof body.homepage === \"string\" ? body.homepage : null,\n has_issues: typeof body.has_issues === \"boolean\" ? body.has_issues : true,\n has_projects: typeof body.has_projects === \"boolean\" ? body.has_projects : true,\n has_wiki: typeof body.has_wiki === \"boolean\" ? body.has_wiki : true,\n auto_init: body.auto_init === true,\n license_template: typeof body.license_template === \"string\" ? body.license_template : undefined,\n gitignore_template: typeof body.gitignore_template === \"string\" ? body.gitignore_template : undefined,\n owner_id: user.id,\n owner_type: \"User\",\n owner_login: user.login,\n default_branch: \"main\",\n baseUrl,\n allow_rebase_merge: typeof body.allow_rebase_merge === \"boolean\" ? body.allow_rebase_merge : undefined,\n allow_squash_merge: typeof body.allow_squash_merge === \"boolean\" ? body.allow_squash_merge : undefined,\n allow_merge_commit: typeof body.allow_merge_commit === \"boolean\" ? body.allow_merge_commit : undefined,\n delete_branch_on_merge:\n typeof body.delete_branch_on_merge === \"boolean\" ? body.delete_branch_on_merge : undefined,\n },\n user,\n );\n\n webhooks.dispatch(\n \"repository\",\n \"created\",\n { action: \"created\", repository: formatRepo(finalRepo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n user.login,\n finalRepo.name,\n );\n\n return c.json(formatRepo(finalRepo, gh, baseUrl), 201);\n });\n\n app.post(\"/orgs/:org/repos\", async (c) => {\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n const orgLogin = c.req.param(\"org\")!;\n const org = gh.orgs.findOneBy(\"login\", orgLogin);\n if (!org) throw notFoundResponse();\n\n if (!isOrgMember(gh, user.id, org.id)) {\n throw forbidden();\n }\n\n const body = await parseJsonBody(c);\n\n const finalRepo = createRepoRecord(\n gh,\n {\n name: body.name,\n description: typeof body.description === \"string\" ? body.description : null,\n private: typeof body.private === \"boolean\" ? body.private : false,\n homepage: typeof body.homepage === \"string\" ? body.homepage : null,\n has_issues: typeof body.has_issues === \"boolean\" ? body.has_issues : true,\n has_projects: typeof body.has_projects === \"boolean\" ? body.has_projects : true,\n has_wiki: typeof body.has_wiki === \"boolean\" ? body.has_wiki : true,\n auto_init: body.auto_init === true,\n license_template: typeof body.license_template === \"string\" ? body.license_template : undefined,\n gitignore_template: typeof body.gitignore_template === \"string\" ? body.gitignore_template : undefined,\n owner_id: org.id,\n owner_type: \"Organization\",\n owner_login: org.login,\n default_branch: \"main\",\n baseUrl,\n allow_rebase_merge: typeof body.allow_rebase_merge === \"boolean\" ? body.allow_rebase_merge : undefined,\n allow_squash_merge: typeof body.allow_squash_merge === \"boolean\" ? body.allow_squash_merge : undefined,\n allow_merge_commit: typeof body.allow_merge_commit === \"boolean\" ? body.allow_merge_commit : undefined,\n delete_branch_on_merge:\n typeof body.delete_branch_on_merge === \"boolean\" ? body.delete_branch_on_merge : undefined,\n },\n user,\n );\n\n webhooks.dispatch(\n \"repository\",\n \"created\",\n { action: \"created\", repository: formatRepo(finalRepo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n org.login,\n finalRepo.name,\n );\n\n return c.json(formatRepo(finalRepo, gh, baseUrl), 201);\n });\n\n app.patch(\"/repos/:owner/:repo\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, user, repo)) throw forbidden();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubRepo> = {};\n\n if (typeof body.name === \"string\") {\n const newName = validateRepoName(body.name);\n const login = ownerLoginOf(gh, repo);\n const newFull = `${login}/${newName}`;\n if (newFull !== repo.full_name && gh.repos.findOneBy(\"full_name\", newFull)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n patch.name = newName;\n patch.full_name = newFull;\n }\n\n if (\"description\" in body) {\n patch.description = body.description === null ? null : String(body.description);\n }\n if (\"homepage\" in body && (typeof body.homepage === \"string\" || body.homepage === null)) {\n patch.homepage = body.homepage;\n }\n if (typeof body.private === \"boolean\") {\n patch.private = body.private;\n patch.visibility = body.private ? \"private\" : \"public\";\n }\n if (typeof body.has_issues === \"boolean\") patch.has_issues = body.has_issues;\n if (typeof body.has_projects === \"boolean\") patch.has_projects = body.has_projects;\n if (typeof body.has_wiki === \"boolean\") patch.has_wiki = body.has_wiki;\n if (typeof body.has_pages === \"boolean\") patch.has_pages = body.has_pages;\n if (typeof body.has_downloads === \"boolean\") patch.has_downloads = body.has_downloads;\n if (typeof body.has_discussions === \"boolean\") patch.has_discussions = body.has_discussions;\n if (typeof body.archived === \"boolean\") patch.archived = body.archived;\n if (typeof body.disabled === \"boolean\") patch.disabled = body.disabled;\n if (typeof body.default_branch === \"string\") patch.default_branch = body.default_branch;\n\n if (Array.isArray(body.topics)) {\n patch.topics = body.topics.filter((t): t is string => typeof t === \"string\");\n }\n\n if (typeof body.visibility === \"string\") {\n const v = body.visibility;\n if (v === \"public\" || v === \"private\" || v === \"internal\") {\n patch.visibility = v;\n patch.private = v !== \"public\";\n }\n }\n\n if (\"license\" in body) {\n if (body.license === null) patch.license = null;\n else if (typeof body.license === \"object\" && body.license !== null) {\n const L = body.license as Record<string, unknown>;\n if (typeof L.key === \"string\" && typeof L.name === \"string\" && typeof L.spdx_id === \"string\") {\n patch.license = { key: L.key, name: L.name, spdx_id: L.spdx_id };\n }\n }\n }\n\n if (typeof body.allow_rebase_merge === \"boolean\") patch.allow_rebase_merge = body.allow_rebase_merge;\n if (typeof body.allow_squash_merge === \"boolean\") patch.allow_squash_merge = body.allow_squash_merge;\n if (typeof body.allow_merge_commit === \"boolean\") patch.allow_merge_commit = body.allow_merge_commit;\n if (typeof body.allow_auto_merge === \"boolean\") patch.allow_auto_merge = body.allow_auto_merge;\n if (typeof body.delete_branch_on_merge === \"boolean\") {\n patch.delete_branch_on_merge = body.delete_branch_on_merge;\n }\n if (typeof body.allow_forking === \"boolean\") patch.allow_forking = body.allow_forking;\n if (typeof body.is_template === \"boolean\") patch.is_template = body.is_template;\n\n const oldPrivate = repo.private;\n const updated = gh.repos.update(repo.id, patch);\n if (!updated) throw notFoundResponse();\n\n if (oldPrivate !== updated.private) {\n const delta = updated.private ? -1 : 1;\n bumpPublicRepos(gh, updated.owner_id, updated.owner_type, delta);\n }\n\n webhooks.dispatch(\n \"repository\",\n \"edited\",\n { action: \"edited\", repository: formatRepo(updated, gh, baseUrl), sender: formatUser(user, baseUrl) },\n ownerLoginOf(gh, updated),\n updated.name,\n );\n\n return c.json(formatRepo(updated, gh, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, user, repo)) throw forbidden();\n\n webhooks.dispatch(\n \"repository\",\n \"deleted\",\n { action: \"deleted\", repository: formatRepo(repo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n owner,\n repoName,\n );\n\n deleteRepoCascade(gh, repo);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/topics\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n return c.json({ names: repo.topics });\n });\n\n app.put(\"/repos/:owner/:repo/topics\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, user, repo)) throw forbidden();\n\n const body = (await parseJsonBody(c)) as { names?: unknown };\n const names = Array.isArray(body.names) ? body.names.filter((n): n is string => typeof n === \"string\") : [];\n const updated = gh.repos.update(repo.id, { topics: names });\n if (!updated) throw notFoundResponse();\n return c.json({ names: updated.topics });\n });\n\n app.get(\"/repos/:owner/:repo/languages\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n return c.json(repo.languages);\n });\n\n app.get(\"/repos/:owner/:repo/contributors\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const collabUsers = gh.collaborators\n .findBy(\"repo_id\", repo.id)\n .map((col) => gh.users.get(col.user_id))\n .filter((u): u is GitHubUser => Boolean(u));\n\n const ownerUser = repo.owner_type === \"User\" ? gh.users.get(repo.owner_id) : undefined;\n\n const map = new Map<number, GitHubUser>();\n if (ownerUser) map.set(ownerUser.id, ownerUser);\n for (const u of collabUsers) map.set(u.id, u);\n\n const all = [...map.values()].sort((a, b) => a.login.localeCompare(b.login));\n const { page, per_page } = parsePagination(c);\n const total = all.length;\n const start = (page - 1) * per_page;\n const slice = all.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(\n slice.map((u) => ({\n ...formatUser(u, baseUrl),\n contributions: 1,\n })),\n );\n });\n\n app.get(\"/repos/:owner/:repo/forks\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const forks = gh.repos\n .all()\n .filter((r) => r.forked_from_id === repo.id)\n .sort((a, b) => (a.created_at < b.created_at ? 1 : -1));\n\n const { page, per_page } = parsePagination(c);\n const total = forks.length;\n const start = (page - 1) * per_page;\n const slice = forks.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((r) => formatRepo(r, gh, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/forks\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const parent = lookupRepo(gh, owner, repoName);\n if (!parent) throw notFoundResponse();\n\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n assertRepoRead(gh, authUser, parent);\n\n const body = (await parseJsonBody(c)) as {\n organization?: unknown;\n name?: unknown;\n };\n\n let ownerType: \"User\" | \"Organization\" = \"User\";\n let ownerId = user.id;\n let fullName = \"\";\n const forkName = typeof body.name === \"string\" && body.name.trim() ? validateRepoName(body.name) : parent.name;\n\n if (typeof body.organization === \"string\" && body.organization.trim()) {\n const org = gh.orgs.findOneBy(\"login\", body.organization.trim());\n if (!org) throw notFoundResponse();\n if (!isOrgMember(gh, user.id, org.id)) throw forbidden();\n ownerType = \"Organization\";\n ownerId = org.id;\n fullName = `${org.login}/${forkName}`;\n } else {\n fullName = `${user.login}/${forkName}`;\n }\n\n if (gh.repos.findOneBy(\"full_name\", fullName)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n\n const isPrivate = parent.private;\n const visibility = isPrivate ? \"private\" : \"public\";\n\n const repo = gh.repos.insert({\n node_id: \"\",\n name: forkName,\n full_name: fullName,\n owner_id: ownerId,\n owner_type: ownerType,\n private: isPrivate,\n description: parent.description,\n fork: true,\n forked_from_id: parent.id,\n homepage: parent.homepage,\n language: parent.language,\n languages: { ...parent.languages },\n forks_count: 0,\n stargazers_count: 0,\n watchers_count: 0,\n size: parent.size,\n default_branch: parent.default_branch,\n open_issues_count: 0,\n topics: [...parent.topics],\n has_issues: parent.has_issues,\n has_projects: parent.has_projects,\n has_wiki: parent.has_wiki,\n has_pages: parent.has_pages,\n has_downloads: parent.has_downloads,\n has_discussions: parent.has_discussions,\n archived: false,\n disabled: false,\n visibility: visibility as GitHubRepo[\"visibility\"],\n pushed_at: parent.pushed_at,\n allow_rebase_merge: parent.allow_rebase_merge,\n allow_squash_merge: parent.allow_squash_merge,\n allow_merge_commit: parent.allow_merge_commit,\n allow_auto_merge: parent.allow_auto_merge,\n delete_branch_on_merge: parent.delete_branch_on_merge,\n allow_forking: parent.allow_forking,\n is_template: false,\n license: parent.license,\n } as Omit<GitHubRepo, \"id\" | \"created_at\" | \"updated_at\">);\n\n gh.repos.update(repo.id, { node_id: generateNodeId(\"Repository\", repo.id) });\n\n if (!isPrivate) {\n bumpPublicRepos(gh, ownerId, ownerType, 1);\n }\n\n gh.repos.update(parent.id, { forks_count: parent.forks_count + 1 });\n\n seedInitialGit(gh, gh.repos.get(repo.id)!, user, parent.full_name);\n\n const finalRepo = gh.repos.get(repo.id)!;\n const ownerLogin = ownerLoginOf(gh, finalRepo);\n webhooks.dispatch(\n \"fork\",\n \"created\",\n { action: \"created\", repository: formatRepo(finalRepo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n ownerLogin,\n finalRepo.name,\n );\n\n return c.json(formatRepo(finalRepo, gh, baseUrl), 202);\n });\n\n app.get(\"/repos/:owner/:repo/collaborators\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const collabs = gh.collaborators.findBy(\"repo_id\", repo.id);\n const users = collabs\n .map((col) => {\n const u = gh.users.get(col.user_id);\n if (!u) return null;\n return { user: u, permission: col.permission };\n })\n .filter((x): x is { user: GitHubUser; permission: GitHubCollaborator[\"permission\"] } => Boolean(x))\n .sort((a, b) => a.user.login.localeCompare(b.user.login));\n\n const { page, per_page } = parsePagination(c);\n const total = users.length;\n const start = (page - 1) * per_page;\n const slice = users.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((x) => formatUser(x.user, baseUrl)));\n });\n\n app.put(\"/repos/:owner/:repo/collaborators/:username\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const username = c.req.param(\"username\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const actor = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, actor, repo)) throw forbidden();\n\n const target = gh.users.findOneBy(\"login\", username);\n if (!target) throw notFoundResponse();\n\n const body = (await parseJsonBody(c)) as { permission?: unknown };\n const permission = parsePermission(body.permission) ?? \"push\";\n\n const existing = gh.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === target.id);\n if (existing) {\n gh.collaborators.update(existing.id, { permission });\n } else {\n gh.collaborators.insert({\n repo_id: repo.id,\n user_id: target.id,\n permission,\n } as Omit<GitHubCollaborator, \"id\" | \"created_at\" | \"updated_at\">);\n }\n\n return c.json({ permission }, 201);\n });\n\n app.delete(\"/repos/:owner/:repo/collaborators/:username\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const username = c.req.param(\"username\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const actor = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, actor, repo)) throw forbidden();\n\n const target = gh.users.findOneBy(\"login\", username);\n if (!target) throw notFoundResponse();\n\n const existing = gh.collaborators.findBy(\"repo_id\", repo.id).find((col) => col.user_id === target.id);\n if (existing) {\n gh.collaborators.delete(existing.id);\n }\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/collaborators/:username/permission\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const username = c.req.param(\"username\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const target = gh.users.findOneBy(\"login\", username);\n if (!target) throw notFoundResponse();\n\n if (repo.owner_type === \"User\" && repo.owner_id === target.id) {\n return c.json({\n permission: \"admin\",\n role_name: \"admin\",\n user: formatUser(target, baseUrl),\n });\n }\n\n if (repo.owner_type === \"Organization\" && isOrgMember(gh, target.id, repo.owner_id)) {\n return c.json({\n permission: \"admin\",\n role_name: \"admin\",\n user: formatUser(target, baseUrl),\n });\n }\n\n const collab = gh.collaborators.findBy(\"repo_id\", repo.id).find((col) => col.user_id === target.id);\n if (!collab) throw notFoundResponse();\n\n const roleName =\n collab.permission === \"admin\"\n ? \"admin\"\n : collab.permission === \"maintain\"\n ? \"maintain\"\n : collab.permission === \"push\"\n ? \"write\"\n : collab.permission === \"triage\"\n ? \"triage\"\n : \"read\";\n\n return c.json({\n permission: collab.permission,\n role_name: roleName,\n user: formatUser(target, baseUrl),\n });\n });\n\n app.post(\"/repos/:owner/:repo/transfer\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const actor = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, actor, repo)) throw forbidden();\n\n const body = (await parseJsonBody(c)) as { new_owner?: unknown };\n if (typeof body.new_owner !== \"string\" || !body.new_owner.trim()) {\n throw new ApiError(422, \"new_owner is required\");\n }\n\n const newOwner = lookupOwner(gh, body.new_owner.trim());\n if (!newOwner) throw notFoundResponse();\n\n const newFull = `${newOwner.login}/${repo.name}`;\n if (newFull !== repo.full_name && gh.repos.findOneBy(\"full_name\", newFull)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n\n const updated = gh.repos.update(repo.id, {\n owner_id: newOwner.id,\n owner_type: newOwner.type === \"User\" ? \"User\" : \"Organization\",\n full_name: newFull,\n });\n if (!updated) throw notFoundResponse();\n\n webhooks.dispatch(\n \"repository\",\n \"transferred\",\n { action: \"transferred\", repository: formatRepo(updated, gh, baseUrl), sender: formatUser(actor, baseUrl) },\n newOwner.login,\n updated.name,\n );\n\n return c.json(formatRepo(updated, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/tags\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const tags = [...gh.tags.findBy(\"repo_id\", repo.id)].sort((a, b) => a.tag.localeCompare(b.tag));\n\n const { page, per_page } = parsePagination(c);\n const total = tags.length;\n const start = (page - 1) * per_page;\n const slice = tags.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((t) => formatTagItem(t, repo, baseUrl)));\n });\n}\n","import type { Context } from \"hono\";\nimport type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport { assertIssueWrite, assertRepoRead, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubIssue, GitHubIssueEvent, GitHubLabel, GitHubRepo, GitHubUser } from \"../entities.js\";\nimport {\n formatIssue,\n formatRepo,\n formatUser,\n generateNodeId,\n getNextIssueNumber,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\n\nfunction findIssueForRepo(gh: GitHubStore, repoId: number, issueNumber: number): GitHubIssue | undefined {\n return gh.issues.findBy(\"repo_id\", repoId).find((i) => i.number === issueNumber && !i.is_pull_request);\n}\n\nfunction adjustRepoOpenIssues(gh: GitHubStore, repoId: number, delta: number) {\n const repo = gh.repos.get(repoId);\n if (!repo) return;\n gh.repos.update(repoId, { open_issues_count: Math.max(0, repo.open_issues_count + delta) });\n}\n\nfunction getOrCreateLabel(gh: GitHubStore, repo: GitHubRepo, name: string): GitHubLabel {\n const existing = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (existing) return existing;\n const label = gh.labels.insert({\n node_id: \"\",\n repo_id: repo.id,\n name,\n description: null,\n color: \"ededed\",\n default: false,\n } as Omit<GitHubLabel, \"id\" | \"created_at\" | \"updated_at\">);\n gh.labels.update(label.id, { node_id: generateNodeId(\"Label\", label.id) });\n return gh.labels.get(label.id)!;\n}\n\nfunction resolveLabelIds(gh: GitHubStore, repo: GitHubRepo, raw: unknown, createMissing: boolean): number[] {\n if (raw === undefined) return [];\n if (!Array.isArray(raw)) {\n throw new ApiError(422, \"Validation failed\");\n }\n const ids: number[] = [];\n for (const item of raw) {\n if (typeof item === \"number\" && Number.isFinite(item)) {\n const label = gh.labels.get(item);\n if (!label || label.repo_id !== repo.id) {\n throw new ApiError(422, \"Validation failed\");\n }\n ids.push(item);\n } else if (typeof item === \"string\") {\n if (createMissing) {\n ids.push(getOrCreateLabel(gh, repo, item).id);\n } else {\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === item);\n if (!label) throw new ApiError(422, \"Validation failed\");\n ids.push(label.id);\n }\n } else {\n throw new ApiError(422, \"Validation failed\");\n }\n }\n return [...new Set(ids)];\n}\n\nfunction lookupUserByLogin(gh: GitHubStore, login: string): GitHubUser {\n const u = gh.users.findOneBy(\"login\", login);\n if (!u) throw new ApiError(422, \"Validation failed\");\n return u;\n}\n\nfunction insertIssueEvent(\n gh: GitHubStore,\n repo: GitHubRepo,\n issueNumber: number,\n event: string,\n actorId: number,\n extra?: Partial<\n Pick<GitHubIssueEvent, \"commit_id\" | \"commit_url\" | \"label_name\" | \"assignee_id\" | \"milestone_title\" | \"rename\">\n >,\n): GitHubIssueEvent {\n const row = gh.issueEvents.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: issueNumber,\n event,\n actor_id: actorId,\n commit_id: null,\n commit_url: null,\n label_name: null,\n assignee_id: null,\n milestone_title: null,\n rename: null,\n ...extra,\n } as Omit<GitHubIssueEvent, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issueEvents.update(row.id, { node_id: generateNodeId(\"IssueEvent\", row.id) });\n return gh.issueEvents.get(row.id)!;\n}\n\nfunction formatIssueEventApi(\n ev: GitHubIssueEvent,\n gh: GitHubStore,\n repo: GitHubRepo,\n issue: GitHubIssue,\n baseUrl: string,\n) {\n const actor = gh.users.get(ev.actor_id);\n const issueJson = formatIssue(issue, gh, baseUrl);\n return {\n id: ev.id,\n node_id: ev.node_id,\n url: `${baseUrl}/repos/${repo.full_name}/issues/events/${ev.id}`,\n actor: actor ? formatUser(actor, baseUrl) : null,\n event: ev.event,\n commit_id: ev.commit_id,\n commit_url: ev.commit_url,\n created_at: ev.created_at,\n label:\n ev.label_name !== null\n ? gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === ev.label_name)\n ? {\n name: ev.label_name,\n color: gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === ev.label_name)!.color,\n }\n : { name: ev.label_name, color: \"ededed\" }\n : null,\n assignee:\n ev.assignee_id !== null && gh.users.get(ev.assignee_id)\n ? formatUser(gh.users.get(ev.assignee_id)!, baseUrl)\n : null,\n milestone: null,\n rename: ev.rename,\n issue: issueJson,\n };\n}\n\nfunction sortIssues(\n issues: GitHubIssue[],\n sort: \"created\" | \"updated\" | \"comments\",\n direction: \"asc\" | \"desc\",\n): GitHubIssue[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const field = sort === \"created\" ? \"created_at\" : sort === \"updated\" ? \"updated_at\" : \"comments\";\n const sorted = [...issues];\n sorted.sort((a, b) => {\n const av = a[field];\n const bv = b[field];\n if (typeof av === \"number\" && typeof bv === \"number\") {\n return av < bv ? -1 * mul : av > bv ? 1 * mul : 0;\n }\n const as = String(av);\n const bs = String(bv);\n if (as < bs) return -1 * mul;\n if (as > bs) return 1 * mul;\n return 0;\n });\n return sorted;\n}\n\nfunction parseIssueListFilters(c: Context) {\n const stateQ = c.req.query(\"state\") ?? \"open\";\n const state: \"open\" | \"closed\" | \"all\" =\n stateQ === \"closed\" || stateQ === \"all\" || stateQ === \"open\" ? stateQ : \"open\";\n\n const labelsParam = c.req.query(\"labels\");\n const labelNames = labelsParam\n ? labelsParam\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : [];\n\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" | \"comments\" =\n sortRaw === \"updated\" || sortRaw === \"comments\" ? sortRaw : \"created\";\n\n const dirRaw = c.req.query(\"direction\") ?? \"desc\";\n const direction: \"asc\" | \"desc\" = dirRaw === \"asc\" ? \"asc\" : \"desc\";\n\n const milestoneQ = c.req.query(\"milestone\");\n const assigneeQ = c.req.query(\"assignee\");\n const creatorQ = c.req.query(\"creator\");\n const sinceQ = c.req.query(\"since\");\n\n return {\n state,\n labelNames,\n sort,\n direction,\n milestoneQ,\n assigneeQ,\n creatorQ,\n sinceQ,\n };\n}\n\nexport function issuesRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/issues\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { state, labelNames, sort, direction, milestoneQ, assigneeQ, creatorQ, sinceQ } = parseIssueListFilters(c);\n\n let list = gh.issues.findBy(\"repo_id\", repo.id).filter((i) => !i.is_pull_request);\n\n if (state === \"open\") list = list.filter((i) => i.state === \"open\");\n else if (state === \"closed\") list = list.filter((i) => i.state === \"closed\");\n\n if (labelNames.length > 0) {\n const labelIds = labelNames\n .map((name) => gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name)?.id)\n .filter((x): x is number => x !== undefined);\n if (labelIds.length !== labelNames.length) {\n return c.json([]);\n }\n list = list.filter((i) => labelIds.every((lid) => i.label_ids.includes(lid)));\n }\n\n if (milestoneQ !== undefined && milestoneQ !== \"\") {\n if (milestoneQ === \"none\") {\n list = list.filter((i) => i.milestone_id === null);\n } else if (milestoneQ === \"*\") {\n list = list.filter((i) => i.milestone_id !== null);\n } else {\n const n = parseInt(milestoneQ, 10);\n if (!Number.isFinite(n)) {\n list = [];\n } else {\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === n);\n if (!ms) list = [];\n else list = list.filter((i) => i.milestone_id === ms.id);\n }\n }\n }\n\n if (assigneeQ !== undefined && assigneeQ !== \"\") {\n if (assigneeQ === \"none\") {\n list = list.filter((i) => i.assignee_ids.length === 0);\n } else if (assigneeQ === \"*\") {\n list = list.filter((i) => i.assignee_ids.length > 0);\n } else {\n const u = gh.users.findOneBy(\"login\", assigneeQ);\n if (!u) list = [];\n else list = list.filter((i) => i.assignee_ids.includes(u.id));\n }\n }\n\n if (creatorQ !== undefined && creatorQ !== \"\") {\n const u = gh.users.findOneBy(\"login\", creatorQ);\n if (!u) list = [];\n else list = list.filter((i) => i.user_id === u.id);\n }\n\n if (sinceQ) {\n list = list.filter((i) => i.updated_at >= sinceQ);\n }\n\n list = sortIssues(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((i) => formatIssue(i, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/issues\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n\n const title = body.title;\n if (typeof title !== \"string\" || !title.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const issueBody = typeof body.body === \"string\" || body.body === null ? (body.body as string | null) : null;\n\n const assigneeLogins = Array.isArray(body.assignees)\n ? body.assignees.filter((x): x is string => typeof x === \"string\")\n : [];\n const assigneeIds = assigneeLogins.map((login) => lookupUserByLogin(gh, login).id);\n\n const labelIds = body.labels !== undefined ? resolveLabelIds(gh, repo, body.labels, true) : [];\n\n let milestoneId: number | null = null;\n if (body.milestone !== undefined && body.milestone !== null) {\n const mn = typeof body.milestone === \"number\" ? body.milestone : parseInt(String(body.milestone), 10);\n if (!Number.isFinite(mn)) throw new ApiError(422, \"Validation failed\");\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === mn);\n if (!ms) throw new ApiError(422, \"Validation failed\");\n milestoneId = ms.id;\n }\n\n const num = getNextIssueNumber(gh, repo.id);\n const row = gh.issues.insert({\n node_id: \"\",\n number: num,\n repo_id: repo.id,\n title: title.trim(),\n body: issueBody,\n state: \"open\",\n state_reason: null,\n locked: false,\n active_lock_reason: null,\n user_id: actor.id,\n assignee_ids: assigneeIds,\n label_ids: labelIds,\n milestone_id: milestoneId,\n comments: 0,\n closed_at: null,\n closed_by_id: null,\n is_pull_request: false,\n } as Omit<GitHubIssue, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issues.update(row.id, { node_id: generateNodeId(\"Issue\", row.id) });\n const issue = gh.issues.get(row.id)!;\n\n adjustRepoOpenIssues(gh, repo.id, 1);\n\n insertIssueEvent(gh, repo, issue.number, \"opened\", actor.id);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const issueFmt = formatIssue(issue, gh, baseUrl)!;\n webhooks.dispatch(\n \"issues\",\n \"opened\",\n {\n action: \"opened\",\n issue: issueFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(issueFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/issues/:issue_number\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const beforePatch = issue;\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubIssue> = {};\n\n if (typeof body.title === \"string\") patch.title = body.title;\n if (\"body\" in body) {\n patch.body = body.body === null ? null : String(body.body);\n }\n\n const oldState = issue.state;\n if (body.state === \"open\" || body.state === \"closed\") {\n patch.state = body.state;\n }\n\n if (\"state_reason\" in body) {\n if (body.state_reason === null) {\n patch.state_reason = null;\n } else if (\n body.state_reason === \"completed\" ||\n body.state_reason === \"not_planned\" ||\n body.state_reason === \"reopened\"\n ) {\n patch.state_reason = body.state_reason;\n }\n }\n\n if (Array.isArray(body.labels)) {\n patch.label_ids = resolveLabelIds(gh, repo, body.labels, true);\n }\n\n if (Array.isArray(body.assignees)) {\n const logins = body.assignees.filter((x): x is string => typeof x === \"string\");\n patch.assignee_ids = logins.map((login) => lookupUserByLogin(gh, login).id);\n }\n\n if (\"milestone\" in body) {\n if (body.milestone === null) {\n patch.milestone_id = null;\n } else {\n const mn = typeof body.milestone === \"number\" ? body.milestone : parseInt(String(body.milestone), 10);\n if (!Number.isFinite(mn)) throw new ApiError(422, \"Validation failed\");\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === mn);\n if (!ms) throw new ApiError(422, \"Validation failed\");\n patch.milestone_id = ms.id;\n }\n }\n\n const prevLabelIds = new Set(issue.label_ids);\n const prevAssigneeIds = new Set(issue.assignee_ids);\n const prevMilestoneId = issue.milestone_id;\n\n const updated = gh.issues.update(issue.id, patch);\n if (!updated) throw notFoundResponse();\n issue = updated;\n\n let statePatch: Partial<GitHubIssue> = {};\n if (patch.state === \"closed\" && oldState === \"open\") {\n statePatch = {\n closed_at: timestamp(),\n closed_by_id: actor.id,\n ...(patch.state_reason === undefined ? { state_reason: \"completed\" as const } : {}),\n };\n } else if (patch.state === \"open\" && oldState === \"closed\") {\n statePatch = {\n closed_at: null,\n closed_by_id: null,\n ...(patch.state_reason === undefined ? { state_reason: \"reopened\" as const } : {}),\n };\n } else if (patch.state === \"closed\" && oldState === \"closed\") {\n if (patch.state_reason !== undefined) statePatch.state_reason = patch.state_reason;\n }\n\n if (Object.keys(statePatch).length > 0) {\n const again = gh.issues.update(issue.id, statePatch);\n if (again) issue = again;\n }\n\n const ownerLogin = ownerLoginOf(gh, repo);\n\n if (patch.state === \"closed\" && oldState === \"open\") {\n adjustRepoOpenIssues(gh, repo.id, -1);\n insertIssueEvent(gh, repo, issue.number, \"closed\", actor.id);\n webhooks.dispatch(\n \"issues\",\n \"closed\",\n {\n action: \"closed\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n } else if (patch.state === \"open\" && oldState === \"closed\") {\n adjustRepoOpenIssues(gh, repo.id, 1);\n insertIssueEvent(gh, repo, issue.number, \"reopened\", actor.id);\n webhooks.dispatch(\n \"issues\",\n \"reopened\",\n {\n action: \"reopened\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n\n if (Array.isArray(body.labels)) {\n const newIds = new Set(issue.label_ids);\n for (const id of prevLabelIds) {\n if (!newIds.has(id)) {\n const label = gh.labels.get(id);\n insertIssueEvent(gh, repo, issue.number, \"unlabeled\", actor.id, {\n label_name: label?.name ?? null,\n });\n webhooks.dispatch(\n \"issues\",\n \"unlabeled\",\n {\n action: \"unlabeled\",\n issue: formatIssue(issue, gh, baseUrl)!,\n label: label ? { name: label.name, color: label.color } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n for (const id of newIds) {\n if (!prevLabelIds.has(id)) {\n const label = gh.labels.get(id);\n if (label) {\n insertIssueEvent(gh, repo, issue.number, \"labeled\", actor.id, { label_name: label.name });\n webhooks.dispatch(\n \"issues\",\n \"labeled\",\n {\n action: \"labeled\",\n issue: formatIssue(issue, gh, baseUrl)!,\n label: { name: label.name, color: label.color },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n }\n }\n\n if (Array.isArray(body.assignees)) {\n const newAssignees = new Set(issue.assignee_ids);\n for (const id of prevAssigneeIds) {\n if (!newAssignees.has(id)) {\n insertIssueEvent(gh, repo, issue.number, \"unassigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"unassigned\",\n {\n action: \"unassigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n for (const id of newAssignees) {\n if (!prevAssigneeIds.has(id)) {\n insertIssueEvent(gh, repo, issue.number, \"assigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"assigned\",\n {\n action: \"assigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n }\n\n if (\"milestone\" in body) {\n const newMs = issue.milestone_id;\n if (prevMilestoneId !== newMs) {\n const oldTitle = prevMilestoneId ? (gh.milestones.get(prevMilestoneId)?.title ?? null) : null;\n const newTitle = newMs ? (gh.milestones.get(newMs)?.title ?? null) : null;\n if (prevMilestoneId !== null) {\n insertIssueEvent(gh, repo, issue.number, \"demilestoned\", actor.id, {\n milestone_title: oldTitle,\n });\n webhooks.dispatch(\n \"issues\",\n \"demilestoned\",\n {\n action: \"demilestoned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n milestone: oldTitle ? { title: oldTitle } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n if (newMs !== null) {\n insertIssueEvent(gh, repo, issue.number, \"milestoned\", actor.id, {\n milestone_title: newTitle,\n });\n webhooks.dispatch(\n \"issues\",\n \"milestoned\",\n {\n action: \"milestoned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n milestone: newTitle ? { title: newTitle } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n }\n\n const titleEdited = typeof body.title === \"string\" && body.title !== beforePatch.title;\n const bodyEdited =\n \"body\" in body &&\n (body.body === null ? beforePatch.body !== null : String(body.body) !== (beforePatch.body ?? \"\"));\n if (titleEdited || bodyEdited) {\n insertIssueEvent(gh, repo, issue.number, \"edited\", actor.id);\n webhooks.dispatch(\n \"issues\",\n \"edited\",\n {\n action: \"edited\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n changes: {\n title: titleEdited,\n body: bodyEdited,\n },\n },\n ownerLogin,\n repo.name,\n );\n }\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.put(\"/repos/:owner/:repo/issues/:issue_number/lock\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const lockReason =\n typeof body.lock_reason === \"string\"\n ? body.lock_reason\n : typeof body.active_lock_reason === \"string\"\n ? body.active_lock_reason\n : \"resolved\";\n\n issue = gh.issues.update(issue.id, {\n locked: true,\n active_lock_reason: lockReason,\n })!;\n\n insertIssueEvent(gh, repo, issue.number, \"locked\", actor.id);\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"issues\",\n \"locked\",\n {\n action: \"locked\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/lock\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n issue = gh.issues.update(issue.id, { locked: false, active_lock_reason: null })!;\n\n insertIssueEvent(gh, repo, issue.number, \"unlocked\", actor.id);\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"issues\",\n \"unlocked\",\n {\n action: \"unlocked\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n function listIssueEventsForIssue(c: Context) {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n let events = gh.issueEvents.findBy(\"repo_id\", repo.id).filter((e) => e.issue_number === issueNumber);\n events.sort((a, b) => a.created_at.localeCompare(b.created_at));\n const total = events.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n events = events.slice(start, start + per_page);\n\n const payload = events.map((ev) => formatIssueEventApi(ev, gh, repo, issue, baseUrl));\n return c.json(payload);\n }\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number/timeline\", (c) => listIssueEventsForIssue(c));\n app.get(\"/repos/:owner/:repo/issues/:issue_number/events\", (c) => listIssueEventsForIssue(c));\n\n app.post(\"/repos/:owner/:repo/issues/:issue_number/assignees\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const body = (await parseJsonBody(c)) as { assignees?: unknown };\n const logins = Array.isArray(body.assignees)\n ? body.assignees.filter((x): x is string => typeof x === \"string\")\n : [];\n const addIds = logins.map((login) => lookupUserByLogin(gh, login).id);\n const prevAssigneeSet = new Set(issue.assignee_ids);\n const merged = [...new Set([...issue.assignee_ids, ...addIds])];\n issue = gh.issues.update(issue.id, { assignee_ids: merged })!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n for (const id of addIds) {\n if (prevAssigneeSet.has(id)) continue;\n insertIssueEvent(gh, repo, issue.number, \"assigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"assigned\",\n {\n action: \"assigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/assignees\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const body = (await parseJsonBody(c)) as { assignees?: unknown };\n const logins = Array.isArray(body.assignees)\n ? body.assignees.filter((x): x is string => typeof x === \"string\")\n : [];\n const removeIds = new Set(logins.map((login) => lookupUserByLogin(gh, login).id));\n const prevAssignees = new Set(issue.assignee_ids);\n const merged = issue.assignee_ids.filter((id) => !removeIds.has(id));\n issue = gh.issues.update(issue.id, { assignee_ids: merged })!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n for (const id of removeIds) {\n if (prevAssignees.has(id)) {\n insertIssueEvent(gh, repo, issue.number, \"unassigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"unassigned\",\n {\n action: \"unassigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoRead,\n assertRepoWrite,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBranch,\n GitHubCommit,\n GitHubIssue,\n GitHubPullRequest,\n GitHubRef,\n GitHubRepo,\n GitHubUser,\n} from \"../entities.js\";\nimport {\n formatPullRequest,\n formatRepo,\n formatUser,\n generateNodeId,\n generateSha,\n getNextIssueNumber,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\n\nfunction findPull(gh: GitHubStore, repoId: number, pullNumber: number): GitHubPullRequest | undefined {\n return gh.pullRequests.findBy(\"repo_id\", repoId).find((p) => p.number === pullNumber);\n}\n\nfunction findPrIssue(gh: GitHubStore, repoId: number, number: number): GitHubIssue | undefined {\n return gh.issues.findBy(\"repo_id\", repoId).find((i) => i.number === number && i.is_pull_request);\n}\n\nfunction adjustRepoOpenIssues(gh: GitHubStore, repoId: number, delta: number) {\n const repo = gh.repos.get(repoId);\n if (!repo) return;\n gh.repos.update(repoId, { open_issues_count: Math.max(0, repo.open_issues_count + delta) });\n}\n\nfunction getDefaultBranchSha(gh: GitHubStore, repo: GitHubRepo): string {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === repo.default_branch);\n if (!branch) {\n throw new ApiError(422, \"The repository is empty.\");\n }\n return branch.sha;\n}\n\nfunction createBranchAt(gh: GitHubStore, repo: GitHubRepo, branchName: string, sha: string): GitHubBranch {\n const b = gh.branches.insert({\n repo_id: repo.id,\n name: branchName,\n sha,\n protected: false,\n } as Omit<GitHubBranch, \"id\" | \"created_at\" | \"updated_at\">);\n const ref = gh.refs.insert({\n repo_id: repo.id,\n ref: `refs/heads/${branchName}`,\n sha,\n node_id: \"\",\n } as Omit<GitHubRef, \"id\" | \"created_at\" | \"updated_at\">);\n gh.refs.update(ref.id, { node_id: generateNodeId(\"Ref\", ref.id) });\n return b;\n}\n\nfunction getOrCreateBranch(gh: GitHubStore, repo: GitHubRepo, branchName: string): GitHubBranch {\n const existing = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === branchName);\n if (existing) return existing;\n const tip = getDefaultBranchSha(gh, repo);\n return createBranchAt(gh, repo, branchName, tip);\n}\n\nfunction updateBranchSha(gh: GitHubStore, repo: GitHubRepo, branchName: string, newSha: string) {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === branchName);\n if (branch) gh.branches.update(branch.id, { sha: newSha });\n const ref = gh.refs.findBy(\"repo_id\", repo.id).find((r) => r.ref === `refs/heads/${branchName}`);\n if (ref) gh.refs.update(ref.id, { sha: newSha });\n}\n\nfunction resolveHeadTarget(\n gh: GitHubStore,\n baseRepo: GitHubRepo,\n head: string,\n): { headRepo: GitHubRepo; headRef: string } {\n const trimmed = head.trim();\n if (!trimmed.includes(\":\")) {\n return { headRepo: baseRepo, headRef: trimmed };\n }\n const idx = trimmed.indexOf(\":\");\n const ownerLogin = trimmed.slice(0, idx).trim();\n const ref = trimmed.slice(idx + 1).trim();\n if (!ref) throw new ApiError(422, \"Validation failed\");\n\n const baseOwner = ownerLoginOf(gh, baseRepo);\n if (ownerLogin === baseOwner) {\n return { headRepo: baseRepo, headRef: ref };\n }\n\n const fork = gh.repos.all().find((r) => {\n if (r.forked_from_id !== baseRepo.id) return false;\n const login = r.owner_type === \"User\" ? gh.users.get(r.owner_id)?.login : gh.orgs.get(r.owner_id)?.login;\n return login === ownerLogin;\n });\n if (!fork) throw new ApiError(422, \"Validation failed\");\n return { headRepo: fork, headRef: ref };\n}\n\nfunction countCommitsBetween(gh: GitHubStore, repo: GitHubRepo, headSha: string, baseSha: string): number {\n const chain = walkCommitsToBase(gh, repo, headSha, baseSha);\n return chain.length;\n}\n\nfunction walkCommitsToBase(gh: GitHubStore, repo: GitHubRepo, headSha: string, baseSha: string): GitHubCommit[] {\n const out: GitHubCommit[] = [];\n const seen = new Set<string>();\n let cur: string | undefined = headSha;\n while (cur && !seen.has(cur)) {\n seen.add(cur);\n const commit = gh.commits.findBy(\"repo_id\", repo.id).find((c) => c.sha === cur);\n if (!commit) break;\n out.push(commit);\n if (cur === baseSha) break;\n cur = commit.parent_shas[0];\n }\n return out.reverse();\n}\n\nfunction insertCommit(\n gh: GitHubStore,\n repo: GitHubRepo,\n opts: {\n treeSha: string;\n parentShas: string[];\n message: string;\n user: GitHubUser | null;\n },\n): GitHubCommit {\n const u = opts.user;\n const authorName = u?.name ?? u?.login ?? \"User\";\n const login = u?.login ?? \"user\";\n const email = u?.email ?? `${login}@users.noreply.github.com`;\n const now = timestamp();\n const row = gh.commits.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n message: opts.message,\n author_name: authorName,\n author_email: email,\n author_date: now,\n committer_name: authorName,\n committer_email: email,\n committer_date: now,\n tree_sha: opts.treeSha,\n parent_shas: opts.parentShas,\n user_id: u?.id ?? null,\n } as Omit<GitHubCommit, \"id\" | \"created_at\" | \"updated_at\">);\n gh.commits.update(row.id, { node_id: generateNodeId(\"Commit\", row.id) });\n return gh.commits.get(row.id)!;\n}\n\nfunction formatCommitApi(commit: GitHubCommit, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n sha: commit.sha,\n node_id: commit.node_id,\n url: `${repoUrl}/commits/${commit.sha}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${commit.sha}`,\n comments_url: `${repoUrl}/comments/${commit.sha}`,\n commit: {\n url: `${repoUrl}/git/commits/${commit.sha}`,\n author: {\n name: commit.author_name,\n email: commit.author_email,\n date: commit.author_date,\n },\n committer: {\n name: commit.committer_name,\n email: commit.committer_email,\n date: commit.committer_date,\n },\n message: commit.message,\n tree: { sha: commit.tree_sha },\n comment_count: 0,\n verification: {\n verified: false,\n reason: \"unsigned\",\n signature: null,\n payload: null,\n verified_at: null,\n },\n },\n author: null,\n committer: null,\n parents: commit.parent_shas.map((sha) => ({\n sha,\n url: `${repoUrl}/commits/${sha}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${sha}`,\n })),\n };\n}\n\nfunction headLabel(gh: GitHubStore, pr: GitHubPullRequest): string {\n const headRepo = gh.repos.get(pr.head_repo_id);\n const owner = headRepo\n ? headRepo.owner_type === \"User\"\n ? gh.users.get(headRepo.owner_id)?.login\n : gh.orgs.get(headRepo.owner_id)?.login\n : undefined;\n return `${owner ?? \"unknown\"}:${pr.head_ref}`;\n}\n\nfunction matchesHeadFilter(gh: GitHubStore, pr: GitHubPullRequest, headParam: string): boolean {\n const trimmed = headParam.trim();\n if (!trimmed) return true;\n if (!trimmed.includes(\":\")) {\n return pr.head_ref === trimmed;\n }\n return headLabel(gh, pr) === trimmed;\n}\n\nfunction sortPulls(\n list: GitHubPullRequest[],\n sort: \"created\" | \"updated\" | \"popularity\" | \"long-running\",\n direction: \"asc\" | \"desc\",\n): GitHubPullRequest[] {\n const sorted = [...list];\n sorted.sort((a, b) => {\n if (sort === \"long-running\") {\n const cmp = a.created_at.localeCompare(b.created_at);\n return direction === \"desc\" ? cmp : -cmp;\n }\n const mul = direction === \"asc\" ? 1 : -1;\n if (sort === \"updated\") {\n return a.updated_at.localeCompare(b.updated_at) * mul;\n }\n if (sort === \"created\") {\n return a.created_at.localeCompare(b.created_at) * mul;\n }\n const av = a.comments + a.review_comments;\n const bv = b.comments + b.review_comments;\n if (av < bv) return -1 * mul;\n if (av > bv) return 1 * mul;\n return 0;\n });\n return sorted;\n}\n\nfunction checkMergeRequirements(gh: GitHubStore, pr: GitHubPullRequest) {\n const baseRepo = gh.repos.get(pr.base_repo_id);\n if (!baseRepo) throw new ApiError(422, \"Base repository not found\");\n\n const rule = gh.branchProtections.findBy(\"repo_id\", baseRepo.id).find((p) => p.branch_name === pr.base_ref);\n\n if (!rule) return;\n\n const checks = rule.required_status_checks;\n if (checks && checks.contexts.length > 0) {\n const runs = gh.checkRuns.findBy(\"repo_id\", baseRepo.id).filter((r) => r.head_sha === pr.head_sha);\n for (const ctx of checks.contexts) {\n const ok = runs.some((r) => r.name === ctx && r.status === \"completed\" && r.conclusion === \"success\");\n if (!ok) {\n throw new ApiError(422, \"Required status checks have not succeeded.\");\n }\n }\n }\n\n const rev = rule.required_pull_request_reviews;\n if (rev) {\n const need = rev.required_approving_review_count;\n const approved = gh.reviews\n .findBy(\"repo_id\", baseRepo.id)\n .filter((r) => r.pull_number === pr.number && r.state === \"APPROVED\");\n const approvers = new Set(approved.map((r) => r.user_id));\n if (approvers.size < need) {\n throw new ApiError(422, \"Required approving review count not met.\");\n }\n }\n}\n\nfunction deleteBranchByName(gh: GitHubStore, repo: GitHubRepo, branchName: string) {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === branchName);\n if (branch) gh.branches.delete(branch.id);\n const ref = gh.refs.findBy(\"repo_id\", repo.id).find((r) => r.ref === `refs/heads/${branchName}`);\n if (ref) gh.refs.delete(ref.id);\n}\n\nfunction lookupUserByLogin(gh: GitHubStore, login: string): GitHubUser {\n const u = gh.users.findOneBy(\"login\", login);\n if (!u) throw new ApiError(422, \"Validation failed\");\n return u;\n}\n\nfunction lookupTeamSlug(gh: GitHubStore, orgId: number, slug: string) {\n const t = gh.teams.findBy(\"org_id\", orgId).find((x) => x.slug === slug);\n if (!t) throw new ApiError(422, \"Validation failed\");\n return t;\n}\n\nexport function pullsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/pulls\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const stateQ = c.req.query(\"state\") ?? \"open\";\n const state: \"open\" | \"closed\" | \"all\" =\n stateQ === \"closed\" || stateQ === \"all\" || stateQ === \"open\" ? stateQ : \"open\";\n\n const headQ = c.req.query(\"head\") ?? \"\";\n const baseQ = c.req.query(\"base\") ?? \"\";\n\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" | \"popularity\" | \"long-running\" =\n sortRaw === \"updated\" || sortRaw === \"popularity\" || sortRaw === \"long-running\" ? sortRaw : \"created\";\n\n const dirRaw = c.req.query(\"direction\") ?? \"desc\";\n const direction: \"asc\" | \"desc\" = dirRaw === \"asc\" ? \"asc\" : \"desc\";\n\n let list = gh.pullRequests.findBy(\"repo_id\", repo.id);\n if (state === \"open\") list = list.filter((p) => p.state === \"open\");\n else if (state === \"closed\") list = list.filter((p) => p.state === \"closed\");\n\n if (baseQ.trim()) {\n list = list.filter((p) => p.base_ref === baseQ.trim());\n }\n if (headQ.trim()) {\n list = list.filter((p) => matchesHeadFilter(gh, p, headQ));\n }\n\n list = sortPulls(list, sort, direction);\n\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((p) => formatPullRequest(p, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/pulls\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n\n const title = body.title;\n if (typeof title !== \"string\" || !title.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const headRaw = body.head;\n const baseRaw = body.base;\n if (typeof headRaw !== \"string\" || !headRaw.trim()) throw new ApiError(422, \"Validation failed\");\n if (typeof baseRaw !== \"string\" || !baseRaw.trim()) throw new ApiError(422, \"Validation failed\");\n\n const { headRepo, headRef } = resolveHeadTarget(gh, repo, headRaw);\n const baseRef = baseRaw.trim();\n\n if (headRef === baseRef && headRepo.id === repo.id) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const prBody = typeof body.body === \"string\" || body.body === null ? (body.body as string | null) : null;\n const draft = typeof body.draft === \"boolean\" ? body.draft : false;\n\n const headBranch = getOrCreateBranch(gh, headRepo, headRef);\n const baseBranch = getOrCreateBranch(gh, repo, baseRef);\n\n const num = getNextIssueNumber(gh, repo.id);\n const now = timestamp();\n\n const issueRow = gh.issues.insert({\n node_id: \"\",\n number: num,\n repo_id: repo.id,\n title: title.trim(),\n body: prBody,\n state: \"open\",\n state_reason: null,\n locked: false,\n active_lock_reason: null,\n user_id: actor.id,\n assignee_ids: [],\n label_ids: [],\n milestone_id: null,\n comments: 0,\n closed_at: null,\n closed_by_id: null,\n is_pull_request: true,\n } as Omit<GitHubIssue, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issues.update(issueRow.id, { node_id: generateNodeId(\"Issue\", issueRow.id) });\n\n const commitCount = countCommitsBetween(gh, headRepo, headBranch.sha, baseBranch.sha);\n\n const prRow = gh.pullRequests.insert({\n node_id: \"\",\n number: num,\n repo_id: repo.id,\n title: title.trim(),\n body: prBody,\n state: \"open\",\n locked: false,\n user_id: actor.id,\n assignee_ids: [],\n label_ids: [],\n milestone_id: null,\n head_ref: headRef,\n head_sha: headBranch.sha,\n head_repo_id: headRepo.id,\n base_ref: baseRef,\n base_sha: baseBranch.sha,\n base_repo_id: repo.id,\n merged: false,\n merged_at: null,\n merged_by_id: null,\n merge_commit_sha: null,\n mergeable: true,\n mergeable_state: \"clean\",\n comments: 0,\n review_comments: 0,\n commits: Math.max(1, commitCount),\n additions: 0,\n deletions: 0,\n changed_files: 0,\n draft,\n requested_reviewer_ids: [],\n requested_team_ids: [],\n closed_at: null,\n auto_merge: null,\n } as Omit<GitHubPullRequest, \"id\" | \"created_at\" | \"updated_at\">);\n gh.pullRequests.update(prRow.id, { node_id: generateNodeId(\"PullRequest\", prRow.id) });\n\n adjustRepoOpenIssues(gh, repo.id, 1);\n\n const pr = gh.pullRequests.get(prRow.id)!;\n const prFmt = formatPullRequest(pr, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n webhooks.dispatch(\n \"pull_request\",\n \"opened\",\n {\n action: \"opened\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(prFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const fmt = formatPullRequest(pr, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.patch(\"/repos/:owner/:repo/pulls/:pull_number\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubPullRequest> = {};\n const issuePatch: Partial<GitHubIssue> = {};\n\n if (typeof body.title === \"string\") {\n patch.title = body.title;\n issuePatch.title = body.title;\n }\n if (typeof body.body === \"string\" || body.body === null) {\n patch.body = body.body as string | null;\n issuePatch.body = body.body as string | null;\n }\n if (body.state === \"open\" || body.state === \"closed\") {\n const wasClosed = pr.state === \"closed\";\n patch.state = body.state;\n issuePatch.state = body.state;\n if (body.state === \"closed\") {\n patch.closed_at = timestamp();\n issuePatch.closed_at = timestamp();\n issuePatch.closed_by_id = actor.id;\n } else {\n patch.closed_at = null;\n issuePatch.closed_at = null;\n issuePatch.closed_by_id = null;\n }\n if (!wasClosed && body.state === \"closed\") {\n adjustRepoOpenIssues(gh, repo.id, -1);\n } else if (wasClosed && body.state === \"open\") {\n adjustRepoOpenIssues(gh, repo.id, 1);\n }\n }\n if (typeof body.base === \"string\" && body.base.trim()) {\n const newBase = body.base.trim();\n const bb = getOrCreateBranch(gh, repo, newBase);\n patch.base_ref = newBase;\n patch.base_sha = bb.sha;\n patch.base_repo_id = repo.id;\n }\n if (typeof body.draft === \"boolean\") {\n patch.draft = body.draft;\n }\n\n const updated = gh.pullRequests.update(pr.id, patch);\n if (!updated) throw notFoundResponse();\n\n const iss = findPrIssue(gh, repo.id, pullNumber);\n if (iss) {\n gh.issues.update(iss.id, issuePatch);\n }\n\n const fresh = gh.pullRequests.get(pr.id)!;\n const prFmt = formatPullRequest(fresh, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n if (body.state === \"closed\" && pr.state === \"open\") {\n webhooks.dispatch(\n \"pull_request\",\n \"closed\",\n {\n action: \"closed\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n } else if (body.state === \"open\" && pr.state === \"closed\") {\n webhooks.dispatch(\n \"pull_request\",\n \"reopened\",\n {\n action: \"reopened\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n } else if (typeof body.title === \"string\" || typeof body.body === \"string\" || body.body === null) {\n webhooks.dispatch(\n \"pull_request\",\n \"edited\",\n {\n action: \"edited\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n\n return c.json(prFmt);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/merge\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n if (pr.merged || pr.state === \"closed\") {\n throw new ApiError(422, \"Pull Request is not mergeable\");\n }\n if (pr.draft) {\n throw new ApiError(422, \"Draft pull requests cannot be merged.\");\n }\n\n const body = await parseJsonBody(c);\n if (typeof body.sha === \"string\" && body.sha !== pr.head_sha) {\n throw new ApiError(422, \"Head sha is out of date\");\n }\n\n const mergeMethod = body.merge_method === \"squash\" || body.merge_method === \"rebase\" ? body.merge_method : \"merge\";\n\n if (mergeMethod === \"merge\" && !repo.allow_merge_commit) {\n throw new ApiError(422, \"Merge commits are not allowed on this repository.\");\n }\n if (mergeMethod === \"squash\" && !repo.allow_squash_merge) {\n throw new ApiError(422, \"Squash merges are not allowed on this repository.\");\n }\n if (mergeMethod === \"rebase\" && !repo.allow_rebase_merge) {\n throw new ApiError(422, \"Rebase merges are not allowed on this repository.\");\n }\n\n checkMergeRequirements(gh, pr);\n\n const baseRepo = gh.repos.get(pr.base_repo_id)!;\n const headRepo = gh.repos.get(pr.head_repo_id)!;\n\n const baseCommit = gh.commits.findBy(\"repo_id\", baseRepo.id).find((x) => x.sha === pr.base_sha);\n const headCommit = gh.commits.findBy(\"repo_id\", headRepo.id).find((x) => x.sha === pr.head_sha);\n\n if (!baseCommit || !headCommit) {\n throw new ApiError(422, \"Could not resolve commits to merge.\");\n }\n\n const commitTitle =\n typeof body.commit_title === \"string\" && body.commit_title.trim()\n ? body.commit_title.trim()\n : `Merge pull request #${pr.number} from ${headLabel(gh, pr)}`;\n const commitMessage =\n typeof body.commit_message === \"string\" && body.commit_message.trim() ? body.commit_message.trim() : \"\";\n\n const fullMessage = commitMessage ? `${commitTitle}\\n\\n${commitMessage}` : commitTitle;\n\n let mergeCommit: GitHubCommit;\n if (mergeMethod === \"merge\") {\n mergeCommit = insertCommit(gh, baseRepo, {\n treeSha: headCommit.tree_sha,\n parentShas: [pr.base_sha, pr.head_sha],\n message: fullMessage,\n user: actor,\n });\n } else {\n mergeCommit = insertCommit(gh, baseRepo, {\n treeSha: headCommit.tree_sha,\n parentShas: [pr.base_sha],\n message: fullMessage,\n user: actor,\n });\n }\n\n updateBranchSha(gh, baseRepo, pr.base_ref, mergeCommit.sha);\n\n const now = timestamp();\n gh.pullRequests.update(pr.id, {\n merged: true,\n merged_at: now,\n merged_by_id: actor.id,\n merge_commit_sha: mergeCommit.sha,\n state: \"closed\",\n closed_at: now,\n mergeable: false,\n mergeable_state: \"unknown\",\n });\n\n const iss = findPrIssue(gh, repo.id, pullNumber);\n if (iss) {\n gh.issues.update(iss.id, {\n state: \"closed\",\n closed_at: now,\n closed_by_id: actor.id,\n });\n }\n\n adjustRepoOpenIssues(gh, repo.id, -1);\n\n if (repo.delete_branch_on_merge && pr.head_ref !== pr.base_ref) {\n deleteBranchByName(gh, headRepo, pr.head_ref);\n }\n\n const mergedPr = gh.pullRequests.get(pr.id)!;\n const prFmt = formatPullRequest(mergedPr, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n webhooks.dispatch(\n \"pull_request\",\n \"closed\",\n {\n action: \"closed\",\n pull_request: { ...prFmt, merged: true },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json({\n sha: mergeCommit.sha,\n merged: true,\n message: \"Pull Request successfully merged\",\n });\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/commits\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const headRepo = gh.repos.get(pr.head_repo_id);\n if (!headRepo) throw notFoundResponse();\n\n const chain = walkCommitsToBase(gh, headRepo, pr.head_sha, pr.base_sha);\n const { page, per_page } = parsePagination(c);\n const total = chain.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const slice = chain.slice(start, start + per_page);\n\n return c.json(slice.map((commit) => formatCommitApi(commit, headRepo, baseUrl)));\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/files\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const n = pr.changed_files;\n const stubNames = Array.from({ length: n }, (_, i) => `file${i + 1}.ts`);\n const total = stubNames.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageNames = stubNames.slice(start, start + per_page);\n\n return c.json(\n pageNames.map((filename, i) => ({\n sha: generateSha(),\n filename,\n status: \"modified\",\n additions: 1,\n deletions: 0,\n changes: 1,\n blob_url: `${baseUrl}/${repo.full_name}/blob/${pr.head_sha}/${filename}`,\n raw_url: `${baseUrl}/${repo.full_name}/raw/${pr.head_sha}/${filename}`,\n contents_url: `${baseUrl}/repos/${repo.full_name}/contents/${encodeURIComponent(filename)}?ref=${pr.head_ref}`,\n patch: \"\",\n })),\n );\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/requested_reviewers\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const body = (await parseJsonBody(c)) as {\n reviewers?: unknown;\n team_reviewers?: unknown;\n };\n\n const reviewerLogins = Array.isArray(body.reviewers)\n ? body.reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n const teamSlugs = Array.isArray(body.team_reviewers)\n ? body.team_reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n\n const newUserIds = reviewerLogins.map((login) => lookupUserByLogin(gh, login).id);\n let newTeamIds: number[] = [];\n if (teamSlugs.length > 0) {\n if (repo.owner_type !== \"Organization\") {\n throw new ApiError(422, \"Team reviewers are only supported for organization repositories.\");\n }\n newTeamIds = teamSlugs.map((slug) => lookupTeamSlug(gh, repo.owner_id, slug).id);\n }\n\n const requested_reviewer_ids = [...new Set([...pr.requested_reviewer_ids, ...newUserIds])];\n const requested_team_ids = [...new Set([...pr.requested_team_ids, ...newTeamIds])];\n\n gh.pullRequests.update(pr.id, { requested_reviewer_ids, requested_team_ids });\n const fresh = gh.pullRequests.get(pr.id)!;\n const prFmt = formatPullRequest(fresh, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n webhooks.dispatch(\n \"pull_request\",\n \"review_requested\",\n {\n action: \"review_requested\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(prFmt);\n });\n\n app.delete(\"/repos/:owner/:repo/pulls/:pull_number/requested_reviewers\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const body = (await parseJsonBody(c)) as {\n reviewers?: unknown;\n team_reviewers?: unknown;\n };\n\n const reviewerLogins = Array.isArray(body.reviewers)\n ? body.reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n const teamSlugs = Array.isArray(body.team_reviewers)\n ? body.team_reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n\n const removeUserIds = new Set(reviewerLogins.map((login) => lookupUserByLogin(gh, login).id));\n let removeTeamIds = new Set<number>();\n if (teamSlugs.length > 0 && repo.owner_type === \"Organization\") {\n removeTeamIds = new Set(teamSlugs.map((slug) => lookupTeamSlug(gh, repo.owner_id, slug).id));\n }\n\n const requested_reviewer_ids = pr.requested_reviewer_ids.filter((id) => !removeUserIds.has(id));\n const requested_team_ids = pr.requested_team_ids.filter((id) => !removeTeamIds.has(id));\n\n gh.pullRequests.update(pr.id, { requested_reviewer_ids, requested_team_ids });\n const fresh = gh.pullRequests.get(pr.id)!;\n return c.json(formatPullRequest(fresh, gh, baseUrl)!);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/update-branch\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n if (pr.state === \"closed\" || pr.merged) {\n throw new ApiError(422, \"Cannot update a closed pull request\");\n }\n\n const body = (await parseJsonBody(c)) as { expected_head_sha?: unknown };\n if (typeof body.expected_head_sha === \"string\" && body.expected_head_sha !== pr.head_sha) {\n throw new ApiError(422, \"Head sha is out of date\");\n }\n\n const headRepo = gh.repos.get(pr.head_repo_id);\n const baseRepo = gh.repos.get(pr.base_repo_id);\n if (!headRepo || !baseRepo) throw notFoundResponse();\n\n const headCommit = gh.commits.findBy(\"repo_id\", headRepo.id).find((x) => x.sha === pr.head_sha);\n const baseCommit = gh.commits.findBy(\"repo_id\", baseRepo.id).find((x) => x.sha === pr.base_sha);\n if (!headCommit || !baseCommit) throw new ApiError(422, \"Could not resolve commits.\");\n\n const actor = assertAuthenticatedUser(gh, c.get(\"authUser\"));\n const mergeMsg = `Merge branch '${pr.base_ref}' into ${pr.head_ref}`;\n const newCommit = insertCommit(gh, headRepo, {\n treeSha: headCommit.tree_sha,\n parentShas: [pr.head_sha, pr.base_sha],\n message: mergeMsg,\n user: actor,\n });\n\n updateBranchSha(gh, headRepo, pr.head_ref, newCommit.sha);\n const next = gh.pullRequests.update(pr.id, {\n head_sha: newCommit.sha,\n commits: pr.commits + 1,\n });\n if (!next) throw notFoundResponse();\n\n const apiUrl = `${baseUrl}/repos/${repo.full_name}/pulls/${pullNumber}`;\n return c.json(\n {\n message: \"Updating pull request branch.\",\n url: apiUrl,\n },\n 202,\n );\n });\n}\n","import type { Context } from \"hono\";\nimport type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubComment, GitHubCommit, GitHubIssue, GitHubPullRequest, GitHubRepo } from \"../entities.js\";\nimport {\n formatComment,\n formatIssue,\n formatPullRequest,\n formatRepo,\n formatUser,\n generateNodeId,\n lookupRepo,\n} from \"../helpers.js\";\nimport { assertRepoRead, assertRepoWrite, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\nfunction findIssueByNumber(gh: GitHubStore, repoId: number, number: number): GitHubIssue | undefined {\n return gh.issues.findBy(\"repo_id\", repoId).find((i) => i.number === number);\n}\n\nfunction findPull(gh: GitHubStore, repoId: number, pullNumber: number): GitHubPullRequest | undefined {\n return gh.pullRequests.findBy(\"repo_id\", repoId).find((p) => p.number === pullNumber);\n}\n\nfunction findCommitInRepo(gh: GitHubStore, repoId: number, shaParam: string): GitHubCommit | undefined {\n const want = shaParam.toLowerCase();\n const list = gh.commits.findBy(\"repo_id\", repoId);\n return list.find((c) => c.sha === shaParam || c.sha.toLowerCase() === want || c.sha.startsWith(shaParam));\n}\n\nfunction getCommentForRepo(\n gh: GitHubStore,\n repo: GitHubRepo,\n commentId: number,\n kind: GitHubComment[\"comment_type\"],\n): GitHubComment | undefined {\n const c = gh.comments.get(commentId);\n if (!c || c.repo_id !== repo.id || c.comment_type !== kind) return undefined;\n return c;\n}\n\nfunction sortComments(\n comments: GitHubComment[],\n sort: \"created\" | \"updated\",\n direction: \"asc\" | \"desc\",\n): GitHubComment[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const field = sort === \"created\" ? \"created_at\" : \"updated_at\";\n const sorted = [...comments];\n sorted.sort((a, b) => {\n const as = a[field];\n const bs = b[field];\n if (as < bs) return -1 * mul;\n if (as > bs) return 1 * mul;\n return a.id < b.id ? -1 * mul : a.id > b.id ? 1 * mul : 0;\n });\n return sorted;\n}\n\nfunction parseCommentSort(c: Context, defaultDirection: \"asc\" | \"desc\") {\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" = sortRaw === \"updated\" ? \"updated\" : \"created\";\n const dirRaw = c.req.query(\"direction\");\n const direction: \"asc\" | \"desc\" = dirRaw === \"desc\" ? \"desc\" : dirRaw === \"asc\" ? \"asc\" : defaultDirection;\n return { sort, direction };\n}\n\nfunction adjustIssueCommentCount(gh: GitHubStore, issue: GitHubIssue, delta: number) {\n gh.issues.update(issue.id, { comments: Math.max(0, issue.comments + delta) });\n}\n\nfunction adjustPrReviewCommentCount(gh: GitHubStore, pr: GitHubPullRequest, delta: number) {\n gh.pullRequests.update(pr.id, { review_comments: Math.max(0, pr.review_comments + delta) });\n}\n\nexport function commentsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Issue comments: specific paths before /issues/:issue_number/comments ---\n\n app.get(\"/repos/:owner/:repo/issues/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"issue\");\n if (!comment) throw notFoundResponse();\n\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/issues/comments/:comment_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n let comment = getCommentForRepo(gh, repo, commentId, \"issue\");\n if (!comment) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n if (typeof body.body !== \"string\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n comment = gh.comments.update(comment.id, { body: body.body })!;\n const issue = comment.issue_number !== null ? findIssueByNumber(gh, repo.id, comment.issue_number) : undefined;\n const ownerLogin = ownerLoginOf(gh, repo);\n const issueFmt = issue ? formatIssue(issue, gh, baseUrl) : null;\n const commentFmt = formatComment(comment, gh, baseUrl);\n if (!commentFmt) throw notFoundResponse();\n\n webhooks.dispatch(\n \"issue_comment\",\n \"edited\",\n {\n action: \"edited\",\n comment: commentFmt,\n issue: issueFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(commentFmt);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"issue\");\n if (!comment) throw notFoundResponse();\n\n const issue = comment.issue_number !== null ? findIssueByNumber(gh, repo.id, comment.issue_number) : undefined;\n const commentFmt = formatComment(comment, gh, baseUrl);\n const issueFmt = issue ? formatIssue(issue, gh, baseUrl) : null;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n gh.comments.delete(comment.id);\n if (issue) adjustIssueCommentCount(gh, issue, -1);\n\n webhooks.dispatch(\n \"issue_comment\",\n \"deleted\",\n {\n action: \"deleted\",\n comment: commentFmt,\n issue: issueFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/issues/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n const since = c.req.query(\"since\");\n\n let list = gh.comments.findBy(\"repo_id\", repo.id).filter((x) => x.comment_type === \"issue\");\n if (since) {\n list = list.filter((x) => x.updated_at >= since);\n }\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n // --- Pull review comments ---\n\n app.get(\"/repos/:owner/:repo/pulls/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"review\");\n if (!comment) throw notFoundResponse();\n\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/pulls/comments/:comment_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n let comment = getCommentForRepo(gh, repo, commentId, \"review\");\n if (!comment) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n if (typeof body.body !== \"string\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n comment = gh.comments.update(comment.id, { body: body.body })!;\n const pr = comment.pull_number !== null ? findPull(gh, repo.id, comment.pull_number) : undefined;\n const ownerLogin = ownerLoginOf(gh, repo);\n const commentFmt = formatComment(comment, gh, baseUrl);\n if (!commentFmt) throw notFoundResponse();\n\n webhooks.dispatch(\n \"pull_request_review_comment\",\n \"edited\",\n {\n action: \"edited\",\n comment: commentFmt,\n pull_request: pr ? formatPullRequest(pr, gh, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(commentFmt);\n });\n\n app.delete(\"/repos/:owner/:repo/pulls/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"review\");\n if (!comment) throw notFoundResponse();\n\n const pr = comment.pull_number !== null ? findPull(gh, repo.id, comment.pull_number) : undefined;\n const commentFmt = formatComment(comment, gh, baseUrl);\n const ownerLogin = ownerLoginOf(gh, repo);\n\n gh.comments.delete(comment.id);\n if (pr) adjustPrReviewCommentCount(gh, pr, -1);\n\n webhooks.dispatch(\n \"pull_request_review_comment\",\n \"deleted\",\n {\n action: \"deleted\",\n comment: commentFmt,\n pull_request: pr ? formatPullRequest(pr, gh, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments.findBy(\"repo_id\", repo.id).filter((x) => x.comment_type === \"review\");\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n // --- Commit comments (repo scope) ---\n\n app.get(\"/repos/:owner/:repo/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"commit\");\n if (!comment) throw notFoundResponse();\n\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/comments/:comment_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n let comment = getCommentForRepo(gh, repo, commentId, \"commit\");\n if (!comment) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n if (typeof body.body !== \"string\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n comment = gh.comments.update(comment.id, { body: body.body })!;\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.delete(\"/repos/:owner/:repo/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"commit\");\n if (!comment) throw notFoundResponse();\n\n gh.comments.delete(comment.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments.findBy(\"repo_id\", repo.id).filter((x) => x.comment_type === \"commit\");\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n // --- Per-issue / per-PR / per-commit ---\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"issue\" && x.issue_number === issueNumber);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/issues/:issue_number/comments\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" || !raw.body.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const row = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: issueNumber,\n pull_number: null,\n commit_sha: null,\n body: raw.body,\n user_id: actor.id,\n in_reply_to_id: null,\n path: null,\n position: null,\n line: null,\n side: null,\n subject_type: null,\n comment_type: \"issue\",\n review_id: null,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(row.id, { node_id: generateNodeId(\"IssueComment\", row.id) });\n const comment = gh.comments.get(row.id)!;\n\n adjustIssueCommentCount(gh, issue, 1);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const commentFmt = formatComment(comment, gh, baseUrl)!;\n\n webhooks.dispatch(\n \"issue_comment\",\n \"created\",\n {\n action: \"created\",\n comment: commentFmt,\n issue: formatIssue(issue, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(commentFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"review\" && x.pull_number === pullNumber);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/comments\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" || !raw.body.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const commitSha = typeof raw.commit_id === \"string\" && raw.commit_id.trim() ? raw.commit_id.trim() : pr.head_sha;\n\n let inReplyTo: number | null = null;\n if (raw.in_reply_to_id !== undefined && raw.in_reply_to_id !== null) {\n const rid =\n typeof raw.in_reply_to_id === \"number\" ? raw.in_reply_to_id : parseInt(String(raw.in_reply_to_id), 10);\n if (!Number.isFinite(rid)) throw new ApiError(422, \"Validation failed\");\n const parent = gh.comments.get(rid);\n if (\n !parent ||\n parent.repo_id !== repo.id ||\n parent.comment_type !== \"review\" ||\n parent.pull_number !== pullNumber\n ) {\n throw new ApiError(422, \"Validation failed\");\n }\n inReplyTo = rid;\n }\n\n const pathVal = raw.path === undefined || raw.path === null ? null : typeof raw.path === \"string\" ? raw.path : null;\n const position =\n raw.position === undefined || raw.position === null\n ? null\n : typeof raw.position === \"number\" && Number.isFinite(raw.position)\n ? raw.position\n : parseInt(String(raw.position), 10);\n const line =\n raw.line === undefined || raw.line === null\n ? null\n : typeof raw.line === \"number\" && Number.isFinite(raw.line)\n ? raw.line\n : parseInt(String(raw.line), 10);\n let side: \"LEFT\" | \"RIGHT\" | null = null;\n if (raw.side === \"LEFT\" || raw.side === \"RIGHT\") side = raw.side;\n else if (raw.side === null || raw.side === undefined) side = null;\n else throw new ApiError(422, \"Validation failed\");\n\n let subjectType: \"line\" | \"file\" | null = null;\n if (raw.subject_type === \"line\" || raw.subject_type === \"file\") subjectType = raw.subject_type;\n else if (raw.subject_type === null || raw.subject_type === undefined) subjectType = null;\n else throw new ApiError(422, \"Validation failed\");\n\n if (position !== null && !Number.isFinite(position)) throw new ApiError(422, \"Validation failed\");\n if (line !== null && !Number.isFinite(line)) throw new ApiError(422, \"Validation failed\");\n\n const row = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: null,\n pull_number: pullNumber,\n commit_sha: commitSha,\n body: raw.body,\n user_id: actor.id,\n in_reply_to_id: inReplyTo,\n path: pathVal,\n position: position !== null && Number.isFinite(position) ? position : null,\n line: line !== null && Number.isFinite(line) ? line : null,\n side,\n subject_type: subjectType,\n comment_type: \"review\",\n review_id: null,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(row.id, { node_id: generateNodeId(\"PullRequestReviewComment\", row.id) });\n const comment = gh.comments.get(row.id)!;\n\n adjustPrReviewCommentCount(gh, pr, 1);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const commentFmt = formatComment(comment, gh, baseUrl)!;\n\n webhooks.dispatch(\n \"pull_request_review_comment\",\n \"created\",\n {\n action: \"created\",\n comment: commentFmt,\n pull_request: formatPullRequest(pr, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(commentFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/commits/:commit_sha/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const commitSha = c.req.param(\"commit_sha\")!;\n const commit = findCommitInRepo(gh, repo.id, commitSha);\n if (!commit) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"commit\" && x.commit_sha === commit.sha);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/commits/:commit_sha/comments\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commitShaParam = c.req.param(\"commit_sha\")!;\n const commit = findCommitInRepo(gh, repo.id, commitShaParam);\n if (!commit) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" || !raw.body.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const pathVal = raw.path === undefined || raw.path === null ? null : typeof raw.path === \"string\" ? raw.path : null;\n const position =\n raw.position === undefined || raw.position === null\n ? null\n : typeof raw.position === \"number\" && Number.isFinite(raw.position)\n ? raw.position\n : parseInt(String(raw.position), 10);\n const line =\n raw.line === undefined || raw.line === null\n ? null\n : typeof raw.line === \"number\" && Number.isFinite(raw.line)\n ? raw.line\n : parseInt(String(raw.line), 10);\n\n if (position !== null && !Number.isFinite(position)) throw new ApiError(422, \"Validation failed\");\n if (line !== null && !Number.isFinite(line)) throw new ApiError(422, \"Validation failed\");\n\n const row = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: null,\n pull_number: null,\n commit_sha: commit.sha,\n body: raw.body,\n user_id: actor.id,\n in_reply_to_id: null,\n path: pathVal,\n position: position !== null && Number.isFinite(position) ? position : null,\n line: line !== null && Number.isFinite(line) ? line : null,\n side: null,\n subject_type: null,\n comment_type: \"commit\",\n review_id: null,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(row.id, { node_id: generateNodeId(\"CommitComment\", row.id) });\n const comment = gh.comments.get(row.id)!;\n\n const commentFmt = formatComment(comment, gh, baseUrl)!;\n return c.json(commentFmt, 201);\n });\n}\n","import type { Context } from \"hono\";\nimport type { RouteContext, WebhookDispatcher } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubComment, GitHubPullRequest, GitHubRepo, GitHubReview, GitHubUser } from \"../entities.js\";\nimport {\n formatComment,\n formatPullRequest,\n formatRepo,\n formatReview,\n formatUser,\n generateNodeId,\n generateSha,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport { assertRepoRead, assertRepoWrite, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\nfunction findPull(gh: GitHubStore, repoId: number, pullNumber: number): GitHubPullRequest | undefined {\n return gh.pullRequests.findBy(\"repo_id\", repoId).find((p) => p.number === pullNumber);\n}\n\nfunction findReview(gh: GitHubStore, repo: GitHubRepo, pullNumber: number, reviewId: number): GitHubReview | undefined {\n const r = gh.reviews.get(reviewId);\n if (!r || r.repo_id !== repo.id || r.pull_number !== pullNumber) return undefined;\n return r;\n}\n\nfunction adjustPrReviewCommentCount(gh: GitHubStore, pr: GitHubPullRequest, delta: number) {\n gh.pullRequests.update(pr.id, { review_comments: Math.max(0, pr.review_comments + delta) });\n}\n\nfunction sortComments(\n comments: GitHubComment[],\n sort: \"created\" | \"updated\",\n direction: \"asc\" | \"desc\",\n): GitHubComment[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const field = sort === \"created\" ? \"created_at\" : \"updated_at\";\n const sorted = [...comments];\n sorted.sort((a, b) => {\n const as = a[field];\n const bs = b[field];\n if (as < bs) return -1 * mul;\n if (as > bs) return 1 * mul;\n return a.id < b.id ? -1 * mul : a.id > b.id ? 1 * mul : 0;\n });\n return sorted;\n}\n\nfunction parseCommentSort(c: Context, defaultDirection: \"asc\" | \"desc\") {\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" = sortRaw === \"updated\" ? \"updated\" : \"created\";\n const dirRaw = c.req.query(\"direction\");\n const direction: \"asc\" | \"desc\" = dirRaw === \"desc\" ? \"desc\" : dirRaw === \"asc\" ? \"asc\" : defaultDirection;\n return { sort, direction };\n}\n\nfunction parseSubmitEvent(raw: unknown): \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\" {\n if (raw === \"APPROVE\" || raw === \"REQUEST_CHANGES\" || raw === \"COMMENT\") return raw;\n throw new ApiError(422, \"Validation failed\");\n}\n\nfunction eventToState(event: \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\"): GitHubReview[\"state\"] {\n switch (event) {\n case \"APPROVE\":\n return \"APPROVED\";\n case \"REQUEST_CHANGES\":\n return \"CHANGES_REQUESTED\";\n case \"COMMENT\":\n return \"COMMENTED\";\n default:\n return \"COMMENTED\";\n }\n}\n\nfunction dispatchReviewWebhook(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n review: GitHubReview,\n pr: GitHubPullRequest,\n actor: GitHubUser,\n baseUrl: string,\n action: \"submitted\" | \"dismissed\",\n) {\n const ownerLogin = ownerLoginOf(gh, repo);\n const reviewFmt = formatReview(review, gh, baseUrl);\n if (!reviewFmt) return;\n webhooks.dispatch(\n \"pull_request_review\",\n action,\n {\n action,\n review: reviewFmt,\n pull_request: formatPullRequest(pr, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n}\n\nexport function reviewsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/reviews\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const list = gh.reviews.findBy(\"repo_id\", repo.id).filter((r) => r.pull_number === pullNumber);\n list.sort((a, b) => a.id - b.id);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((r) => formatReview(r, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/reviews\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n\n const eventRaw = raw.event;\n const hasEvent = eventRaw === \"APPROVE\" || eventRaw === \"REQUEST_CHANGES\" || eventRaw === \"COMMENT\";\n if (eventRaw !== undefined && eventRaw !== null && !hasEvent) {\n throw new ApiError(422, \"Validation failed\");\n }\n const event = hasEvent ? parseSubmitEvent(eventRaw) : undefined;\n\n let bodyText: string | null = null;\n if (typeof raw.body === \"string\") bodyText = raw.body;\n else if (raw.body === null || raw.body === undefined) bodyText = null;\n else throw new ApiError(422, \"Validation failed\");\n\n const commitId =\n typeof raw.commit_id === \"string\" && raw.commit_id.trim() ? raw.commit_id.trim() : pr.head_sha || generateSha();\n\n const state: GitHubReview[\"state\"] = event ? eventToState(event) : \"PENDING\";\n const submittedAt = event ? timestamp() : null;\n\n const row = gh.reviews.insert({\n node_id: \"\",\n repo_id: repo.id,\n pull_number: pullNumber,\n user_id: actor.id,\n body: bodyText,\n state,\n commit_id: commitId,\n submitted_at: submittedAt,\n } as Omit<GitHubReview, \"id\" | \"created_at\" | \"updated_at\">);\n gh.reviews.update(row.id, { node_id: generateNodeId(\"PullRequestReview\", row.id) });\n const review = gh.reviews.get(row.id)!;\n\n const commentsArr = Array.isArray(raw.comments) ? raw.comments : [];\n for (const entry of commentsArr) {\n if (!entry || typeof entry !== \"object\") throw new ApiError(422, \"Validation failed\");\n const o = entry as Record<string, unknown>;\n if (typeof o.path !== \"string\" || !o.path.trim()) throw new ApiError(422, \"Validation failed\");\n const pos =\n typeof o.position === \"number\" && Number.isFinite(o.position) ? o.position : parseInt(String(o.position), 10);\n if (!Number.isFinite(pos)) throw new ApiError(422, \"Validation failed\");\n if (typeof o.body !== \"string\") throw new ApiError(422, \"Validation failed\");\n\n const cRow = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: null,\n pull_number: pullNumber,\n commit_sha: commitId,\n body: o.body,\n user_id: actor.id,\n in_reply_to_id: null,\n path: o.path,\n position: pos,\n line: null,\n side: \"RIGHT\",\n subject_type: \"line\",\n comment_type: \"review\",\n review_id: review.id,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(cRow.id, { node_id: generateNodeId(\"PullRequestReviewComment\", cRow.id) });\n adjustPrReviewCommentCount(gh, pr, 1);\n }\n\n if (event) {\n dispatchReviewWebhook(webhooks, gh, repo, review, pr, actor, baseUrl, \"submitted\");\n }\n\n const json = formatReview(review, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json, 201);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n\n const json = formatReview(review, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const existing = findReview(gh, repo, pullNumber, reviewId);\n if (!existing) throw notFoundResponse();\n if (existing.state !== \"PENDING\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" && raw.body !== null) {\n throw new ApiError(422, \"Validation failed\");\n }\n const bodyVal = typeof raw.body === \"string\" ? raw.body : null;\n\n const updated = gh.reviews.update(reviewId, { body: bodyVal });\n if (!updated) throw notFoundResponse();\n\n const json = formatReview(updated, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/events\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n if (review.state !== \"PENDING\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const raw = await parseJsonBody(c);\n const event = parseSubmitEvent(raw.event);\n\n let bodyText: string | null = review.body;\n if (typeof raw.body === \"string\") bodyText = raw.body;\n else if (raw.body === null) bodyText = null;\n else if (raw.body !== undefined) throw new ApiError(422, \"Validation failed\");\n\n const nextState = eventToState(event);\n const updated = gh.reviews.update(reviewId, {\n body: bodyText,\n state: nextState,\n submitted_at: timestamp(),\n });\n if (!updated) throw notFoundResponse();\n\n dispatchReviewWebhook(webhooks, gh, repo, updated, pr, actor, baseUrl, \"submitted\");\n\n const json = formatReview(updated, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/dismissals\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n if (review.state === \"PENDING\" || review.state === \"DISMISSED\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const raw = await parseJsonBody(c);\n const message = typeof raw.message === \"string\" ? raw.message : null;\n\n const updated = gh.reviews.update(reviewId, {\n state: \"DISMISSED\",\n body: message !== null && message !== undefined ? message : review.body,\n });\n if (!updated) throw notFoundResponse();\n\n dispatchReviewWebhook(webhooks, gh, repo, updated, pr, actor, baseUrl, \"dismissed\");\n\n const json = formatReview(updated, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"review\" && x.pull_number === pullNumber && x.review_id === reviewId);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n}\n","import type { Context } from \"hono\";\nimport type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubIssue,\n GitHubIssueEvent,\n GitHubLabel,\n GitHubMilestone,\n GitHubRepo,\n GitHubUser,\n} from \"../entities.js\";\nimport {\n formatIssue,\n formatLabel,\n formatMilestone,\n formatPullRequest,\n formatRepo,\n formatUser,\n generateNodeId,\n getNextMilestoneNumber,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport { assertIssueWrite, assertRepoRead, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\nfunction findIssueByNumber(gh: GitHubStore, repoId: number, issueNumber: number): GitHubIssue | undefined {\n return gh.issues.findBy(\"repo_id\", repoId).find((i) => i.number === issueNumber);\n}\n\nfunction findPullByNumber(gh: GitHubStore, repoId: number, num: number) {\n return gh.pullRequests.findBy(\"repo_id\", repoId).find((p) => p.number === num);\n}\n\nfunction formatIssueOrPullPayload(gh: GitHubStore, issue: GitHubIssue, current: GitHubIssue, baseUrl: string) {\n if (issue.is_pull_request) {\n const pr = findPullByNumber(gh, issue.repo_id, issue.number);\n return pr ? formatPullRequest(pr, gh, baseUrl) : null;\n }\n return formatIssue(current, gh, baseUrl);\n}\n\n/** Keep issue and pull request rows in sync for label_ids. */\nfunction setIssueLabelIds(gh: GitHubStore, issue: GitHubIssue, labelIds: number[]) {\n gh.issues.update(issue.id, { label_ids: labelIds });\n if (issue.is_pull_request) {\n const pr = findPullByNumber(gh, issue.repo_id, issue.number);\n if (pr) gh.pullRequests.update(pr.id, { label_ids: labelIds });\n }\n}\n\nfunction insertIssueEvent(\n gh: GitHubStore,\n repo: GitHubRepo,\n issueNumber: number,\n event: string,\n actorId: number,\n extra?: Partial<\n Pick<GitHubIssueEvent, \"commit_id\" | \"commit_url\" | \"label_name\" | \"assignee_id\" | \"milestone_title\" | \"rename\">\n >,\n): GitHubIssueEvent {\n const row = gh.issueEvents.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: issueNumber,\n event,\n actor_id: actorId,\n commit_id: null,\n commit_url: null,\n label_name: null,\n assignee_id: null,\n milestone_title: null,\n rename: null,\n ...extra,\n } as Omit<GitHubIssueEvent, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issueEvents.update(row.id, { node_id: generateNodeId(\"IssueEvent\", row.id) });\n return gh.issueEvents.get(row.id)!;\n}\n\nfunction randomLabelColor(): string {\n return Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, \"0\");\n}\n\nfunction normalizeColor(raw: unknown): string {\n if (typeof raw !== \"string\" || !raw.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const s = raw.trim().replace(/^#/, \"\");\n if (!/^[0-9a-fA-F]{6}$/.test(s)) {\n throw new ApiError(422, \"Validation failed\");\n }\n return s.toLowerCase();\n}\n\nfunction getOrCreateLabel(gh: GitHubStore, repo: GitHubRepo, name: string): GitHubLabel {\n const existing = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (existing) return existing;\n const label = gh.labels.insert({\n node_id: \"\",\n repo_id: repo.id,\n name,\n description: null,\n color: randomLabelColor(),\n default: false,\n } as Omit<GitHubLabel, \"id\" | \"created_at\" | \"updated_at\">);\n gh.labels.update(label.id, { node_id: generateNodeId(\"Label\", label.id) });\n return gh.labels.get(label.id)!;\n}\n\nasync function parseLabelNamesFromBody(c: Context): Promise<string[]> {\n const raw = await c.req.json().catch(() => null);\n if (raw === null) throw new ApiError(422, \"Validation failed\");\n let arr: unknown[];\n if (Array.isArray(raw)) {\n arr = raw;\n } else if (typeof raw === \"object\" && raw !== null && Array.isArray((raw as { labels?: unknown }).labels)) {\n arr = (raw as { labels: unknown[] }).labels;\n } else {\n throw new ApiError(422, \"Validation failed\");\n }\n const names = arr.filter((x): x is string => typeof x === \"string\" && x.length > 0);\n if (names.length !== arr.length) throw new ApiError(422, \"Validation failed\");\n return names;\n}\n\nfunction removeLabelFromAllIssuesAndPrs(gh: GitHubStore, repoId: number, labelId: number) {\n for (const i of gh.issues.findBy(\"repo_id\", repoId)) {\n if (i.label_ids.includes(labelId)) {\n const next = i.label_ids.filter((id) => id !== labelId);\n setIssueLabelIds(gh, i, next);\n }\n }\n}\n\nfunction recalcMilestoneIssueCounts(gh: GitHubStore, repoId: number, milestoneId: number): GitHubMilestone | undefined {\n const m = gh.milestones.get(milestoneId);\n if (!m) return undefined;\n const items = gh.issues.findBy(\"repo_id\", repoId).filter((i) => i.milestone_id === milestoneId);\n let open = 0;\n let closed = 0;\n for (const i of items) {\n if (i.state === \"open\") open++;\n else closed++;\n }\n return gh.milestones.update(milestoneId, { open_issues: open, closed_issues: closed }) ?? m;\n}\n\nfunction sortMilestones(\n list: GitHubMilestone[],\n sort: \"due_on\" | \"completeness\",\n direction: \"asc\" | \"desc\",\n): GitHubMilestone[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const sorted = [...list];\n sorted.sort((a, b) => {\n if (sort === \"due_on\") {\n const aNull = a.due_on === null;\n const bNull = b.due_on === null;\n if (aNull && bNull) return 0;\n // Asc: no due date last. Desc: no due date first (GitHub-style).\n if (aNull) return direction === \"asc\" ? 1 : -1;\n if (bNull) return direction === \"asc\" ? -1 : 1;\n const cmp = a.due_on! < b.due_on! ? -1 : a.due_on! > b.due_on! ? 1 : 0;\n return cmp * mul;\n }\n const totalA = a.open_issues + a.closed_issues;\n const totalB = b.open_issues + b.closed_issues;\n const pctA = totalA === 0 ? 0 : a.closed_issues / totalA;\n const pctB = totalB === 0 ? 0 : b.closed_issues / totalB;\n const cmp = pctA < pctB ? -1 : pctA > pctB ? 1 : 0;\n return cmp * mul;\n });\n return sorted;\n}\n\nexport function labelsAndMilestonesRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const { page, per_page } = parsePagination(c);\n const list = gh.labels.findBy(\"repo_id\", repo.id).slice();\n list.sort((a, b) => a.name.localeCompare(b.name));\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n return c.json(pageItems.map((l) => formatLabel(l, repo, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/labels\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : \"\";\n if (!name) throw new ApiError(422, \"Validation failed\");\n\n const dup = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (dup) throw new ApiError(422, \"Validation failed\");\n\n const color = body.color !== undefined && body.color !== null ? normalizeColor(body.color) : randomLabelColor();\n const description =\n typeof body.description === \"string\" || body.description === null ? (body.description as string | null) : null;\n\n const row = gh.labels.insert({\n node_id: \"\",\n repo_id: repo.id,\n name,\n description,\n color,\n default: false,\n } as Omit<GitHubLabel, \"id\" | \"created_at\" | \"updated_at\">);\n gh.labels.update(row.id, { node_id: generateNodeId(\"Label\", row.id) });\n const label = gh.labels.get(row.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"label\",\n \"created\",\n {\n action: \"created\",\n label: formatLabel(label, repo, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(formatLabel(label, repo, baseUrl), 201);\n });\n\n app.get(\"/repos/:owner/:repo/labels/:name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const rawName = c.req.param(\"name\")!;\n const name = decodeURIComponent(rawName);\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (!label) throw notFoundResponse();\n return c.json(formatLabel(label, repo, baseUrl));\n });\n\n app.patch(\"/repos/:owner/:repo/labels/:name\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const rawName = c.req.param(\"name\")!;\n const name = decodeURIComponent(rawName);\n let label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (!label) throw notFoundResponse();\n const labelId = label.id;\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubLabel> = {};\n if (typeof body.new_name === \"string\" && body.new_name.trim()) {\n const nn = body.new_name.trim();\n const clash = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === nn && l.id !== labelId);\n if (clash) throw new ApiError(422, \"Validation failed\");\n patch.name = nn;\n }\n if (body.color !== undefined) {\n patch.color = normalizeColor(body.color);\n }\n if (\"description\" in body) {\n patch.description =\n typeof body.description === \"string\" || body.description === null ? (body.description as string | null) : null;\n }\n\n const updated = gh.labels.update(labelId, patch);\n if (!updated) throw notFoundResponse();\n label = updated;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"label\",\n \"edited\",\n {\n action: \"edited\",\n label: formatLabel(label, repo, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(formatLabel(label, repo, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/labels/:name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const rawName = c.req.param(\"name\")!;\n const name = decodeURIComponent(rawName);\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (!label) throw notFoundResponse();\n\n removeLabelFromAllIssuesAndPrs(gh, repo.id, label.id);\n gh.labels.delete(label.id);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"label\",\n \"deleted\",\n {\n action: \"deleted\",\n label: formatLabel(label, repo, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const labels = issue.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labels);\n });\n\n app.post(\"/repos/:owner/:repo/issues/:issue_number/labels\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const names = await parseLabelNamesFromBody(c);\n const prev = new Set(issue.label_ids);\n const ids = [...prev];\n for (const n of names) {\n const label = getOrCreateLabel(gh, repo, n);\n if (!ids.includes(label.id)) ids.push(label.id);\n }\n setIssueLabelIds(gh, issue, ids);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const after = gh.issues.get(issue.id)!;\n for (const id of after.label_ids) {\n if (!prev.has(id)) {\n const lbl = gh.labels.get(id);\n if (lbl) {\n insertIssueEvent(gh, repo, issue.number, \"labeled\", actor.id, { label_name: lbl.name });\n webhooks.dispatch(\n \"issues\",\n \"labeled\",\n {\n action: \"labeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: lbl ? { name: lbl.name, color: lbl.color } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n }\n\n const labelsJson = after.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labelsJson);\n });\n\n app.put(\"/repos/:owner/:repo/issues/:issue_number/labels\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const names = await parseLabelNamesFromBody(c);\n const newIds = [...new Set(names.map((n) => getOrCreateLabel(gh, repo, n).id))];\n const prev = new Set(issue.label_ids);\n\n setIssueLabelIds(gh, issue, newIds);\n const after = gh.issues.get(issue.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n for (const id of prev) {\n if (!newIds.includes(id)) {\n const lbl = gh.labels.get(id);\n insertIssueEvent(gh, repo, issue.number, \"unlabeled\", actor.id, { label_name: lbl?.name ?? null });\n webhooks.dispatch(\n \"issues\",\n \"unlabeled\",\n {\n action: \"unlabeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: lbl ? { name: lbl.name, color: lbl.color } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n for (const id of newIds) {\n if (!prev.has(id)) {\n const lbl = gh.labels.get(id);\n if (lbl) {\n insertIssueEvent(gh, repo, issue.number, \"labeled\", actor.id, { label_name: lbl.name });\n webhooks.dispatch(\n \"issues\",\n \"labeled\",\n {\n action: \"labeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: { name: lbl.name, color: lbl.color },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n }\n\n const labelsJson = after.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labelsJson);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/labels/:name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const rawLabelName = c.req.param(\"name\")!;\n const labelName = decodeURIComponent(rawLabelName);\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === labelName);\n if (!label || !issue.label_ids.includes(label.id)) throw notFoundResponse();\n\n const next = issue.label_ids.filter((id) => id !== label.id);\n setIssueLabelIds(gh, issue, next);\n const after = gh.issues.get(issue.id)!;\n\n insertIssueEvent(gh, repo, issue.number, \"unlabeled\", actor.id, { label_name: label.name });\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"issues\",\n \"unlabeled\",\n {\n action: \"unlabeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: { name: label.name, color: label.color },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n const labelsJson = after.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labelsJson);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n setIssueLabelIds(gh, issue, []);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/milestones\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const stateQ = c.req.query(\"state\") ?? \"open\";\n const state: \"open\" | \"closed\" | \"all\" =\n stateQ === \"closed\" || stateQ === \"all\" || stateQ === \"open\" ? stateQ : \"open\";\n\n const sortRaw = c.req.query(\"sort\") ?? \"due_on\";\n const sort: \"due_on\" | \"completeness\" = sortRaw === \"completeness\" ? \"completeness\" : \"due_on\";\n\n const dirRaw = c.req.query(\"direction\") ?? \"desc\";\n const direction: \"asc\" | \"desc\" = dirRaw === \"asc\" ? \"asc\" : \"desc\";\n\n let list = gh.milestones.findBy(\"repo_id\", repo.id).map((m) => recalcMilestoneIssueCounts(gh, repo.id, m.id)!);\n\n if (state === \"open\") list = list.filter((m) => m.state === \"open\");\n else if (state === \"closed\") list = list.filter((m) => m.state === \"closed\");\n\n list = sortMilestones(list, sort, direction);\n\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n return c.json(pageItems.map((m) => formatMilestone(m, repo, gh, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/milestones\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const title = typeof body.title === \"string\" ? body.title.trim() : \"\";\n if (!title) throw new ApiError(422, \"Validation failed\");\n\n let state: \"open\" | \"closed\" = \"open\";\n if (body.state === \"open\" || body.state === \"closed\") state = body.state;\n\n const description =\n typeof body.description === \"string\" || body.description === null ? (body.description as string | null) : null;\n\n let due_on: string | null = null;\n if (\"due_on\" in body) {\n if (body.due_on === null) {\n due_on = null;\n } else if (typeof body.due_on === \"string\") {\n due_on = body.due_on;\n } else {\n throw new ApiError(422, \"Validation failed\");\n }\n }\n\n const num = getNextMilestoneNumber(gh, repo.id);\n const closed_at = state === \"closed\" ? timestamp() : null;\n\n const row = gh.milestones.insert({\n node_id: \"\",\n repo_id: repo.id,\n number: num,\n title,\n description,\n state,\n open_issues: 0,\n closed_issues: 0,\n due_on,\n closed_at,\n creator_id: actor.id,\n } as Omit<GitHubMilestone, \"id\" | \"created_at\" | \"updated_at\">);\n gh.milestones.update(row.id, { node_id: generateNodeId(\"Milestone\", row.id) });\n const m = recalcMilestoneIssueCounts(gh, repo.id, row.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"milestone\",\n state === \"closed\" ? \"closed\" : \"created\",\n {\n action: state === \"closed\" ? \"closed\" : \"created\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(formatMilestone(m, repo, gh, baseUrl), 201);\n });\n\n app.get(\"/repos/:owner/:repo/milestones/:milestone_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n const raw = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === n);\n if (!raw) throw notFoundResponse();\n const m = recalcMilestoneIssueCounts(gh, repo.id, raw.id)!;\n return c.json(formatMilestone(m, repo, gh, baseUrl));\n });\n\n app.patch(\"/repos/:owner/:repo/milestones/:milestone_number\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n let m = gh.milestones.findBy(\"repo_id\", repo.id).find((x) => x.number === n);\n if (!m) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubMilestone> = {};\n\n if (typeof body.title === \"string\") patch.title = body.title;\n if (body.state === \"open\" || body.state === \"closed\") {\n patch.state = body.state;\n }\n if (\"description\" in body) {\n patch.description =\n typeof body.description === \"string\" || body.description === null ? (body.description as string | null) : null;\n }\n if (\"due_on\" in body) {\n if (body.due_on === null) patch.due_on = null;\n else if (typeof body.due_on === \"string\") patch.due_on = body.due_on;\n else throw new ApiError(422, \"Validation failed\");\n }\n\n const prevState = m.state;\n if (patch.state === \"closed\" && prevState === \"open\") {\n patch.closed_at = m.closed_at ?? timestamp();\n } else if (patch.state === \"open\" && prevState === \"closed\") {\n patch.closed_at = null;\n }\n\n const updated = gh.milestones.update(m.id, patch);\n if (!updated) throw notFoundResponse();\n m = recalcMilestoneIssueCounts(gh, repo.id, updated.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n if (patch.state === \"closed\" && prevState === \"open\") {\n webhooks.dispatch(\n \"milestone\",\n \"closed\",\n {\n action: \"closed\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n } else if (patch.state === \"open\" && prevState === \"closed\") {\n webhooks.dispatch(\n \"milestone\",\n \"opened\",\n {\n action: \"opened\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n } else {\n webhooks.dispatch(\n \"milestone\",\n \"edited\",\n {\n action: \"edited\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n\n return c.json(formatMilestone(m, repo, gh, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/milestones/:milestone_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n const m = gh.milestones.findBy(\"repo_id\", repo.id).find((x) => x.number === n);\n if (!m) throw notFoundResponse();\n\n for (const i of gh.issues.findBy(\"repo_id\", repo.id)) {\n if (i.milestone_id === m.id) gh.issues.update(i.id, { milestone_id: null });\n }\n for (const p of gh.pullRequests.findBy(\"repo_id\", repo.id)) {\n if (p.milestone_id === m.id) gh.pullRequests.update(p.id, { milestone_id: null });\n }\n\n gh.milestones.delete(m.id);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"milestone\",\n \"deleted\",\n {\n action: \"deleted\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/milestones/:milestone_number/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === n);\n if (!ms) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n\n const labelIdSet = new Set<number>();\n for (const i of gh.issues.findBy(\"repo_id\", repo.id)) {\n if (i.milestone_id !== ms.id) continue;\n for (const lid of i.label_ids) labelIdSet.add(lid);\n }\n\n const labels = [...labelIdSet].map((id) => gh.labels.get(id)).filter(Boolean) as GitHubLabel[];\n labels.sort((a, b) => a.name.localeCompare(b.name));\n\n const total = labels.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = labels.slice(start, start + per_page);\n return c.json(pageItems.map((l) => formatLabel(l, repo, baseUrl)));\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBlob,\n GitHubBranch,\n GitHubBranchProtection,\n GitHubCommit,\n GitHubRef,\n GitHubRepo,\n GitHubTag,\n GitHubTree,\n GitHubUser,\n} from \"../entities.js\";\nimport {\n formatBranch,\n formatRepo,\n formatUser,\n generateNodeId,\n generateSha,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoAdmin,\n assertRepoRead,\n assertRepoWrite,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction findBranchByName(gh: GitHubStore, repoId: number, name: string) {\n return gh.branches.findBy(\"repo_id\", repoId).find((b) => b.name === name);\n}\n\nfunction findCommitBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.commits.findBy(\"repo_id\", repoId).find((c) => c.sha === sha);\n}\n\nfunction findTreeBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.trees.findBy(\"repo_id\", repoId).find((t) => t.sha === sha);\n}\n\nfunction findBlobBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.blobs.findBy(\"repo_id\", repoId).find((b) => b.sha === sha);\n}\n\nfunction findTagObjectBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.tags.findBy(\"repo_id\", repoId).find((t) => t.sha === sha);\n}\n\nfunction fullRefFromParam(refParam: string): string {\n return refParam.startsWith(\"refs/\") ? refParam : `refs/${refParam}`;\n}\n\nfunction isDescendantOf(gh: GitHubStore, repoId: number, ancestorSha: string, descendantSha: string): boolean {\n const visiting = new Set<string>();\n const stack = [descendantSha];\n while (stack.length) {\n const sha = stack.pop()!;\n if (sha === ancestorSha) return true;\n if (visiting.has(sha)) continue;\n visiting.add(sha);\n const commit = findCommitBySha(gh, repoId, sha);\n if (!commit) continue;\n for (const p of commit.parent_shas) stack.push(p);\n }\n return false;\n}\n\nfunction resolveGitObjectType(gh: GitHubStore, repoId: number, sha: string): \"commit\" | \"tag\" | \"blob\" | \"tree\" {\n if (findCommitBySha(gh, repoId, sha)) return \"commit\";\n if (findTagObjectBySha(gh, repoId, sha)) return \"tag\";\n if (findTreeBySha(gh, repoId, sha)) return \"tree\";\n if (findBlobBySha(gh, repoId, sha)) return \"blob\";\n return \"commit\";\n}\n\nfunction objectApiUrl(\n repo: GitHubRepo,\n baseUrl: string,\n type: \"commit\" | \"tag\" | \"blob\" | \"tree\",\n sha: string,\n): string {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n switch (type) {\n case \"commit\":\n return `${repoUrl}/git/commits/${sha}`;\n case \"tag\":\n return `${repoUrl}/git/tags/${sha}`;\n case \"tree\":\n return `${repoUrl}/git/trees/${sha}`;\n default:\n return `${repoUrl}/git/blobs/${sha}`;\n }\n}\n\nfunction formatRefJson(gh: GitHubStore, repo: GitHubRepo, fullRef: string, sha: string, baseUrl: string) {\n const refRec = gh.refs.findBy(\"repo_id\", repo.id).find((r) => r.ref === fullRef);\n const type = resolveGitObjectType(gh, repo.id, sha);\n const shortRef = fullRef.startsWith(\"refs/\") ? fullRef.slice(5) : fullRef;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n ref: fullRef,\n node_id: refRec?.node_id ?? \"\",\n url: `${repoUrl}/git/ref/${shortRef}`,\n object: {\n type,\n sha,\n url: objectApiUrl(repo, baseUrl, type, sha),\n },\n };\n}\n\nfunction syncBranchFromRef(gh: GitHubStore, repo: GitHubRepo, fullRef: string, sha: string) {\n if (!fullRef.startsWith(\"refs/heads/\")) return;\n const name = fullRef.slice(\"refs/heads/\".length);\n const existing = findBranchByName(gh, repo.id, name);\n if (existing) {\n gh.branches.update(existing.id, { sha });\n } else {\n gh.branches.insert({\n repo_id: repo.id,\n name,\n sha,\n protected: false,\n } as Omit<GitHubBranch, \"id\" | \"created_at\" | \"updated_at\">);\n }\n}\n\nfunction deleteBranchForHeadRef(gh: GitHubStore, repoId: number, fullRef: string) {\n if (!fullRef.startsWith(\"refs/heads/\")) return;\n const name = fullRef.slice(\"refs/heads/\".length);\n const b = findBranchByName(gh, repoId, name);\n if (b) gh.branches.delete(b.id);\n}\n\nfunction expandTreeEntries(\n gh: GitHubStore,\n repoId: number,\n entries: GitHubTree[\"tree\"],\n recursive: boolean,\n prefix = \"\",\n): GitHubTree[\"tree\"] {\n const out: GitHubTree[\"tree\"] = [];\n for (const e of entries) {\n const path = prefix ? `${prefix}/${e.path}` : e.path;\n if (e.type === \"blob\") {\n out.push({ ...e, path });\n } else if (e.type === \"tree\" && recursive) {\n const sub = findTreeBySha(gh, repoId, e.sha);\n if (sub) {\n out.push(...expandTreeEntries(gh, repoId, sub.tree, true, path));\n } else {\n out.push({ ...e, path });\n }\n } else {\n out.push({ ...e, path });\n }\n }\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction formatCommitJson(gh: GitHubStore, repo: GitHubRepo, c: GitHubCommit, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const htmlUrl = `${baseUrl}/${repo.full_name}/commit/${c.sha}`;\n const authorUser = c.user_id ? gh.users.get(c.user_id) : null;\n return {\n sha: c.sha,\n node_id: c.node_id,\n url: `${repoUrl}/git/commits/${c.sha}`,\n html_url: htmlUrl,\n author: authorUser ? formatUser(authorUser, baseUrl) : null,\n committer: authorUser ? formatUser(authorUser, baseUrl) : null,\n parents: c.parent_shas.map((sha) => ({\n sha,\n url: `${repoUrl}/git/commits/${sha}`,\n })),\n stats: { total: 0, additions: 0, deletions: 0 },\n files: [],\n commit: {\n author: {\n name: c.author_name,\n email: c.author_email,\n date: c.author_date,\n },\n committer: {\n name: c.committer_name,\n email: c.committer_email,\n date: c.committer_date,\n },\n message: c.message,\n tree: { sha: c.tree_sha, url: `${repoUrl}/git/trees/${c.tree_sha}` },\n url: `${repoUrl}/git/commits/${c.sha}`,\n comment_count: 0,\n verification: { verified: false, reason: \"unsigned\", signature: null, payload: null, verified_at: null },\n },\n };\n}\n\nfunction protectionEntityToGitHub(gh: GitHubStore, repo: GitHubRepo, bp: GitHubBranchProtection, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const encBranch = encodeURIComponent(bp.branch_name);\n const base = `${repoUrl}/branches/${encBranch}/protection`;\n return {\n url: base,\n required_status_checks: bp.required_status_checks\n ? {\n url: `${base}/required_status_checks`,\n strict: bp.required_status_checks.strict,\n contexts: bp.required_status_checks.contexts,\n contexts_url: `${base}/required_status_checks/contexts`,\n checks: bp.required_status_checks.contexts.map((c) => ({\n context: c,\n app_id: null,\n })),\n }\n : null,\n enforce_admins: {\n url: `${base}/enforce_admins`,\n enabled: bp.enforce_admins,\n },\n required_pull_request_reviews: bp.required_pull_request_reviews\n ? {\n url: `${base}/required_pull_request_reviews`,\n dismiss_stale_reviews: bp.required_pull_request_reviews.dismiss_stale_reviews,\n require_code_owner_reviews: bp.required_pull_request_reviews.require_code_owner_reviews,\n required_approving_review_count: bp.required_pull_request_reviews.required_approving_review_count,\n }\n : null,\n restrictions: bp.restrictions\n ? {\n url: `${base}/restrictions`,\n users_url: `${base}/restrictions/users`,\n teams_url: `${base}/restrictions/teams`,\n apps_url: `${base}/restrictions/apps`,\n users: bp.restrictions.users.map((login) => ({\n login,\n id: 0,\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/${login}`,\n gravatar_id: \"\",\n url: `${baseUrl}/users/${login}`,\n html_url: `${baseUrl}/${login}`,\n type: \"User\",\n site_admin: false,\n })),\n teams: bp.restrictions.teams.map((slug) => ({\n id: 0,\n node_id: \"\",\n url: `${baseUrl}/teams/0`,\n name: slug,\n slug,\n })),\n apps: [],\n }\n : null,\n required_linear_history: { enabled: bp.required_linear_history },\n allow_force_pushes: { enabled: bp.allow_force_pushes },\n allow_deletions: { enabled: bp.allow_deletions },\n required_conversation_resolution: { enabled: false },\n required_signatures: { url: `${base}/required_signatures`, enabled: bp.required_signatures },\n lock_branch: { enabled: false },\n allow_fork_syncing: { enabled: false },\n };\n}\n\nfunction parseProtectionPutBody(\n body: Record<string, unknown>,\n): Omit<GitHubBranchProtection, \"id\" | \"repo_id\" | \"branch_name\" | \"created_at\" | \"updated_at\"> {\n const rsc = body.required_status_checks;\n let required_status_checks: GitHubBranchProtection[\"required_status_checks\"] = null;\n if (rsc && typeof rsc === \"object\" && rsc !== null) {\n const o = rsc as Record<string, unknown>;\n required_status_checks = {\n strict: Boolean(o.strict),\n contexts: Array.isArray(o.contexts) ? o.contexts.filter((x): x is string => typeof x === \"string\") : [],\n };\n }\n\n let enforce_admins = false;\n const ea = body.enforce_admins;\n if (typeof ea === \"boolean\") enforce_admins = ea;\n else if (ea && typeof ea === \"object\" && \"enabled\" in ea) {\n enforce_admins = Boolean((ea as { enabled?: unknown }).enabled);\n }\n\n const rprr = body.required_pull_request_reviews;\n let required_pull_request_reviews: GitHubBranchProtection[\"required_pull_request_reviews\"] = null;\n if (rprr && typeof rprr === \"object\" && rprr !== null) {\n const o = rprr as Record<string, unknown>;\n required_pull_request_reviews = {\n required_approving_review_count:\n typeof o.required_approving_review_count === \"number\" ? o.required_approving_review_count : 1,\n dismiss_stale_reviews: Boolean(o.dismiss_stale_reviews),\n require_code_owner_reviews: Boolean(o.require_code_owner_reviews),\n };\n }\n\n const rest = body.restrictions;\n let restrictions: GitHubBranchProtection[\"restrictions\"] = null;\n if (rest && typeof rest === \"object\" && rest !== null) {\n const o = rest as Record<string, unknown>;\n restrictions = {\n users: Array.isArray(o.users)\n ? o.users\n .map((u) => (typeof u === \"string\" ? u : (u as { login?: string })?.login))\n .filter((x): x is string => typeof x === \"string\")\n : [],\n teams: Array.isArray(o.teams)\n ? o.teams\n .map((t) => (typeof t === \"string\" ? t : (t as { slug?: string })?.slug))\n .filter((x): x is string => typeof x === \"string\")\n : [],\n };\n }\n\n const rlh = body.required_linear_history;\n const required_linear_history =\n typeof rlh === \"boolean\"\n ? rlh\n : rlh && typeof rlh === \"object\" && rlh !== null\n ? Boolean((rlh as { enabled?: unknown }).enabled)\n : false;\n const afp = body.allow_force_pushes;\n const allow_force_pushes =\n typeof afp === \"boolean\"\n ? afp\n : afp && typeof afp === \"object\" && afp !== null\n ? Boolean((afp as { enabled?: unknown }).enabled)\n : false;\n const ad = body.allow_deletions;\n const allow_deletions =\n typeof ad === \"boolean\"\n ? ad\n : ad && typeof ad === \"object\" && ad !== null\n ? Boolean((ad as { enabled?: unknown }).enabled)\n : false;\n\n return {\n required_status_checks,\n enforce_admins,\n required_pull_request_reviews,\n restrictions,\n required_linear_history,\n allow_force_pushes,\n allow_deletions,\n required_signatures: Boolean(\n typeof body.required_signatures === \"boolean\"\n ? body.required_signatures\n : (body.required_signatures as { enabled?: boolean } | undefined)?.enabled,\n ),\n };\n}\n\nexport function branchesAndGitRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Branches: sub-routes before generic protection/branch ---\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_status_checks\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp || !bp.required_status_checks) throw notFoundResponse();\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const base = `${repoUrl}/branches/${encBranch}/protection/required_status_checks`;\n return c.json({\n url: base,\n strict: bp.required_status_checks.strict,\n contexts: bp.required_status_checks.contexts,\n contexts_url: `${base}/contexts`,\n checks: bp.required_status_checks.contexts.map((ctx) => ({\n context: ctx,\n app_id: null,\n })),\n });\n });\n\n app.patch(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_status_checks\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n const body = await parseJsonBody(c);\n const strict = typeof body.strict === \"boolean\" ? body.strict : (bp.required_status_checks?.strict ?? false);\n const contexts = Array.isArray(body.contexts)\n ? body.contexts.filter((x): x is string => typeof x === \"string\")\n : (bp.required_status_checks?.contexts ?? []);\n gh.branchProtections.update(bp.id, {\n required_status_checks: { strict, contexts },\n });\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const url = `${repoUrl}/branches/${encBranch}/protection/required_status_checks`;\n return c.json({\n url,\n strict,\n contexts,\n contexts_url: `${url}/contexts`,\n checks: contexts.map((ctx) => ({ context: ctx, app_id: null })),\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection/enforce_admins\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const url = `${repoUrl}/branches/${encBranch}/protection/enforce_admins`;\n return c.json({\n url,\n enabled: bp.enforce_admins,\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_pull_request_reviews\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp || !bp.required_pull_request_reviews) throw notFoundResponse();\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const base = `${repoUrl}/branches/${encBranch}/protection/required_pull_request_reviews`;\n const r = bp.required_pull_request_reviews;\n return c.json({\n url: base,\n dismiss_stale_reviews: r.dismiss_stale_reviews,\n require_code_owner_reviews: r.require_code_owner_reviews,\n required_approving_review_count: r.required_approving_review_count,\n });\n });\n\n app.patch(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_pull_request_reviews\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n const body = await parseJsonBody(c);\n const prev = bp.required_pull_request_reviews ?? {\n required_approving_review_count: 1,\n dismiss_stale_reviews: false,\n require_code_owner_reviews: false,\n };\n const next = {\n required_approving_review_count:\n typeof body.required_approving_review_count === \"number\"\n ? body.required_approving_review_count\n : prev.required_approving_review_count,\n dismiss_stale_reviews:\n typeof body.dismiss_stale_reviews === \"boolean\" ? body.dismiss_stale_reviews : prev.dismiss_stale_reviews,\n require_code_owner_reviews:\n typeof body.require_code_owner_reviews === \"boolean\"\n ? body.require_code_owner_reviews\n : prev.require_code_owner_reviews,\n };\n gh.branchProtections.update(bp.id, { required_pull_request_reviews: next });\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const url = `${repoUrl}/branches/${encBranch}/protection/required_pull_request_reviews`;\n return c.json({\n url,\n ...next,\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n return c.json(protectionEntityToGitHub(gh, repo, bp, baseUrl));\n });\n\n app.put(\"/repos/:owner/:repo/branches/:branch{.+}/protection\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const b = findBranchByName(gh, repo.id, branch);\n if (!b) throw notFoundResponse();\n const body = await parseJsonBody(c);\n const parsed = parseProtectionPutBody(body);\n const existing = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (existing) {\n gh.branchProtections.update(existing.id, { ...parsed });\n } else {\n gh.branchProtections.insert({\n repo_id: repo.id,\n branch_name: branch,\n ...parsed,\n } as Omit<GitHubBranchProtection, \"id\" | \"created_at\" | \"updated_at\">);\n }\n gh.branches.update(b.id, { protected: true });\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch)!;\n webhooks.dispatch(\n \"branch_protection_rule\",\n \"edited\",\n {\n action: \"edited\",\n rule: protectionEntityToGitHub(gh, repo, bp, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n },\n ownerLoginOf(gh, repo),\n repo.name,\n );\n return c.json(protectionEntityToGitHub(gh, repo, bp, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/branches/:branch{.+}/protection\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (bp) gh.branchProtections.delete(bp.id);\n const b = findBranchByName(gh, repo.id, branch);\n if (b) gh.branches.update(b.id, { protected: false });\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branchName = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const branch = findBranchByName(gh, repo.id, branchName);\n if (!branch) throw notFoundResponse();\n const commit = findCommitBySha(gh, repo.id, branch.sha);\n const base = formatBranch(branch, repo, baseUrl);\n if (!branch.protected) return c.json(base);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branchName);\n return c.json({\n ...base,\n protection: {\n enabled: true,\n required_status_checks: bp?.required_status_checks\n ? {\n enforcement_level: \"everyone\",\n contexts: bp.required_status_checks.contexts,\n checks: bp.required_status_checks.contexts.map((ctx) => ({ context: ctx, app_id: null })),\n }\n : { enforcement_level: \"off\", contexts: [], checks: [] },\n },\n protection_commit: commit\n ? {\n author: { email: commit.author_email, name: commit.author_name },\n url: `${baseUrl}/repos/${repo.full_name}/commits/${commit.sha}`,\n message: commit.message,\n html_url: `${baseUrl}/${repo.full_name}/commit/${commit.sha}`,\n }\n : null,\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n let list = [...gh.branches.findBy(\"repo_id\", repo.id)].sort((a, b) => a.name.localeCompare(b.name));\n const prot = c.req.query(\"protected\");\n if (prot === \"true\") list = list.filter((b) => b.protected);\n else if (prot === \"false\") list = list.filter((b) => !b.protected);\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n const start = (page - 1) * per_page;\n const slice = list.slice(start, start + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((b) => formatBranch(b, repo, baseUrl)));\n });\n\n // --- Git refs ---\n\n app.get(\"/repos/:owner/:repo/git/ref/:ref{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const fullRef = fullRefFromParam(refParam);\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (!r) throw notFoundResponse();\n return c.json(formatRefJson(gh, repo, r.ref, r.sha, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/git/matching-refs/:ref{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const prefix = fullRefFromParam(refParam);\n const matches = gh.refs\n .findBy(\"repo_id\", repo.id)\n .filter((r) => r.ref.startsWith(prefix))\n .sort((a, b) => a.ref.localeCompare(b.ref));\n return c.json(matches.map((r) => formatRefJson(gh, repo, r.ref, r.sha, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/git/refs\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const user = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = (await parseJsonBody(c)) as { ref?: unknown; sha?: unknown };\n if (typeof body.ref !== \"string\" || !body.ref.startsWith(\"refs/\")) {\n throw new ApiError(422, \"Invalid ref\");\n }\n if (typeof body.sha !== \"string\") {\n throw new ApiError(422, \"sha is required\");\n }\n const fullRef = body.ref;\n const sha = body.sha;\n if (findCommitBySha(gh, repo.id, sha) === undefined && findTagObjectBySha(gh, repo.id, sha) === undefined) {\n throw new ApiError(422, \"Invalid sha\");\n }\n if (gh.refs.findBy(\"repo_id\", repo.id).some((r) => r.ref === fullRef)) {\n throw new ApiError(422, \"Reference already exists\");\n }\n const refRow = gh.refs.insert({\n repo_id: repo.id,\n ref: fullRef,\n sha,\n node_id: \"\",\n } as Omit<GitHubRef, \"id\" | \"created_at\" | \"updated_at\">);\n gh.refs.update(refRow.id, { node_id: generateNodeId(\"Ref\", refRow.id) });\n syncBranchFromRef(gh, repo, fullRef, sha);\n webhooks.dispatch(\n \"create\",\n undefined,\n {\n ref: fullRef,\n ref_type: fullRef.startsWith(\"refs/heads/\") ? \"branch\" : \"tag\",\n master_branch: repo.default_branch,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(user, baseUrl),\n },\n ownerLoginOf(gh, repo),\n repo.name,\n );\n const r = gh.refs.get(refRow.id)!;\n return c.json(formatRefJson(gh, repo, r.ref, r.sha, baseUrl), 201);\n });\n\n app.patch(\"/repos/:owner/:repo/git/refs/:ref{.+}\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const user = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const fullRef = fullRefFromParam(refParam);\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (!r) throw notFoundResponse();\n const body = (await parseJsonBody(c)) as { sha?: unknown; force?: unknown };\n if (typeof body.sha !== \"string\") {\n throw new ApiError(422, \"sha is required\");\n }\n const newSha = body.sha;\n const force = Boolean(body.force);\n const oldSha = r.sha;\n if (findCommitBySha(gh, repo.id, newSha) === undefined && findTagObjectBySha(gh, repo.id, newSha) === undefined) {\n throw new ApiError(422, \"Invalid sha\");\n }\n if (!force) {\n const oldCommit = findCommitBySha(gh, repo.id, oldSha);\n const newCommit = findCommitBySha(gh, repo.id, newSha);\n if (!oldCommit || !newCommit) {\n throw new ApiError(422, \"Fast-forward update requires commit objects\");\n }\n if (!isDescendantOf(gh, repo.id, oldSha, newSha)) {\n throw new ApiError(422, \"Update is not a fast-forward\");\n }\n }\n gh.refs.update(r.id, { sha: newSha });\n syncBranchFromRef(gh, repo, fullRef, newSha);\n webhooks.dispatch(\n \"push\",\n undefined,\n {\n ref: fullRef,\n before: oldSha,\n after: newSha,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(user, baseUrl),\n },\n ownerLoginOf(gh, repo),\n repo.name,\n );\n const updated = gh.refs.get(r.id)!;\n return c.json(formatRefJson(gh, repo, updated.ref, updated.sha, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/git/refs/:ref{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const fullRef = fullRefFromParam(refParam);\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (!r) throw notFoundResponse();\n gh.refs.delete(r.id);\n deleteBranchForHeadRef(gh, repo.id, fullRef);\n return c.body(null, 204);\n });\n\n // --- Git commits ---\n\n app.get(\"/repos/:owner/:repo/git/commits/:commit_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const commitSha = c.req.param(\"commit_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const commit = findCommitBySha(gh, repo.id, commitSha);\n if (!commit) throw notFoundResponse();\n return c.json(formatCommitJson(gh, repo, commit, baseUrl));\n });\n\n app.post(\"/repos/:owner/:repo/git/commits\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (typeof body.message !== \"string\") throw new ApiError(422, \"message is required\");\n if (typeof body.tree !== \"string\") throw new ApiError(422, \"tree is required\");\n if (!Array.isArray(body.parents)) throw new ApiError(422, \"parents must be an array\");\n const parents = body.parents.filter((p): p is string => typeof p === \"string\");\n const treeSha = body.tree as string;\n if (!findTreeBySha(gh, repo.id, treeSha)) throw new ApiError(422, \"Invalid tree\");\n for (const p of parents) {\n if (!findCommitBySha(gh, repo.id, p)) throw new ApiError(422, `Invalid parent ${p}`);\n }\n let author_name: string;\n let author_email: string;\n let author_date: string;\n let committer_name: string;\n let committer_email: string;\n let committer_date: string;\n const now = timestamp();\n const actor = getActorUser(gh, c.get(\"authUser\")!);\n const defaultName = actor?.name ?? actor?.login ?? \"user\";\n const defaultEmail = actor?.email ?? `${actor?.login ?? \"user\"}@users.noreply.github.com`;\n if (body.author && typeof body.author === \"object\" && body.author !== null) {\n const a = body.author as Record<string, unknown>;\n author_name = typeof a.name === \"string\" ? a.name : defaultName;\n author_email = typeof a.email === \"string\" ? a.email : defaultEmail;\n author_date = typeof a.date === \"string\" ? a.date : now;\n } else {\n author_name = defaultName;\n author_email = defaultEmail;\n author_date = now;\n }\n if (body.committer && typeof body.committer === \"object\" && body.committer !== null) {\n const a = body.committer as Record<string, unknown>;\n committer_name = typeof a.name === \"string\" ? a.name : defaultName;\n committer_email = typeof a.email === \"string\" ? a.email : defaultEmail;\n committer_date = typeof a.date === \"string\" ? a.date : now;\n } else {\n committer_name = author_name;\n committer_email = author_email;\n committer_date = author_date;\n }\n const commit = gh.commits.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n message: body.message as string,\n author_name,\n author_email,\n author_date,\n committer_name,\n committer_email,\n committer_date,\n tree_sha: treeSha,\n parent_shas: parents,\n user_id: actor?.id ?? null,\n } as Omit<GitHubCommit, \"id\" | \"created_at\" | \"updated_at\">);\n gh.commits.update(commit.id, { node_id: generateNodeId(\"Commit\", commit.id) });\n const saved = gh.commits.get(commit.id)!;\n return c.json(formatCommitJson(gh, repo, saved, baseUrl), 201);\n });\n\n // --- Git trees ---\n\n app.get(\"/repos/:owner/:repo/git/trees/:tree_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const treeSha = c.req.param(\"tree_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const tree = findTreeBySha(gh, repo.id, treeSha);\n if (!tree) throw notFoundResponse();\n const recursive = c.req.query(\"recursive\") === \"1\" || c.req.query(\"recursive\") === \"true\";\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const entries = recursive\n ? expandTreeEntries(gh, repo.id, tree.tree, true)\n : tree.tree.filter((e) => !e.path.includes(\"/\"));\n return c.json({\n sha: tree.sha,\n url: `${repoUrl}/git/trees/${tree.sha}`,\n tree: entries,\n truncated: tree.truncated,\n });\n });\n\n app.post(\"/repos/:owner/:repo/git/trees\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (!Array.isArray(body.tree)) throw new ApiError(422, \"tree array is required\");\n const items = body.tree as Array<{\n path?: string;\n mode?: string;\n type?: string;\n sha?: string;\n content?: string;\n }>;\n const pathMap = new Map<string, { mode: string; type: \"blob\" | \"tree\"; sha: string; size?: number }>();\n\n const baseTreeSha = typeof body.base_tree === \"string\" ? body.base_tree : undefined;\n if (baseTreeSha) {\n const base = findTreeBySha(gh, repo.id, baseTreeSha);\n if (!base) throw new ApiError(422, \"Invalid base_tree\");\n for (const e of base.tree) {\n pathMap.set(e.path, { mode: e.mode, type: e.type, sha: e.sha, size: e.size });\n }\n }\n\n for (const raw of items) {\n if (\n typeof raw.path !== \"string\" ||\n typeof raw.mode !== \"string\" ||\n (raw.type !== \"blob\" && raw.type !== \"tree\")\n ) {\n throw new ApiError(422, \"Each tree entry needs path, mode, type (blob|tree)\");\n }\n if (raw.sha !== undefined && raw.content !== undefined) {\n throw new ApiError(422, \"Cannot pass both sha and content\");\n }\n let sha = raw.sha;\n if (raw.content !== undefined) {\n const buf = Buffer.from(String(raw.content), \"utf8\");\n const blob = gh.blobs.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n content: String(raw.content),\n encoding: \"utf-8\",\n size: buf.byteLength,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n sha = blob.sha;\n }\n if (typeof sha !== \"string\") throw new ApiError(422, \"sha or content required\");\n pathMap.set(raw.path, { mode: raw.mode, type: raw.type, sha });\n }\n\n const treeEntries: GitHubTree[\"tree\"] = [...pathMap.entries()].map(([path, v]) => ({\n path,\n mode: v.mode,\n type: v.type,\n sha: v.sha,\n size: v.size,\n }));\n\n const tree = gh.trees.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n tree: treeEntries,\n truncated: false,\n } as Omit<GitHubTree, \"id\" | \"created_at\" | \"updated_at\">);\n gh.trees.update(tree.id, { node_id: generateNodeId(\"Tree\", tree.id) });\n const saved = gh.trees.get(tree.id)!;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json(\n {\n sha: saved.sha,\n url: `${repoUrl}/git/trees/${saved.sha}`,\n tree: saved.tree,\n truncated: saved.truncated,\n },\n 201,\n );\n });\n\n // --- Git blobs ---\n\n app.get(\"/repos/:owner/:repo/git/blobs/:file_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const fileSha = c.req.param(\"file_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const blob = findBlobBySha(gh, repo.id, fileSha);\n if (!blob) throw notFoundResponse();\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const content = blob.encoding === \"base64\" ? blob.content : Buffer.from(blob.content, \"utf8\").toString(\"base64\");\n return c.json({\n sha: blob.sha,\n node_id: blob.node_id,\n size: blob.size,\n url: `${repoUrl}/git/blobs/${blob.sha}`,\n content,\n encoding: \"base64\",\n });\n });\n\n app.post(\"/repos/:owner/:repo/git/blobs\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = (await parseJsonBody(c)) as {\n content?: unknown;\n encoding?: unknown;\n };\n if (typeof body.content !== \"string\") throw new ApiError(422, \"content is required\");\n const enc = body.encoding === \"base64\" || body.encoding === \"utf-8\" ? body.encoding : \"utf-8\";\n if (enc === \"base64\") {\n const blob = gh.blobs.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n content: body.content,\n encoding: \"base64\",\n size: Buffer.from(body.content, \"base64\").length,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const saved = gh.blobs.get(blob.id)!;\n return c.json(\n {\n sha: saved.sha,\n node_id: saved.node_id,\n url: `${repoUrl}/git/blobs/${saved.sha}`,\n size: saved.size,\n },\n 201,\n );\n }\n const raw = body.content;\n const size = Buffer.byteLength(raw, \"utf8\");\n const blob = gh.blobs.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n content: raw,\n encoding: \"utf-8\",\n size,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n const saved = gh.blobs.get(blob.id)!;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json(\n {\n sha: saved.sha,\n node_id: saved.node_id,\n url: `${repoUrl}/git/blobs/${saved.sha}`,\n size: saved.size,\n },\n 201,\n );\n });\n\n // --- Git tags ---\n\n app.get(\"/repos/:owner/:repo/git/tags/:tag_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const tagSha = c.req.param(\"tag_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const tag = findTagObjectBySha(gh, repo.id, tagSha);\n if (!tag) throw notFoundResponse();\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json({\n tag: tag.tag,\n sha: tag.sha,\n node_id: tag.node_id,\n url: `${repoUrl}/git/tags/${tag.sha}`,\n message: tag.message,\n tagger: {\n name: tag.tagger_name,\n email: tag.tagger_email,\n date: tag.tagger_date,\n },\n object: {\n type: tag.object_type,\n sha: tag.object_sha,\n url: objectApiUrl(repo, baseUrl, resolveGitObjectType(gh, repo.id, tag.object_sha), tag.object_sha),\n },\n verification: { verified: false, reason: \"unsigned\", signature: null, payload: null, verified_at: null },\n });\n });\n\n app.post(\"/repos/:owner/:repo/git/tags\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (typeof body.tag !== \"string\") throw new ApiError(422, \"tag is required\");\n if (typeof body.message !== \"string\") throw new ApiError(422, \"message is required\");\n if (typeof body.object !== \"string\") throw new ApiError(422, \"object is required\");\n if (typeof body.type !== \"string\") throw new ApiError(422, \"type is required\");\n const now = timestamp();\n let tagger_name = \"user\";\n let tagger_email = \"user@users.noreply.github.com\";\n let tagger_date = now;\n if (body.tagger && typeof body.tagger === \"object\" && body.tagger !== null) {\n const t = body.tagger as Record<string, unknown>;\n if (typeof t.name === \"string\") tagger_name = t.name;\n if (typeof t.email === \"string\") tagger_email = t.email;\n if (typeof t.date === \"string\") tagger_date = t.date;\n }\n const tag = gh.tags.insert({\n repo_id: repo.id,\n tag: body.tag as string,\n sha: generateSha(),\n node_id: \"\",\n message: body.message as string,\n tagger_name,\n tagger_email,\n tagger_date,\n object_type: body.type as string,\n object_sha: body.object as string,\n } as Omit<GitHubTag, \"id\" | \"created_at\" | \"updated_at\">);\n gh.tags.update(tag.id, { node_id: generateNodeId(\"Tag\", tag.id) });\n const saved = gh.tags.get(tag.id)!;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json(\n {\n tag: saved.tag,\n sha: saved.sha,\n node_id: saved.node_id,\n url: `${repoUrl}/git/tags/${saved.sha}`,\n message: saved.message,\n tagger: {\n name: saved.tagger_name,\n email: saved.tagger_email,\n date: saved.tagger_date,\n },\n object: {\n type: saved.object_type,\n sha: saved.object_sha,\n url: objectApiUrl(repo, baseUrl, resolveGitObjectType(gh, repo.id, saved.object_sha), saved.object_sha),\n },\n verification: { verified: false, reason: \"unsigned\", signature: null, payload: null, verified_at: null },\n },\n 201,\n );\n });\n}\n","import type { RouteContext, AuthUser } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader, unauthorized, forbidden } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubOrg, GitHubRepo, GitHubTeam, GitHubUser } from \"../entities.js\";\nimport {\n formatOrgBrief,\n formatOrgFull,\n formatRepo,\n formatTeamBrief,\n formatUser,\n generateNodeId,\n lookupOwner,\n lookupRepo,\n} from \"../helpers.js\";\n\nconst MEMBERS_TEAM_SLUG = \"members\";\n\nfunction notFound() {\n return new ApiError(404, \"Not Found\");\n}\n\nfunction requireAuthUser(c: { get: (k: \"authUser\") => AuthUser | undefined }): AuthUser {\n const u = c.get(\"authUser\");\n if (!u) throw unauthorized();\n return u;\n}\n\nfunction requireOrgAdmin(gh: GitHubStore, org: GitHubOrg, auth: AuthUser): void {\n const user = gh.users.findOneBy(\"login\", auth.login);\n if (!user) throw forbidden();\n const role = orgRoleForUser(gh, org.id, user.id);\n if (role !== \"admin\") throw forbidden();\n}\n\nfunction getOrgByLogin(gh: GitHubStore, login: string): GitHubOrg | undefined {\n return gh.orgs.findOneBy(\"login\", login);\n}\n\nfunction teamsForOrg(gh: GitHubStore, orgId: number): GitHubTeam[] {\n return gh.teams.findBy(\"org_id\", orgId);\n}\n\nfunction getTeamByOrgSlug(gh: GitHubStore, org: GitHubOrg, slug: string): GitHubTeam | undefined {\n return teamsForOrg(gh, org.id).find((t) => t.slug === slug);\n}\n\nfunction slugifyFromName(name: string): string {\n const s = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return s || \"team\";\n}\n\nfunction uniqueTeamSlug(gh: GitHubStore, orgId: number, base: string): string {\n let slug = base;\n let n = 2;\n const taken = (s: string) => teamsForOrg(gh, orgId).some((t) => t.slug === s);\n while (taken(slug)) {\n slug = `${base}-${n}`;\n n += 1;\n }\n return slug;\n}\n\nfunction orgsForAuthenticatedUser(gh: GitHubStore, userId: number): GitHubOrg[] {\n const memberships = gh.teamMembers.findBy(\"user_id\", userId);\n const orgIds = new Set<number>();\n for (const m of memberships) {\n const team = gh.teams.get(m.team_id);\n if (team) orgIds.add(team.org_id);\n }\n const orgs = [...orgIds].map((id) => gh.orgs.get(id)).filter((o): o is GitHubOrg => Boolean(o));\n orgs.sort((a, b) => a.login.localeCompare(b.login));\n return orgs;\n}\n\ntype OrgMemberRow = { user: GitHubUser; orgRole: \"admin\" | \"member\" };\n\nfunction listOrgMembersDeduped(gh: GitHubStore, orgId: number): OrgMemberRow[] {\n const byUser = new Map<number, { user: GitHubUser; isAdmin: boolean }>();\n for (const team of teamsForOrg(gh, orgId)) {\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n const user = gh.users.get(m.user_id);\n if (!user) continue;\n const isAdmin = m.role === \"maintainer\";\n const prev = byUser.get(user.id);\n if (!prev) {\n byUser.set(user.id, { user, isAdmin });\n } else {\n byUser.set(user.id, { user, isAdmin: prev.isAdmin || isAdmin });\n }\n }\n }\n return [...byUser.values()]\n .map(({ user, isAdmin }) => ({\n user,\n orgRole: isAdmin ? (\"admin\" as const) : (\"member\" as const),\n }))\n .sort((a, b) => a.user.id - b.user.id);\n}\n\nfunction orgRoleForUser(gh: GitHubStore, orgId: number, userId: number): \"admin\" | \"member\" | null {\n const row = listOrgMembersDeduped(gh, orgId).find((r) => r.user.id === userId);\n return row?.orgRole ?? null;\n}\n\nfunction syncTeamMemberCount(gh: GitHubStore, teamId: number) {\n const n = gh.teamMembers.findBy(\"team_id\", teamId).length;\n gh.teams.update(teamId, { members_count: n });\n}\n\nfunction syncTeamRepoCount(gh: GitHubStore, teamId: number) {\n const n = gh.teamRepos.findBy(\"team_id\", teamId).length;\n gh.teams.update(teamId, { repos_count: n });\n}\n\nfunction findTeamRepo(gh: GitHubStore, teamId: number, repoId: number) {\n return gh.teamRepos.findBy(\"team_id\", teamId).find((r) => r.repo_id === repoId);\n}\n\nfunction getOrCreateMembersTeam(gh: GitHubStore, org: GitHubOrg): GitHubTeam {\n const existing = teamsForOrg(gh, org.id).find((t) => t.slug === MEMBERS_TEAM_SLUG);\n if (existing) return existing;\n const team = gh.teams.insert({\n node_id: \"pending\",\n name: \"Members\",\n slug: MEMBERS_TEAM_SLUG,\n description: null,\n privacy: \"closed\",\n permission: \"pull\",\n org_id: org.id,\n parent_id: null,\n members_count: 0,\n repos_count: 0,\n });\n const fixed = gh.teams.update(team.id, { node_id: generateNodeId(\"Team\", team.id) });\n return fixed ?? team;\n}\n\nfunction deleteTeamCascade(gh: GitHubStore, team: GitHubTeam) {\n for (const child of teamsForOrg(gh, team.org_id).filter((t) => t.parent_id === team.id)) {\n gh.teams.update(child.id, { parent_id: null });\n }\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n gh.teamMembers.delete(m.id);\n }\n for (const tr of gh.teamRepos.findBy(\"team_id\", team.id)) {\n gh.teamRepos.delete(tr.id);\n }\n gh.teams.delete(team.id);\n}\n\nfunction removeUserFromAllOrgTeams(gh: GitHubStore, orgId: number, userId: number) {\n for (const team of teamsForOrg(gh, orgId)) {\n const memberships = gh.teamMembers.findBy(\"team_id\", team.id).filter((m) => m.user_id === userId);\n for (const m of memberships) {\n gh.teamMembers.delete(m.id);\n }\n syncTeamMemberCount(gh, team.id);\n }\n}\n\nfunction membershipUrl(baseUrl: string, orgLogin: string, teamSlug: string, userLogin: string) {\n return `${baseUrl}/orgs/${orgLogin}/teams/${teamSlug}/memberships/${userLogin}`;\n}\n\nfunction orgMembershipUrl(baseUrl: string, orgLogin: string, userLogin: string) {\n return `${baseUrl}/orgs/${orgLogin}/memberships/${userLogin}`;\n}\n\nfunction formatTeamMembership(\n baseUrl: string,\n orgLogin: string,\n teamSlug: string,\n user: GitHubUser,\n role: \"member\" | \"maintainer\",\n) {\n return {\n url: membershipUrl(baseUrl, orgLogin, teamSlug, user.login),\n role,\n state: \"active\" as const,\n user: formatUser(user, baseUrl),\n };\n}\n\nexport function orgsAndTeamsRoutes({ app, store, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/organizations\", (c) => {\n const since = Math.max(0, parseInt(c.req.query(\"since\") ?? \"0\", 10) || 0);\n const perPage = Math.min(100, Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30));\n\n const ordered = gh.orgs\n .all()\n .filter((o) => o.id > since)\n .sort((a, b) => a.id - b.id);\n const page = ordered.slice(0, perPage);\n\n if (page.length === perPage && ordered.length > perPage) {\n const lastId = page[page.length - 1]!.id;\n const nextUrl = new URL(c.req.url);\n nextUrl.searchParams.set(\"since\", String(lastId));\n nextUrl.searchParams.set(\"per_page\", String(perPage));\n c.header(\"Link\", `<${nextUrl.toString()}>; rel=\"next\"`);\n }\n\n return c.json(page.map((o) => formatOrgBrief(o, baseUrl)));\n });\n\n app.get(\"/user/orgs\", (c) => {\n const auth = requireAuthUser(c);\n const user = gh.users.findOneBy(\"login\", auth.login);\n if (!user) throw notFound();\n const orgs = orgsForAuthenticatedUser(gh, user.id);\n return c.json(orgs.map((o) => formatOrgBrief(o, baseUrl)));\n });\n\n app.get(\"/orgs/:org\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n return c.json(formatOrgFull(org, baseUrl));\n });\n\n app.patch(\"/orgs/:org\", async (c) => {\n const auth = requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n requireOrgAdmin(gh, org, auth);\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubOrg> = {};\n\n if (\"billing_email\" in body) {\n if (body.billing_email === null) patch.billing_email = null;\n else if (typeof body.billing_email === \"string\") patch.billing_email = body.billing_email;\n }\n if (\"company\" in body) {\n if (body.company === null) patch.company = null;\n else if (typeof body.company === \"string\") patch.company = body.company;\n }\n if (\"email\" in body) {\n if (body.email === null) patch.email = null;\n else if (typeof body.email === \"string\") patch.email = body.email;\n }\n if (\"twitter_username\" in body) {\n if (body.twitter_username === null) patch.twitter_username = null;\n else if (typeof body.twitter_username === \"string\") {\n patch.twitter_username = body.twitter_username;\n }\n }\n if (\"location\" in body) {\n if (body.location === null) patch.location = null;\n else if (typeof body.location === \"string\") patch.location = body.location;\n }\n if (\"name\" in body) {\n if (body.name === null) patch.name = null;\n else if (typeof body.name === \"string\") patch.name = body.name;\n }\n if (\"description\" in body) {\n if (body.description === null) patch.description = null;\n else if (typeof body.description === \"string\") patch.description = body.description;\n }\n if (\"default_repository_permission\" in body && typeof body.default_repository_permission === \"string\") {\n patch.default_repository_permission = body.default_repository_permission;\n }\n if (\"members_can_create_repositories\" in body && typeof body.members_can_create_repositories === \"boolean\") {\n patch.members_can_create_repositories = body.members_can_create_repositories;\n }\n\n const updated = gh.orgs.update(org.id, patch);\n if (!updated) throw notFound();\n return c.json(formatOrgFull(updated, baseUrl));\n });\n\n app.get(\"/orgs/:org/members\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n\n const roleQ = (c.req.query(\"role\") ?? \"all\").toLowerCase();\n if (roleQ !== \"all\" && roleQ !== \"admin\" && roleQ !== \"member\") {\n throw new ApiError(422, \"Invalid role parameter\");\n }\n\n let rows = listOrgMembersDeduped(gh, org.id);\n if (roleQ === \"admin\") rows = rows.filter((r) => r.orgRole === \"admin\");\n else if (roleQ === \"member\") rows = rows.filter((r) => r.orgRole === \"member\");\n\n const { page, per_page } = parsePagination(c);\n const total = rows.length;\n const start = (page - 1) * per_page;\n const slice = rows.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((r) => formatUser(r.user, baseUrl)));\n });\n\n app.get(\"/orgs/:org/members/:username\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n if (!orgRoleForUser(gh, org.id, user.id)) throw notFound();\n return c.body(null, 204);\n });\n\n app.delete(\"/orgs/:org/members/:username\", (c) => {\n const auth = requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n requireOrgAdmin(gh, org, auth);\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n removeUserFromAllOrgTeams(gh, org.id, user.id);\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/memberships/:username\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n const role = orgRoleForUser(gh, org.id, user.id);\n if (!role) throw notFound();\n return c.json({\n url: orgMembershipUrl(baseUrl, org.login, user.login),\n state: \"active\",\n role,\n organization_url: `${baseUrl}/orgs/${org.login}`,\n user: formatUser(user, baseUrl),\n organization: formatOrgBrief(org, baseUrl),\n });\n });\n\n app.put(\"/orgs/:org/memberships/:username\", async (c) => {\n const auth = requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n requireOrgAdmin(gh, org, auth);\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const body = await parseJsonBody(c);\n const roleRaw = body.role;\n if (roleRaw !== \"admin\" && roleRaw !== \"member\") {\n throw new ApiError(422, \"role must be admin or member\");\n }\n const teamRole: \"member\" | \"maintainer\" = roleRaw === \"admin\" ? \"maintainer\" : \"member\";\n\n const membersTeam = getOrCreateMembersTeam(gh, org);\n const existing = gh.teamMembers.findBy(\"team_id\", membersTeam.id).find((m) => m.user_id === user.id);\n if (existing) {\n gh.teamMembers.update(existing.id, { role: teamRole });\n } else {\n gh.teamMembers.insert({ team_id: membersTeam.id, user_id: user.id, role: teamRole });\n }\n syncTeamMemberCount(gh, membersTeam.id);\n\n const orgRole = orgRoleForUser(gh, org.id, user.id)!;\n return c.json({\n url: orgMembershipUrl(baseUrl, org.login, user.login),\n state: \"active\",\n role: orgRole,\n organization_url: `${baseUrl}/orgs/${org.login}`,\n user: formatUser(user, baseUrl),\n organization: formatOrgBrief(org, baseUrl),\n });\n });\n\n app.get(\"/orgs/:org/teams\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n\n const all = teamsForOrg(gh, org.id).sort((a, b) => a.id - b.id);\n const { page, per_page } = parsePagination(c);\n const total = all.length;\n const start = (page - 1) * per_page;\n const slice = all.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((t) => formatTeamBrief(t, gh, baseUrl)));\n });\n\n app.post(\"/orgs/:org/teams\", async (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n\n const body = await parseJsonBody(c);\n const name = body.name;\n if (typeof name !== \"string\" || !name.trim()) {\n throw new ApiError(422, \"name is required\");\n }\n\n let parentId: number | null = null;\n if (body.parent_team_id != null) {\n const pid = Number(body.parent_team_id);\n const parent = gh.teams.get(pid);\n if (!parent || parent.org_id !== org.id) {\n throw new ApiError(422, \"Invalid parent_team_id\");\n }\n parentId = parent.id;\n }\n\n const baseSlug = uniqueTeamSlug(gh, org.id, slugifyFromName(name));\n const privacy = body.privacy === \"secret\" || body.privacy === \"closed\" ? body.privacy : \"closed\";\n const permission = typeof body.permission === \"string\" ? body.permission : \"pull\";\n const description =\n body.description === null ? null : typeof body.description === \"string\" ? body.description : null;\n\n const team = gh.teams.insert({\n node_id: \"pending\",\n name: name.trim(),\n slug: baseSlug,\n description,\n privacy,\n permission,\n org_id: org.id,\n parent_id: parentId,\n members_count: 0,\n repos_count: 0,\n });\n const fixed = gh.teams.update(team.id, { node_id: generateNodeId(\"Team\", team.id) });\n return c.json(formatTeamBrief(fixed ?? team, gh, baseUrl), 201);\n });\n\n app.get(\"/orgs/:org/teams/:team_slug\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n return c.json(formatTeamBrief(team, gh, baseUrl));\n });\n\n app.patch(\"/orgs/:org/teams/:team_slug\", async (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubTeam> = {};\n\n if (\"name\" in body && typeof body.name === \"string\" && body.name.trim()) {\n patch.name = body.name.trim();\n }\n if (\"description\" in body) {\n if (body.description === null) patch.description = null;\n else if (typeof body.description === \"string\") patch.description = body.description;\n }\n if (body.privacy === \"secret\" || body.privacy === \"closed\") {\n patch.privacy = body.privacy;\n }\n if (\"permission\" in body && typeof body.permission === \"string\") {\n patch.permission = body.permission;\n }\n if (\"parent_team_id\" in body) {\n if (body.parent_team_id === null) {\n patch.parent_id = null;\n } else {\n const pid = Number(body.parent_team_id);\n const parent = gh.teams.get(pid);\n if (!parent || parent.org_id !== org.id) {\n throw new ApiError(422, \"Invalid parent_team_id\");\n }\n if (parent.id === team.id) throw new ApiError(422, \"Invalid parent_team_id\");\n patch.parent_id = parent.id;\n }\n }\n\n const updated = gh.teams.update(team.id, patch);\n if (!updated) throw notFound();\n return c.json(formatTeamBrief(updated, gh, baseUrl));\n });\n\n app.delete(\"/orgs/:org/teams/:team_slug\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n deleteTeamCascade(gh, team);\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/teams/:team_slug/members\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const roleQ = (c.req.query(\"role\") ?? \"all\").toLowerCase();\n if (roleQ !== \"all\" && roleQ !== \"member\" && roleQ !== \"maintainer\") {\n throw new ApiError(422, \"Invalid role parameter\");\n }\n\n let members = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .map((m) => {\n const user = gh.users.get(m.user_id);\n return user ? { user, role: m.role } : null;\n })\n .filter((x): x is { user: GitHubUser; role: \"member\" | \"maintainer\" } => Boolean(x));\n\n if (roleQ === \"member\") members = members.filter((m) => m.role === \"member\");\n else if (roleQ === \"maintainer\") members = members.filter((m) => m.role === \"maintainer\");\n\n members.sort((a, b) => a.user.id - b.user.id);\n\n const { page, per_page } = parsePagination(c);\n const total = members.length;\n const start = (page - 1) * per_page;\n const slice = members.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((m) => formatUser(m.user, baseUrl)));\n });\n\n app.put(\"/orgs/:org/teams/:team_slug/memberships/:username\", async (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const body = await parseJsonBody(c);\n const role: \"member\" | \"maintainer\" = body.role === \"maintainer\" ? \"maintainer\" : \"member\";\n\n const existing = gh.teamMembers.findBy(\"team_id\", team.id).find((m) => m.user_id === user.id);\n if (existing) {\n gh.teamMembers.update(existing.id, { role });\n } else {\n gh.teamMembers.insert({ team_id: team.id, user_id: user.id, role });\n }\n syncTeamMemberCount(gh, team.id);\n\n return c.json(formatTeamMembership(baseUrl, org.login, team.slug, user, role));\n });\n\n app.delete(\"/orgs/:org/teams/:team_slug/memberships/:username\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const existing = gh.teamMembers.findBy(\"team_id\", team.id).find((m) => m.user_id === user.id);\n if (existing) {\n gh.teamMembers.delete(existing.id);\n syncTeamMemberCount(gh, team.id);\n }\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/teams/:team_slug/memberships/:username\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const m = gh.teamMembers.findBy(\"team_id\", team.id).find((x) => x.user_id === user.id);\n if (!m) throw notFound();\n\n return c.json(formatTeamMembership(baseUrl, org.login, team.slug, user, m.role));\n });\n\n app.get(\"/orgs/:org/teams/:team_slug/repos\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const links = gh.teamRepos.findBy(\"team_id\", team.id);\n const repos = links\n .map((l) => gh.repos.get(l.repo_id))\n .filter((r): r is GitHubRepo => Boolean(r))\n .sort((a, b) => a.id - b.id);\n\n const { page, per_page } = parsePagination(c);\n const total = repos.length;\n const start = (page - 1) * per_page;\n const slice = repos.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((r) => formatRepo(r, gh, baseUrl)));\n });\n\n app.put(\"/orgs/:org/teams/:team_slug/repos/:owner/:repo\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const ownerLogin = c.req.param(\"owner\")!;\n const ownerInfo = lookupOwner(gh, ownerLogin);\n if (!ownerInfo || ownerInfo.type !== \"Organization\" || ownerInfo.id !== org.id) {\n throw new ApiError(422, \"Repository must belong to this organization\");\n }\n const repo = lookupRepo(gh, ownerLogin, c.req.param(\"repo\")!);\n if (!repo) throw notFound();\n\n if (!findTeamRepo(gh, team.id, repo.id)) {\n gh.teamRepos.insert({ team_id: team.id, repo_id: repo.id });\n syncTeamRepoCount(gh, team.id);\n }\n return c.body(null, 204);\n });\n\n app.delete(\"/orgs/:org/teams/:team_slug/repos/:owner/:repo\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const ownerLogin = c.req.param(\"owner\")!;\n const ownerInfo = lookupOwner(gh, ownerLogin);\n if (!ownerInfo || ownerInfo.type !== \"Organization\" || ownerInfo.id !== org.id) {\n throw new ApiError(422, \"Repository must belong to this organization\");\n }\n const repo = lookupRepo(gh, ownerLogin, c.req.param(\"repo\")!);\n if (!repo) throw notFound();\n\n const tr = findTeamRepo(gh, team.id, repo.id);\n if (tr) {\n gh.teamRepos.delete(tr.id);\n syncTeamRepoCount(gh, team.id);\n }\n return c.body(null, 204);\n });\n\n app.get(\"/teams/:team_id\", (c) => {\n const tid = parseInt(c.req.param(\"team_id\") ?? \"\", 10);\n if (Number.isNaN(tid)) throw notFound();\n const team = gh.teams.get(tid);\n if (!team) throw notFound();\n return c.json(formatTeamBrief(team, gh, baseUrl));\n });\n\n app.get(\"/teams/:team_id/members\", (c) => {\n const tid = parseInt(c.req.param(\"team_id\") ?? \"\", 10);\n if (Number.isNaN(tid)) throw notFound();\n const team = gh.teams.get(tid);\n if (!team) throw notFound();\n\n const roleQ = (c.req.query(\"role\") ?? \"all\").toLowerCase();\n if (roleQ !== \"all\" && roleQ !== \"member\" && roleQ !== \"maintainer\") {\n throw new ApiError(422, \"Invalid role parameter\");\n }\n\n let members = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .map((m) => {\n const user = gh.users.get(m.user_id);\n return user ? { user, role: m.role } : null;\n })\n .filter((x): x is { user: GitHubUser; role: \"member\" | \"maintainer\" } => Boolean(x));\n\n if (roleQ === \"member\") members = members.filter((m) => m.role === \"member\");\n else if (roleQ === \"maintainer\") members = members.filter((m) => m.role === \"maintainer\");\n\n members.sort((a, b) => a.user.id - b.user.id);\n\n const { page, per_page } = parsePagination(c);\n const total = members.length;\n const start = (page - 1) * per_page;\n const slice = members.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((m) => formatUser(m.user, baseUrl)));\n });\n}\n","import type { RouteContext, WebhookDispatcher, AuthUser } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubRelease, GitHubReleaseAsset, GitHubRepo, GitHubUser } from \"../entities.js\";\nimport {\n formatRelease,\n formatReleaseAsset,\n formatRepo,\n formatUser,\n generateNodeId,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport { assertRepoRead, assertRepoWrite, getActorUser, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\n/** Draft releases are omitted for anonymous API clients; any authenticated user may see them once repo read is allowed. */\nfunction isAuthenticatedActor(gh: GitHubStore, authUser: AuthUser | undefined): boolean {\n return Boolean(authUser && getActorUser(gh, authUser));\n}\n\nfunction assertReleaseVisible(gh: GitHubStore, authUser: AuthUser | undefined, release: GitHubRelease) {\n if (release.draft && !isAuthenticatedActor(gh, authUser)) {\n throw notFoundResponse();\n }\n}\n\nfunction releasesForRepo(gh: GitHubStore, repoId: number): GitHubRelease[] {\n return gh.releases.findBy(\"repo_id\", repoId);\n}\n\nfunction findReleaseById(gh: GitHubStore, repoId: number, releaseId: number): GitHubRelease | undefined {\n const r = gh.releases.get(releaseId);\n if (!r || r.repo_id !== repoId) return undefined;\n return r;\n}\n\nfunction findReleaseByTag(gh: GitHubStore, repoId: number, tagName: string): GitHubRelease | undefined {\n return releasesForRepo(gh, repoId).find((rel) => rel.tag_name === tagName);\n}\n\nfunction tagTaken(gh: GitHubStore, repoId: number, tagName: string, exceptId?: number): boolean {\n return releasesForRepo(gh, repoId).some((r) => r.tag_name === tagName && r.id !== exceptId);\n}\n\nfunction sortReleasesByCreatedDesc(a: GitHubRelease, b: GitHubRelease): number {\n return b.created_at.localeCompare(a.created_at);\n}\n\nfunction deleteAssetsForRelease(gh: GitHubStore, releaseId: number) {\n for (const a of gh.releaseAssets.findBy(\"release_id\", releaseId)) {\n gh.releaseAssets.delete(a.id);\n }\n}\n\nfunction dispatchReleaseWebhook(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n actor: GitHubUser,\n release: GitHubRelease,\n action: string,\n baseUrl: string,\n) {\n const relFmt = formatRelease(release, gh, baseUrl);\n if (!relFmt) return;\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"release\",\n action,\n {\n action,\n release: relFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n}\n\nexport function releasesRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/releases\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const authUser = c.get(\"authUser\");\n const showDrafts = isAuthenticatedActor(gh, authUser);\n\n let list = releasesForRepo(gh, repo.id);\n if (!showDrafts) {\n list = list.filter((r) => !r.draft);\n }\n list = [...list].sort(sortReleasesByCreatedDesc);\n\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n\n const out = pageItems.map((r) => formatRelease(r, gh, baseUrl)).filter(Boolean);\n return c.json(out);\n });\n\n app.post(\"/repos/:owner/:repo/releases/generate-notes\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n const tagName = typeof body.tag_name === \"string\" ? body.tag_name : \"\";\n const target = typeof body.target_commitish === \"string\" ? body.target_commitish : undefined;\n const prev = typeof body.previous_tag_name === \"string\" ? body.previous_tag_name : undefined;\n return c.json({\n name: tagName ? `Release ${tagName}` : \"Release\",\n body: `## What's changed\\n\\n_Auto-generated release notes (stub)._\\n\\n<!-- target: ${target ?? \"default\"} previous: ${prev ?? \"none\"} -->`,\n });\n });\n\n app.get(\"/repos/:owner/:repo/releases/latest\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const candidates = releasesForRepo(gh, repo.id).filter((r) => !r.draft && !r.prerelease && r.published_at);\n if (candidates.length === 0) throw notFoundResponse();\n\n candidates.sort((a, b) => {\n const pa = a.published_at ?? a.created_at;\n const pb = b.published_at ?? b.created_at;\n return pb.localeCompare(pa);\n });\n const latest = candidates[0]!;\n const fmt = formatRelease(latest, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.get(\"/repos/:owner/:repo/releases/tags/:tag\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const tag = decodeURIComponent(c.req.param(\"tag\")!);\n const release = findReleaseByTag(gh, repo.id, tag);\n if (!release) throw notFoundResponse();\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n\n const fmt = formatRelease(release, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.get(\"/repos/:owner/:repo/releases/assets/:asset_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const assetId = parseInt(c.req.param(\"asset_id\")!, 10);\n if (!Number.isFinite(assetId)) throw notFoundResponse();\n\n const asset = gh.releaseAssets.get(assetId);\n if (!asset || asset.repo_id !== repo.id) throw notFoundResponse();\n\n const release = gh.releases.get(asset.release_id);\n if (release) {\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n }\n\n return c.json(formatReleaseAsset(asset, repo, baseUrl));\n });\n\n app.patch(\"/repos/:owner/:repo/releases/assets/:asset_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const assetId = parseInt(c.req.param(\"asset_id\")!, 10);\n if (!Number.isFinite(assetId)) throw notFoundResponse();\n\n const asset = gh.releaseAssets.get(assetId);\n if (!asset || asset.repo_id !== repo.id) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubReleaseAsset> = {};\n if (typeof body.name === \"string\") patch.name = body.name;\n if (typeof body.label === \"string\" || body.label === null) patch.label = body.label as string | null;\n\n const updated = gh.releaseAssets.update(asset.id, patch);\n if (!updated) throw notFoundResponse();\n\n return c.json(formatReleaseAsset(updated, repo, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/releases/assets/:asset_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const assetId = parseInt(c.req.param(\"asset_id\")!, 10);\n if (!Number.isFinite(assetId)) throw notFoundResponse();\n\n const asset = gh.releaseAssets.get(assetId);\n if (!asset || asset.repo_id !== repo.id) throw notFoundResponse();\n\n gh.releaseAssets.delete(asset.id);\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/releases\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n if (typeof body.tag_name !== \"string\" || !body.tag_name.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const tag_name = body.tag_name.trim();\n if (tagTaken(gh, repo.id, tag_name)) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const target_commitish =\n typeof body.target_commitish === \"string\" && body.target_commitish.trim()\n ? body.target_commitish.trim()\n : repo.default_branch;\n\n const draft = typeof body.draft === \"boolean\" ? body.draft : false;\n const prerelease = typeof body.prerelease === \"boolean\" ? body.prerelease : false;\n\n let name: string | null = typeof body.name === \"string\" || body.name === null ? (body.name as string | null) : null;\n let releaseBody: string | null =\n typeof body.body === \"string\" || body.body === null ? (body.body as string | null) : null;\n\n if (body.generate_release_notes === true) {\n releaseBody = releaseBody ?? `## What's changed\\n\\n_Auto-generated release notes (stub) for ${tag_name}._`;\n name = name ?? `Release ${tag_name}`;\n }\n\n const published_at = draft ? null : timestamp();\n\n const row = gh.releases.insert({\n node_id: \"\",\n repo_id: repo.id,\n tag_name,\n target_commitish,\n name,\n body: releaseBody,\n draft,\n prerelease,\n author_id: actor.id,\n published_at,\n } as Omit<GitHubRelease, \"id\" | \"created_at\" | \"updated_at\">);\n gh.releases.update(row.id, { node_id: generateNodeId(\"Release\", row.id) });\n\n const release = gh.releases.get(row.id)!;\n\n if (draft) {\n dispatchReleaseWebhook(webhooks, gh, repo, actor, release, \"created\", baseUrl);\n } else {\n dispatchReleaseWebhook(webhooks, gh, repo, actor, release, \"published\", baseUrl);\n }\n\n const fmt = formatRelease(release, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/releases/:release_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n\n const fmt = formatRelease(release, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.patch(\"/repos/:owner/:repo/releases/:release_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubRelease> = {};\n\n if (typeof body.tag_name === \"string\" && body.tag_name.trim()) {\n const nextTag = body.tag_name.trim();\n if (tagTaken(gh, repo.id, nextTag, release.id)) {\n throw new ApiError(422, \"Validation failed\");\n }\n patch.tag_name = nextTag;\n }\n if (typeof body.target_commitish === \"string\" && body.target_commitish.trim()) {\n patch.target_commitish = body.target_commitish.trim();\n }\n if (typeof body.name === \"string\" || body.name === null) patch.name = body.name as string | null;\n if (typeof body.body === \"string\" || body.body === null) patch.body = body.body as string | null;\n if (typeof body.draft === \"boolean\") patch.draft = body.draft;\n if (typeof body.prerelease === \"boolean\") patch.prerelease = body.prerelease;\n\n const wasDraft = release.draft;\n let publishedJustNow = false;\n if (wasDraft && typeof body.draft === \"boolean\" && body.draft === false) {\n patch.published_at = timestamp();\n publishedJustNow = true;\n }\n\n const updated = gh.releases.update(release.id, patch);\n if (!updated) throw notFoundResponse();\n\n if (publishedJustNow) {\n dispatchReleaseWebhook(webhooks, gh, repo, actor, updated, \"published\", baseUrl);\n }\n\n const fmt = formatRelease(updated, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.delete(\"/repos/:owner/:repo/releases/:release_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n\n deleteAssetsForRelease(gh, release.id);\n gh.releases.delete(release.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/releases/:release_id/assets\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n\n let assets = gh.releaseAssets.findBy(\"release_id\", release.id);\n assets = [...assets].sort((a, b) => b.created_at.localeCompare(a.created_at));\n\n const { page, per_page } = parsePagination(c);\n const total = assets.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = assets.slice(start, start + per_page);\n\n return c.json(pageItems.map((a) => formatReleaseAsset(a, repo, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/releases/:release_id/assets\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n\n const nameQ = c.req.query(\"name\");\n if (!nameQ || !nameQ.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const assetName = nameQ.trim();\n const labelRaw = c.req.query(\"label\");\n const label = labelRaw === undefined || labelRaw === \"\" ? null : labelRaw;\n\n const buf = await c.req.arrayBuffer();\n const size = buf.byteLength;\n\n const contentType = c.req.header(\"Content-Type\")?.split(\";\")[0]?.trim() || \"application/octet-stream\";\n\n const row = gh.releaseAssets.insert({\n node_id: \"\",\n release_id: release.id,\n repo_id: repo.id,\n name: assetName,\n label,\n state: \"uploaded\",\n content_type: contentType,\n size,\n download_count: 0,\n uploader_id: actor.id,\n } as Omit<GitHubReleaseAsset, \"id\" | \"created_at\" | \"updated_at\">);\n gh.releaseAssets.update(row.id, { node_id: generateNodeId(\"ReleaseAsset\", row.id) });\n\n const asset = gh.releaseAssets.get(row.id)!;\n return c.json(formatReleaseAsset(asset, repo, baseUrl), 201);\n });\n}\n","import type { RouteContext, AuthUser, WebhookDelivery } from \"@emulators/core\";\nimport { ApiError, forbidden, parseJsonBody, parsePagination, setLinkHeader, unauthorized } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubOrg, GitHubRepo, GitHubUser, GitHubWebhook } from \"../entities.js\";\nimport { formatRepo, formatUser, formatWebhook, lookupRepo } from \"../helpers.js\";\nimport { assertRepoAdmin, getActorUser, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\nfunction teamsForOrg(gh: GitHubStore, orgId: number) {\n return gh.teams.findBy(\"org_id\", orgId);\n}\n\nfunction listOrgMembersDeduped(gh: GitHubStore, orgId: number): { user: GitHubUser; orgRole: \"admin\" | \"member\" }[] {\n const byUser = new Map<number, { user: GitHubUser; isAdmin: boolean }>();\n for (const team of teamsForOrg(gh, orgId)) {\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n const user = gh.users.get(m.user_id);\n if (!user) continue;\n const isAdmin = m.role === \"maintainer\";\n const prev = byUser.get(user.id);\n if (!prev) {\n byUser.set(user.id, { user, isAdmin });\n } else {\n byUser.set(user.id, { user, isAdmin: prev.isAdmin || isAdmin });\n }\n }\n }\n return [...byUser.values()]\n .map(({ user, isAdmin }) => ({\n user,\n orgRole: isAdmin ? (\"admin\" as const) : (\"member\" as const),\n }))\n .sort((a, b) => a.user.id - b.user.id);\n}\n\nfunction orgRoleForUser(gh: GitHubStore, orgId: number, userId: number): \"admin\" | \"member\" | null {\n const row = listOrgMembersDeduped(gh, orgId).find((r) => r.user.id === userId);\n return row?.orgRole ?? null;\n}\n\nfunction assertOrgAdmin(gh: GitHubStore, authUser: AuthUser | undefined, org: GitHubOrg) {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n if (orgRoleForUser(gh, org.id, user.id) === \"admin\") return;\n throw forbidden();\n}\n\nfunction getOrgByLogin(gh: GitHubStore, login: string): GitHubOrg | undefined {\n return gh.orgs.findOneBy(\"login\", login);\n}\n\nfunction pathPrefixForWebhook(wh: GitHubWebhook, ownerPath: string): string {\n return wh.repo_id != null ? `repos/${ownerPath}` : `orgs/${ownerPath}`;\n}\n\nfunction findRepoHook(gh: GitHubStore, repoId: number, hookId: number): GitHubWebhook | undefined {\n const wh = gh.webhooks.get(hookId);\n if (!wh || wh.repo_id !== repoId) return undefined;\n return wh;\n}\n\nfunction findOrgHook(gh: GitHubStore, orgId: number, hookId: number): GitHubWebhook | undefined {\n const wh = gh.webhooks.get(hookId);\n if (!wh || wh.org_id !== orgId) return undefined;\n return wh;\n}\n\nfunction webhooksForRepo(gh: GitHubStore, repoId: number): GitHubWebhook[] {\n return gh.webhooks.findBy(\"repo_id\", repoId).filter((w) => w.repo_id === repoId);\n}\n\nfunction webhooksForOrg(gh: GitHubStore, orgId: number): GitHubWebhook[] {\n return gh.webhooks.findBy(\"org_id\", orgId).filter((w) => w.org_id === orgId);\n}\n\nfunction normalizeInsecureSsl(v: unknown): string {\n if (v === true) return \"1\";\n if (v === false) return \"0\";\n if (typeof v === \"string\" && (v === \"0\" || v === \"1\")) return v;\n return \"0\";\n}\n\nfunction parseHookConfig(raw: unknown, existing?: GitHubWebhook[\"config\"]): GitHubWebhook[\"config\"] | null {\n if (raw === undefined && existing) return existing;\n if (!raw || typeof raw !== \"object\") return null;\n const o = raw as Record<string, unknown>;\n const urlRaw = typeof o.url === \"string\" ? o.url.trim() : \"\";\n const url = urlRaw || existing?.url || \"\";\n if (!url) return null;\n const content_type =\n typeof o.content_type === \"string\" && o.content_type ? o.content_type : (existing?.content_type ?? \"json\");\n let secret: string | undefined;\n if (o.secret === null) {\n secret = undefined;\n } else if (typeof o.secret === \"string\") {\n secret = o.secret;\n } else if (existing?.secret !== undefined) {\n secret = existing.secret;\n }\n const insecure_ssl = normalizeInsecureSsl(\n o.insecure_ssl !== undefined ? o.insecure_ssl : (existing?.insecure_ssl ?? \"0\"),\n );\n return { url, content_type, secret, insecure_ssl };\n}\n\nfunction formatHookDelivery(d: WebhookDelivery, baseUrl: string, pathPrefix: string, hookId: number) {\n return {\n id: d.id,\n guid: `${d.hook_id}-${d.id}-${d.delivered_at}`,\n delivered_at: d.delivered_at,\n redelivery: false,\n duration: d.duration,\n status: d.success ? \"OK\" : \"Failed\",\n status_code: d.status_code,\n event: d.event,\n action: d.action ?? null,\n url: `${baseUrl}/${pathPrefix}/hooks/${hookId}/deliveries/${d.id}`,\n };\n}\n\nexport function webhooksRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Repository webhooks ---\n\n app.get(\"/repos/:owner/:repo/hooks\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n\n let list = webhooksForRepo(gh, repo.id).sort((a, b) => a.id - b.id);\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n list = list.slice(start, start + per_page);\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(list.map((wh) => formatWebhook(wh, baseUrl, ownerPath)));\n });\n\n app.post(\"/repos/:owner/:repo/hooks\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" && body.name.trim() ? body.name.trim() : \"web\";\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : [\"push\"];\n const active = typeof body.active === \"boolean\" ? body.active : true;\n const config = parseHookConfig(body.config);\n if (!config) throw new ApiError(422, \"config.url is required\");\n\n const wh = gh.webhooks.insert({\n repo_id: repo.id,\n org_id: null,\n name,\n active,\n events,\n config,\n last_response: { code: null, status: \"unused\", message: null },\n });\n\n webhooks.register({\n id: wh.id,\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n owner,\n repo: repo.name,\n });\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(formatWebhook(wh, baseUrl, ownerPath), 201);\n });\n\n app.get(\"/repos/:owner/:repo/hooks/:hook_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(formatWebhook(wh, baseUrl, ownerPath));\n });\n\n app.patch(\"/repos/:owner/:repo/hooks/:hook_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const existing = findRepoHook(gh, repo.id, hookId);\n if (!existing) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : existing.name;\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : existing.events;\n const active = typeof body.active === \"boolean\" ? body.active : existing.active;\n const config = body.config !== undefined ? parseHookConfig(body.config, existing.config) : existing.config;\n if (!config) throw new ApiError(422, \"Invalid config\");\n\n const wh = gh.webhooks.update(hookId, { name, active, events, config })!;\n webhooks.updateSubscription(hookId, {\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n });\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(formatWebhook(wh, baseUrl, ownerPath));\n });\n\n app.delete(\"/repos/:owner/:repo/hooks/:hook_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n webhooks.unregister(hookId);\n gh.webhooks.delete(hookId);\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/hooks/:hook_id/pings\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const ownerPath = `${owner}/${repoName}`;\n await webhooks.dispatch(\n \"ping\",\n undefined,\n {\n zen: \"Keep it logically awesome.\",\n hook_id: wh.id,\n hook: formatWebhook(wh, baseUrl, ownerPath),\n },\n owner,\n repo.name,\n );\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/hooks/:hook_id/tests\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const actor = getActorUser(gh, c.get(\"authUser\")!) ?? gh.users.get(repo.owner_id) ?? gh.users.all()[0];\n const testPayload = {\n ref: \"refs/heads/main\",\n before: \"0000000000000000000000000000000000000000\",\n after: \"0000000000000000000000000000000000000000\",\n repository: formatRepo(repo, gh, baseUrl),\n pusher: actor ? formatUser(actor, baseUrl) : null,\n sender: actor ? formatUser(actor, baseUrl) : null,\n };\n await webhooks.dispatch(\"push\", undefined, testPayload, ownerLogin, repo.name);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/hooks/:hook_id/deliveries\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n let list = webhooks.getDeliveries(wh.id).sort((a, b) => b.id - a.id);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n list = list.slice(start, start + per_page);\n\n const pp = pathPrefixForWebhook(wh, `${owner}/${repoName}`);\n return c.json(list.map((d) => formatHookDelivery(d, baseUrl, pp, wh.id)));\n });\n\n app.get(\"/repos/:owner/:repo/hooks/:hook_id/deliveries/:delivery_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const deliveryId = Number(c.req.param(\"delivery_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId) || !Number.isFinite(deliveryId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const d = webhooks.getDeliveries(wh.id).find((x) => x.id === deliveryId);\n if (!d) throw notFoundResponse();\n\n const pp = pathPrefixForWebhook(wh, `${owner}/${repoName}`);\n return c.json(formatHookDelivery(d, baseUrl, pp, wh.id));\n });\n\n // --- Organization webhooks ---\n\n app.get(\"/orgs/:org/hooks\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n\n let list = webhooksForOrg(gh, org.id).sort((a, b) => a.id - b.id);\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n list = list.slice(start, start + per_page);\n\n return c.json(list.map((wh) => formatWebhook(wh, baseUrl, org.login)));\n });\n\n app.post(\"/orgs/:org/hooks\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" && body.name.trim() ? body.name.trim() : \"web\";\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : [\"push\"];\n const active = typeof body.active === \"boolean\" ? body.active : true;\n const config = parseHookConfig(body.config);\n if (!config) throw new ApiError(422, \"config.url is required\");\n\n const wh = gh.webhooks.insert({\n repo_id: null,\n org_id: org.id,\n name,\n active,\n events,\n config,\n last_response: { code: null, status: \"unused\", message: null },\n });\n\n webhooks.register({\n id: wh.id,\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n owner: org.login,\n repo: undefined,\n });\n\n return c.json(formatWebhook(wh, baseUrl, org.login), 201);\n });\n\n app.get(\"/orgs/:org/hooks/:hook_id\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findOrgHook(gh, org.id, hookId);\n if (!wh) throw notFoundResponse();\n\n return c.json(formatWebhook(wh, baseUrl, org.login));\n });\n\n app.patch(\"/orgs/:org/hooks/:hook_id\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const existing = findOrgHook(gh, org.id, hookId);\n if (!existing) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : existing.name;\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : existing.events;\n const active = typeof body.active === \"boolean\" ? body.active : existing.active;\n const config = body.config !== undefined ? parseHookConfig(body.config, existing.config) : existing.config;\n if (!config) throw new ApiError(422, \"Invalid config\");\n\n const wh = gh.webhooks.update(hookId, { name, active, events, config })!;\n webhooks.updateSubscription(hookId, {\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n });\n\n return c.json(formatWebhook(wh, baseUrl, org.login));\n });\n\n app.delete(\"/orgs/:org/hooks/:hook_id\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findOrgHook(gh, org.id, hookId);\n if (!wh) throw notFoundResponse();\n\n webhooks.unregister(hookId);\n gh.webhooks.delete(hookId);\n return c.body(null, 204);\n });\n\n app.post(\"/orgs/:org/hooks/:hook_id/pings\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findOrgHook(gh, org.id, hookId);\n if (!wh) throw notFoundResponse();\n\n await webhooks.dispatch(\n \"ping\",\n undefined,\n {\n zen: \"Keep it logically awesome.\",\n hook_id: wh.id,\n hook: formatWebhook(wh, baseUrl, org.login),\n },\n org.login,\n undefined,\n );\n return c.body(null, 204);\n });\n}\n","import type { RouteContext, AuthUser } from \"@emulators/core\";\nimport { ApiError, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBlob,\n GitHubCommit,\n GitHubIssue,\n GitHubOrg,\n GitHubPullRequest,\n GitHubRepo,\n GitHubUser,\n} from \"../entities.js\";\nimport { formatIssue, formatOrgBrief, formatPullRequest, formatRepo, formatUser, lookupRepo } from \"../helpers.js\";\nimport { canAccessRepo } from \"../route-helpers.js\";\n\n/** Parsed GitHub-style search query (q parameter). */\nexport interface ParsedSearchQuery {\n text: string;\n qualifiers: Map<string, string[]>;\n negations: Map<string, string[]>;\n ranges: Map<string, Array<{ op: string; value: number | string }>>;\n}\n\nfunction tokenizeSearchQuery(q: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n let buf = \"\";\n let quote: '\"' | \"'\" | null = null;\n while (i < q.length) {\n const c = q[i]!;\n if (quote) {\n if (c === quote) {\n quote = null;\n i++;\n continue;\n }\n buf += c;\n i++;\n continue;\n }\n if (c === '\"' || c === \"'\") {\n quote = c;\n i++;\n continue;\n }\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n if (buf.length) {\n tokens.push(buf);\n buf = \"\";\n }\n i++;\n continue;\n }\n buf += c;\n i++;\n }\n if (buf.length) tokens.push(buf);\n return tokens;\n}\n\nfunction parseRangeToken(raw: string): { op: string; value: number | string } | null {\n const range = /^(\\d+)\\.\\.(\\d+)$/.exec(raw);\n if (range) {\n return { op: \"..\", value: `${range[1]}..${range[2]}` };\n }\n const cmp = /^(>=|<=|>|<)(\\d+)$/.exec(raw);\n if (cmp) {\n return { op: cmp[1]!, value: parseInt(cmp[2]!, 10) };\n }\n if (/^\\d+$/.test(raw)) {\n return { op: \"=\", value: parseInt(raw, 10) };\n }\n return null;\n}\n\n/**\n * Splits `q` into free text vs qualifiers, handles `-qualifier:value` negation,\n * and numeric ranges (`stars:>10`, `stars:10..50`).\n */\nexport function parseSearchQuery(q: string): ParsedSearchQuery {\n const qualifiers = new Map<string, string[]>();\n const negations = new Map<string, string[]>();\n const ranges = new Map<string, Array<{ op: string; value: number | string }>>();\n const textParts: string[] = [];\n\n for (const rawTok of tokenizeSearchQuery(q.trim())) {\n let neg = false;\n let tok = rawTok;\n if (tok.startsWith(\"-\") && tok.includes(\":\") && tok.length > 1) {\n neg = true;\n tok = tok.slice(1);\n }\n\n const colon = tok.indexOf(\":\");\n if (colon <= 0) {\n textParts.push(rawTok);\n continue;\n }\n\n const key = tok.slice(0, colon).toLowerCase();\n const rawVal = tok.slice(colon + 1);\n if (!rawVal.length) {\n textParts.push(rawTok);\n continue;\n }\n\n const rangePred = parseRangeToken(rawVal);\n const isRangeKey =\n key === \"stars\" ||\n key === \"forks\" ||\n key === \"repos\" ||\n key === \"followers\" ||\n key === \"comments\" ||\n key === \"size\";\n\n if (rangePred && (rangePred.op !== \"=\" || isRangeKey)) {\n if (neg) {\n if (!negations.has(key)) negations.set(key, []);\n negations.get(key)!.push(rawVal);\n } else {\n if (!ranges.has(key)) ranges.set(key, []);\n ranges.get(key)!.push(rangePred);\n }\n continue;\n }\n\n if (neg) {\n if (!negations.has(key)) negations.set(key, []);\n negations.get(key)!.push(rawVal);\n } else {\n if (!qualifiers.has(key)) qualifiers.set(key, []);\n qualifiers.get(key)!.push(rawVal);\n }\n }\n\n return {\n text: textParts.join(\" \").trim(),\n qualifiers,\n negations,\n ranges,\n };\n}\n\nfunction textMatches(haystack: string, needle: string): boolean {\n if (!needle.trim()) return true;\n return haystack.toLowerCase().includes(needle.toLowerCase());\n}\n\nfunction repoVisibleForSearch(repo: GitHubRepo, gh: GitHubStore, authUser: AuthUser | undefined): boolean {\n return canAccessRepo(gh, authUser, repo);\n}\n\nfunction ownerLogin(gh: GitHubStore, repo: GitHubRepo): string {\n if (repo.owner_type === \"User\") {\n return gh.users.get(repo.owner_id)?.login ?? \"\";\n }\n return gh.orgs.get(repo.owner_id)?.login ?? \"\";\n}\n\nfunction matchesNumericPredicate(\n actual: number,\n preds: Array<{ op: string; value: number | string }>,\n equalsFromQualifiers: string[],\n): boolean {\n for (const e of equalsFromQualifiers) {\n if (/^\\d+$/.test(e) && actual !== parseInt(e, 10)) return false;\n }\n for (const p of preds) {\n if (p.op === \"..\") {\n const m = /^(\\d+)\\.\\.(\\d+)$/.exec(String(p.value));\n if (m) {\n const lo = parseInt(m[1]!, 10);\n const hi = parseInt(m[2]!, 10);\n if (actual < lo || actual > hi) return false;\n }\n } else if (p.op === \">\") {\n if (!(actual > Number(p.value))) return false;\n } else if (p.op === \"<\") {\n if (!(actual < Number(p.value))) return false;\n } else if (p.op === \">=\") {\n if (!(actual >= Number(p.value))) return false;\n } else if (p.op === \"<=\") {\n if (!(actual <= Number(p.value))) return false;\n } else if (p.op === \"=\") {\n if (actual !== Number(p.value)) return false;\n }\n }\n return true;\n}\n\nfunction filterRepos(\n gh: GitHubStore,\n repos: GitHubRepo[],\n parsed: ParsedSearchQuery,\n authUser: AuthUser | undefined,\n): GitHubRepo[] {\n const qUser = parsed.qualifiers.get(\"user\")?.[0];\n const qOrg = parsed.qualifiers.get(\"org\")?.[0];\n const negUser = parsed.negations.get(\"user\") ?? [];\n const negOrg = parsed.negations.get(\"org\") ?? [];\n\n const inScopes = parsed.qualifiers.get(\"in\") ?? [];\n const negIn = parsed.negations.get(\"in\") ?? [];\n\n return repos.filter((repo) => {\n if (!repoVisibleForSearch(repo, gh, authUser)) return false;\n\n const ologin = ownerLogin(gh, repo);\n if (qUser && ologin.toLowerCase() !== qUser.toLowerCase()) return false;\n if (qOrg && ologin.toLowerCase() !== qOrg.toLowerCase()) return false;\n if (repo.owner_type === \"User\" && negUser.some((n) => ologin.toLowerCase() === n.toLowerCase())) {\n return false;\n }\n if (repo.owner_type === \"Organization\" && negOrg.some((n) => ologin.toLowerCase() === n.toLowerCase())) {\n return false;\n }\n\n for (const lang of parsed.qualifiers.get(\"language\") ?? []) {\n if (!repo.language || repo.language.toLowerCase() !== lang.toLowerCase()) return false;\n }\n for (const lang of parsed.negations.get(\"language\") ?? []) {\n if (repo.language && repo.language.toLowerCase() === lang.toLowerCase()) return false;\n }\n\n for (const topic of parsed.qualifiers.get(\"topic\") ?? []) {\n if (!repo.topics.some((t) => t.toLowerCase() === topic.toLowerCase())) return false;\n }\n for (const topic of parsed.negations.get(\"topic\") ?? []) {\n if (repo.topics.some((t) => t.toLowerCase() === topic.toLowerCase())) return false;\n }\n\n const starRanges = parsed.ranges.get(\"stars\") ?? [];\n const starEq = parsed.qualifiers.get(\"stars\") ?? [];\n if (!matchesNumericPredicate(repo.stargazers_count, starRanges, starEq)) return false;\n for (const nv of parsed.negations.get(\"stars\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(repo.stargazers_count, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && repo.stargazers_count === parseInt(nv, 10)) {\n return false;\n }\n }\n\n const forkRanges = parsed.ranges.get(\"forks\") ?? [];\n const forkEq = parsed.qualifiers.get(\"forks\") ?? [];\n if (!matchesNumericPredicate(repo.forks_count, forkRanges, forkEq)) return false;\n const negForkVals = parsed.negations.get(\"forks\") ?? [];\n if (negForkVals.length) {\n const negPreds = negForkVals.flatMap((s) => {\n const r = parseRangeToken(s);\n return r ? [r] : [];\n });\n const negEq = negForkVals.filter((s) => /^\\d+$/.test(s));\n if (matchesNumericPredicate(repo.forks_count, negPreds, negEq)) return false;\n }\n\n for (const a of parsed.qualifiers.get(\"archived\") ?? []) {\n const want = a === \"true\";\n if (repo.archived !== want) return false;\n }\n for (const a of parsed.negations.get(\"archived\") ?? []) {\n const want = a === \"true\";\n if (repo.archived === want) return false;\n }\n\n const isVals = parsed.qualifiers.get(\"is\") ?? [];\n for (const is of isVals) {\n if (is === \"public\" && repo.private) return false;\n if (is === \"private\" && !repo.private) return false;\n }\n for (const is of parsed.negations.get(\"is\") ?? []) {\n if (is === \"public\" && !repo.private) return false;\n if (is === \"private\" && repo.private) return false;\n }\n\n for (const f of parsed.qualifiers.get(\"fork\") ?? []) {\n const v = f.toLowerCase();\n if (v === \"true\" && !repo.fork) return false;\n if (v === \"false\" && repo.fork) return false;\n if (v === \"only\" && !repo.fork) return false;\n }\n for (const f of parsed.negations.get(\"fork\") ?? []) {\n const v = f.toLowerCase();\n if (v === \"true\" && repo.fork) return false;\n if (v === \"false\" && !repo.fork) return false;\n if (v === \"only\" && repo.fork) return false;\n }\n\n const searchIn = inScopes.length > 0 ? inScopes.map((s) => s.toLowerCase()) : [\"name\", \"description\", \"topics\"];\n\n const text = parsed.text;\n if (text.length) {\n const nameMatch = textMatches(repo.name, text);\n const fullMatch = textMatches(repo.full_name, text);\n const descMatch = repo.description ? textMatches(repo.description, text) : false;\n const topicsMatch = repo.topics.some((t) => textMatches(t, text));\n\n let ok = false;\n if (searchIn.includes(\"name\") && (nameMatch || fullMatch)) ok = true;\n if (searchIn.includes(\"description\") && descMatch) ok = true;\n if (searchIn.includes(\"topics\") && topicsMatch) ok = true;\n if (!ok) return false;\n }\n\n for (const n of negIn) {\n const scope = n.toLowerCase();\n if (scope === \"name\" && (textMatches(repo.name, parsed.text) || textMatches(repo.full_name, parsed.text))) {\n return false;\n }\n if (scope === \"description\" && repo.description && textMatches(repo.description, parsed.text)) {\n return false;\n }\n if (scope === \"topics\" && repo.topics.some((t) => textMatches(t, parsed.text))) {\n return false;\n }\n }\n\n return true;\n });\n}\n\nfunction repoRelevance(repo: GitHubRepo, parsed: ParsedSearchQuery): number {\n const t = parsed.text.trim().toLowerCase();\n if (!t) return 1;\n let score = 0;\n if (repo.name.toLowerCase().includes(t)) score += 5;\n if (repo.full_name.toLowerCase().includes(t)) score += 4;\n if (repo.description?.toLowerCase().includes(t)) score += 2;\n if (repo.topics.some((x) => x.toLowerCase().includes(t))) score += 1;\n return score;\n}\n\nfunction resolveRepoQualifier(gh: GitHubStore, spec: string): GitHubRepo | null {\n const trimmed = spec.trim();\n if (!trimmed.includes(\"/\")) return null;\n return lookupRepo(gh, trimmed.split(\"/\")[0]!, trimmed.split(\"/\")[1]!) ?? null;\n}\n\nfunction issuePrMatchesFilters(\n gh: GitHubStore,\n parsed: ParsedSearchQuery,\n repo: GitHubRepo,\n issue: GitHubIssue | null,\n pr: GitHubPullRequest | null,\n): boolean {\n const repoSpecs = parsed.qualifiers.get(\"repo\") ?? [];\n for (const rs of repoSpecs) {\n const r = resolveRepoQualifier(gh, rs);\n if (!r || r.id !== repo.id) return false;\n }\n for (const rs of parsed.negations.get(\"repo\") ?? []) {\n const r = resolveRepoQualifier(gh, rs);\n if (r && r.id === repo.id) return false;\n }\n\n const isVals = [...(parsed.qualifiers.get(\"is\") ?? []), ...(parsed.qualifiers.get(\"type\") ?? [])].map((x) =>\n x.toLowerCase(),\n );\n const negIs = [...(parsed.negations.get(\"is\") ?? []), ...(parsed.negations.get(\"type\") ?? [])].map((x) =>\n x.toLowerCase(),\n );\n\n const isPr = pr !== null || issue?.is_pull_request === true;\n\n if (isVals.includes(\"issue\") && isPr) return false;\n if (isVals.includes(\"pr\") && !isPr) return false;\n\n if (negIs.includes(\"issue\") && !isPr) return false;\n if (negIs.includes(\"pr\") && isPr) return false;\n\n const stateVals = parsed.qualifiers.get(\"state\") ?? [];\n for (const s of stateVals) {\n const sl = s.toLowerCase();\n if (isPr && pr) {\n if (sl === \"open\" && pr.state !== \"open\") return false;\n if (sl === \"closed\" && pr.state !== \"closed\") return false;\n } else if (issue) {\n if (sl === \"open\" && issue.state !== \"open\") return false;\n if (sl === \"closed\" && issue.state !== \"closed\") return false;\n }\n }\n\n for (const iv of isVals) {\n if (iv === \"open\") {\n if (isPr && pr && pr.state !== \"open\") return false;\n if (!isPr && issue && issue.state !== \"open\") return false;\n }\n if (iv === \"closed\") {\n if (isPr && pr && pr.state !== \"closed\") return false;\n if (!isPr && issue && issue.state !== \"closed\") return false;\n }\n if (iv === \"merged\") {\n if (!isPr || !pr || !pr.merged) return false;\n }\n if (iv === \"draft\") {\n if (!isPr || !pr || !pr.draft) return false;\n }\n }\n\n for (const iv of negIs) {\n if (iv === \"open\") {\n if (isPr && pr && pr.state === \"open\") return false;\n if (!isPr && issue && issue.state === \"open\") return false;\n }\n if (iv === \"closed\") {\n if (isPr && pr && pr.state === \"closed\") return false;\n if (!isPr && issue && issue.state === \"closed\") return false;\n }\n if (iv === \"merged\") {\n if (isPr && pr && pr.merged) return false;\n }\n if (iv === \"draft\") {\n if (isPr && pr && pr.draft) return false;\n }\n }\n\n const authors = parsed.qualifiers.get(\"author\") ?? [];\n for (const a of authors) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (isPr && pr) {\n if (!uid || pr.user_id !== uid) return false;\n } else if (issue) {\n if (!uid || issue.user_id !== uid) return false;\n }\n }\n for (const a of parsed.negations.get(\"author\") ?? []) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (isPr && pr && uid !== undefined && pr.user_id === uid) return false;\n if (!isPr && issue && uid !== undefined && issue.user_id === uid) return false;\n }\n\n const assignees = parsed.qualifiers.get(\"assignee\") ?? [];\n for (const a of assignees) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (!uid) return false;\n const ids = isPr && pr ? pr.assignee_ids : (issue?.assignee_ids ?? []);\n if (!ids.includes(uid)) return false;\n }\n for (const a of parsed.negations.get(\"assignee\") ?? []) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (uid === undefined) continue;\n const ids = isPr && pr ? pr.assignee_ids : (issue?.assignee_ids ?? []);\n if (ids.includes(uid)) return false;\n }\n\n const labels = parsed.qualifiers.get(\"label\") ?? [];\n for (const lb of labels) {\n const labelIds = isPr && pr ? pr.label_ids : (issue?.label_ids ?? []);\n const names = labelIds\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => l!.name.toLowerCase());\n if (!names.includes(lb.toLowerCase())) return false;\n }\n for (const lb of parsed.negations.get(\"label\") ?? []) {\n const labelIds = isPr && pr ? pr.label_ids : (issue?.label_ids ?? []);\n const names = labelIds\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => l!.name.toLowerCase());\n if (names.includes(lb.toLowerCase())) return false;\n }\n\n const milestones = parsed.qualifiers.get(\"milestone\") ?? [];\n for (const ms of milestones) {\n const mid = isPr && pr ? pr.milestone_id : issue?.milestone_id;\n const m = mid ? gh.milestones.get(mid) : null;\n if (!m || m.title.toLowerCase() !== ms.toLowerCase()) return false;\n }\n for (const ms of parsed.negations.get(\"milestone\") ?? []) {\n const mid = isPr && pr ? pr.milestone_id : issue?.milestone_id;\n const m = mid ? gh.milestones.get(mid) : null;\n if (m && m.title.toLowerCase() === ms.toLowerCase()) return false;\n }\n\n const commentRanges = parsed.ranges.get(\"comments\") ?? [];\n const commentEq = parsed.qualifiers.get(\"comments\") ?? [];\n const n = isPr && pr ? pr.comments : (issue?.comments ?? 0);\n if (!matchesNumericPredicate(n, commentRanges, commentEq)) return false;\n for (const nv of parsed.negations.get(\"comments\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(n, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && n === parseInt(nv, 10)) return false;\n }\n\n const text = parsed.text.trim();\n if (text.length) {\n const title = isPr && pr ? pr.title : (issue?.title ?? \"\");\n const body = isPr && pr ? (pr.body ?? \"\") : (issue?.body ?? \"\");\n if (!textMatches(title, text) && !textMatches(body, text)) return false;\n }\n\n return true;\n}\n\nfunction userMatchesSearch(gh: GitHubStore, u: GitHubUser, parsed: ParsedSearchQuery): boolean {\n const types = parsed.qualifiers.get(\"type\") ?? [];\n if (types.length && !types.map((t) => t.toLowerCase()).includes(\"user\")) return false;\n for (const t of parsed.negations.get(\"type\") ?? []) {\n if (t.toLowerCase() === \"user\") return false;\n }\n\n const inScopes = parsed.qualifiers.get(\"in\") ?? [];\n const searchIn = inScopes.length > 0 ? inScopes.map((s) => s.toLowerCase()) : [\"login\", \"email\", \"fullname\"];\n\n const text = parsed.text.trim();\n if (text.length) {\n let ok = false;\n if (searchIn.includes(\"login\") && textMatches(u.login, text)) ok = true;\n if (searchIn.includes(\"email\") && u.email && textMatches(u.email, text)) ok = true;\n if (searchIn.includes(\"fullname\") && u.name && textMatches(u.name, text)) ok = true;\n if (!ok) return false;\n }\n\n const rpred = parsed.ranges.get(\"repos\") ?? [];\n const req = parsed.qualifiers.get(\"repos\") ?? [];\n if (!matchesNumericPredicate(u.public_repos, rpred, req)) return false;\n for (const nv of parsed.negations.get(\"repos\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(u.public_repos, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && u.public_repos === parseInt(nv, 10)) return false;\n }\n\n const fpred = parsed.ranges.get(\"followers\") ?? [];\n const feq = parsed.qualifiers.get(\"followers\") ?? [];\n if (!matchesNumericPredicate(u.followers, fpred, feq)) return false;\n for (const nv of parsed.negations.get(\"followers\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(u.followers, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && u.followers === parseInt(nv, 10)) return false;\n }\n\n return true;\n}\n\nfunction orgMatchesSearch(gh: GitHubStore, o: GitHubOrg, parsed: ParsedSearchQuery): boolean {\n void gh;\n const types = parsed.qualifiers.get(\"type\") ?? [];\n if (types.length && !types.map((t) => t.toLowerCase()).includes(\"org\")) return false;\n for (const t of parsed.negations.get(\"type\") ?? []) {\n if (t.toLowerCase() === \"org\") return false;\n }\n\n const inScopes = parsed.qualifiers.get(\"in\") ?? [];\n const searchIn = inScopes.length > 0 ? inScopes.map((s) => s.toLowerCase()) : [\"login\", \"email\", \"fullname\"];\n\n const text = parsed.text.trim();\n if (text.length) {\n let ok = false;\n if (searchIn.includes(\"login\") && textMatches(o.login, text)) ok = true;\n if (searchIn.includes(\"email\") && o.email && textMatches(o.email, text)) ok = true;\n if (searchIn.includes(\"fullname\") && o.name && textMatches(o.name, text)) ok = true;\n if (!ok) return false;\n }\n\n const rpred = parsed.ranges.get(\"repos\") ?? [];\n const req = parsed.qualifiers.get(\"repos\") ?? [];\n if (!matchesNumericPredicate(o.public_repos, rpred, req)) return false;\n for (const nv of parsed.negations.get(\"repos\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(o.public_repos, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && o.public_repos === parseInt(nv, 10)) return false;\n }\n\n const fpred = parsed.ranges.get(\"followers\") ?? [];\n const feq = parsed.qualifiers.get(\"followers\") ?? [];\n if (!matchesNumericPredicate(o.followers, fpred, feq)) return false;\n for (const nv of parsed.negations.get(\"followers\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(o.followers, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && o.followers === parseInt(nv, 10)) return false;\n }\n\n return true;\n}\n\nfunction blobText(blob: GitHubBlob): string {\n if (blob.encoding === \"base64\") {\n try {\n return Buffer.from(blob.content, \"base64\").toString(\"utf8\");\n } catch {\n return \"\";\n }\n }\n return blob.content;\n}\n\nfunction buildBlobPathIndex(gh: GitHubStore): Map<string, string> {\n const byRepo = new Map<number, Map<string, string>>();\n for (const tree of gh.trees.all()) {\n let map = byRepo.get(tree.repo_id);\n if (!map) {\n map = new Map();\n byRepo.set(tree.repo_id, map);\n }\n for (const e of tree.tree) {\n if (e.type === \"blob\") {\n if (!map.has(e.sha)) map.set(e.sha, e.path);\n }\n }\n }\n const key = (repoId: number, sha: string) => `${repoId}:${sha}`;\n const flat = new Map<string, string>();\n for (const [repoId, m] of byRepo) {\n for (const [sha, path] of m) {\n flat.set(key(repoId, sha), path);\n }\n }\n return flat;\n}\n\nfunction formatSearchCommit(gh: GitHubStore, commit: GitHubCommit, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n sha: commit.sha,\n node_id: commit.node_id,\n url: `${repoUrl}/commits/${commit.sha}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${commit.sha}`,\n comments_url: `${repoUrl}/comments/${commit.sha}`,\n repository: formatRepo(repo, gh, baseUrl),\n commit: {\n url: `${repoUrl}/git/commits/${commit.sha}`,\n author: {\n name: commit.author_name,\n email: commit.author_email,\n date: commit.author_date,\n },\n committer: {\n name: commit.committer_name,\n email: commit.committer_email,\n date: commit.committer_date,\n },\n message: commit.message,\n },\n author: null as null,\n committer: null as null,\n parents: commit.parent_shas.map((sha) => ({\n sha,\n url: `${repoUrl}/commits/${sha}`,\n })),\n };\n}\n\nfunction loginMatchesCommitAuthor(\n gh: GitHubStore,\n login: string,\n commit: GitHubCommit,\n role: \"author\" | \"committer\",\n): boolean {\n const u = gh.users.findOneBy(\"login\", login);\n const email = (role === \"author\" ? commit.author_email : commit.committer_email).toLowerCase();\n if (u) {\n if (u.email && u.email.toLowerCase() === email) return true;\n if (commit.user_id != null && commit.user_id === u.id) return true;\n }\n const expect = `${login.toLowerCase()}@users.noreply.github.com`;\n return email === expect || email.startsWith(`${login.toLowerCase()}+`);\n}\n\nexport function searchRoutes({ app, store, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/search/repositories\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n const authUser = c.get(\"authUser\");\n\n let list = gh.repos.all().filter((r) => repoVisibleForSearch(r, gh, authUser));\n list = filterRepos(gh, list, parsed, authUser);\n\n if (sortRaw === \"stars\") {\n list.sort((a, b) =>\n order === \"desc\" ? b.stargazers_count - a.stargazers_count : a.stargazers_count - b.stargazers_count,\n );\n } else if (sortRaw === \"forks\") {\n list.sort((a, b) => (order === \"desc\" ? b.forks_count - a.forks_count : a.forks_count - b.forks_count));\n } else if (sortRaw === \"updated\") {\n list.sort((a, b) =>\n order === \"desc\" ? b.updated_at.localeCompare(a.updated_at) : a.updated_at.localeCompare(b.updated_at),\n );\n } else {\n list.sort((a, b) => repoRelevance(b, parsed) - repoRelevance(a, parsed));\n }\n\n const total = list.length;\n const slice = list.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n incomplete_results: false,\n items: slice.map((r) => formatRepo(r, gh, baseUrl)),\n });\n });\n\n app.get(\"/search/issues\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n\n const authUser = c.get(\"authUser\");\n type Hit = { kind: \"issue\"; issue: GitHubIssue } | { kind: \"pr\"; pr: GitHubPullRequest };\n const hits: Hit[] = [];\n\n for (const issue of gh.issues.all()) {\n const repo = gh.repos.get(issue.repo_id);\n if (!repo) continue;\n if (!repoVisibleForSearch(repo, gh, authUser)) continue;\n if (issue.is_pull_request) {\n const pr = gh.pullRequests.findBy(\"repo_id\", issue.repo_id).find((p) => p.number === issue.number);\n if (!pr) continue;\n if (!issuePrMatchesFilters(gh, parsed, repo, issue, pr)) continue;\n hits.push({ kind: \"pr\", pr });\n } else {\n if (!issuePrMatchesFilters(gh, parsed, repo, issue, null)) continue;\n hits.push({ kind: \"issue\", issue });\n }\n }\n\n function relevance(h: Hit): number {\n const title = h.kind === \"issue\" ? h.issue.title : h.pr.title;\n const body = h.kind === \"issue\" ? (h.issue.body ?? \"\") : (h.pr.body ?? \"\");\n const t = parsed.text.trim().toLowerCase();\n if (!t) return 1;\n let s = 0;\n if (title.toLowerCase().includes(t)) s += 3;\n if (body.toLowerCase().includes(t)) s += 1;\n return s;\n }\n\n const sorted = [...hits];\n if (sortRaw === \"created\") {\n sorted.sort((a, b) => {\n const ca = a.kind === \"issue\" ? a.issue.created_at : a.pr.created_at;\n const cb = b.kind === \"issue\" ? b.issue.created_at : b.pr.created_at;\n const cmp = ca.localeCompare(cb);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else if (sortRaw === \"updated\") {\n sorted.sort((a, b) => {\n const ca = a.kind === \"issue\" ? a.issue.updated_at : a.pr.updated_at;\n const cb = b.kind === \"issue\" ? b.issue.updated_at : b.pr.updated_at;\n const cmp = ca.localeCompare(cb);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else if (sortRaw === \"comments\") {\n sorted.sort((a, b) => {\n const ca = a.kind === \"issue\" ? a.issue.comments : a.pr.comments;\n const cb = b.kind === \"issue\" ? b.issue.comments : b.pr.comments;\n return order === \"desc\" ? cb - ca : ca - cb;\n });\n } else {\n sorted.sort((a, b) => relevance(b) - relevance(a));\n }\n\n const total = sorted.length;\n const slice = sorted.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((h) => {\n if (h.kind === \"issue\") {\n return formatIssue(h.issue, gh, baseUrl);\n }\n return formatPullRequest(h.pr, gh, baseUrl);\n });\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items: items.filter(Boolean),\n });\n });\n\n app.get(\"/search/users\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n\n type UHit = { kind: \"user\"; u: GitHubUser } | { kind: \"org\"; o: GitHubOrg };\n const hits: UHit[] = [];\n\n const typeFilters = parsed.qualifiers.get(\"type\")?.map((t) => t.toLowerCase()) ?? [];\n\n if (!typeFilters.length || typeFilters.includes(\"user\")) {\n for (const u of gh.users.all()) {\n if (u.type === \"Organization\") continue;\n if (userMatchesSearch(gh, u, parsed)) hits.push({ kind: \"user\", u });\n }\n }\n if (!typeFilters.length || typeFilters.includes(\"org\")) {\n for (const o of gh.orgs.all()) {\n if (orgMatchesSearch(gh, o, parsed)) hits.push({ kind: \"org\", o });\n }\n }\n\n function rel(h: UHit): number {\n const text = parsed.text.trim().toLowerCase();\n if (!text) return 1;\n if (h.kind === \"user\") {\n let s = 0;\n if (h.u.login.toLowerCase().includes(text)) s += 3;\n if (h.u.name?.toLowerCase().includes(text)) s += 1;\n return s;\n }\n let s = 0;\n if (h.o.login.toLowerCase().includes(text)) s += 3;\n if (h.o.name?.toLowerCase().includes(text)) s += 1;\n return s;\n }\n\n const list = [...hits];\n if (sortRaw === \"followers\") {\n list.sort((a, b) => {\n const fa = a.kind === \"user\" ? a.u.followers : a.o.followers;\n const fb = b.kind === \"user\" ? b.u.followers : b.o.followers;\n return order === \"desc\" ? fb - fa : fa - fb;\n });\n } else if (sortRaw === \"repositories\") {\n list.sort((a, b) => {\n const ra = a.kind === \"user\" ? a.u.public_repos : a.o.public_repos;\n const rb = b.kind === \"user\" ? b.u.public_repos : b.o.public_repos;\n return order === \"desc\" ? rb - ra : ra - rb;\n });\n } else if (sortRaw === \"joined\") {\n list.sort((a, b) => {\n const ca = a.kind === \"user\" ? a.u.created_at : a.o.created_at;\n const cb = b.kind === \"user\" ? b.u.created_at : b.o.created_at;\n const cmp = ca.localeCompare(cb);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else {\n list.sort((a, b) => rel(b) - rel(a));\n }\n\n const total = list.length;\n const slice = list.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((h) => (h.kind === \"user\" ? formatUser(h.u, baseUrl) : formatOrgBrief(h.o, baseUrl)));\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/code\", (c) => {\n const q = c.req.query(\"q\") ?? \"\";\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const authUser = c.get(\"authUser\");\n const blobs = gh.blobs.all();\n if (blobs.length === 0) {\n setLinkHeader(c, 0, 1, per_page);\n return c.json({\n total_count: 0,\n incomplete_results: false,\n items: [],\n });\n }\n\n const pathIdx = buildBlobPathIndex(gh);\n const text = parsed.text.trim();\n const repoSpecs = parsed.qualifiers.get(\"repo\") ?? [];\n const langs = parsed.qualifiers.get(\"language\") ?? [];\n const paths = parsed.qualifiers.get(\"path\") ?? [];\n const filenames = parsed.qualifiers.get(\"filename\") ?? [];\n const inScopes = (parsed.qualifiers.get(\"in\") ?? []).map((x) => x.toLowerCase());\n\n const matches: Array<{\n name: string;\n path: string;\n sha: string;\n score: number;\n repo: GitHubRepo;\n }> = [];\n\n for (const blob of blobs) {\n const repo = gh.repos.get(blob.repo_id);\n if (!repo) continue;\n if (!repoVisibleForSearch(repo, gh, authUser)) continue;\n if (repoSpecs.length) {\n const ok = repoSpecs.some((rs) => {\n const r = resolveRepoQualifier(gh, rs);\n return r && r.id === repo.id;\n });\n if (!ok) continue;\n }\n if (langs.length) {\n const lang = repo.language;\n if (!lang || !langs.some((l) => l.toLowerCase() === lang.toLowerCase())) continue;\n }\n\n const path = pathIdx.get(`${blob.repo_id}:${blob.sha}`) ?? `unknown/${blob.sha.slice(0, 7)}`;\n const base = path.split(\"/\").pop() ?? path;\n if (paths.length && !paths.some((p) => path.toLowerCase().includes(p.toLowerCase()))) continue;\n if (filenames.length && !filenames.some((p) => base.toLowerCase().includes(p.toLowerCase()))) continue;\n\n const content = blobText(blob);\n if (text.length) {\n const inFile = content.toLowerCase().includes(text.toLowerCase());\n const inPath = path.toLowerCase().includes(text.toLowerCase());\n let hit = false;\n if (!inScopes.length) hit = inFile || inPath;\n else {\n if (inScopes.includes(\"file\") && inFile) hit = true;\n if (inScopes.includes(\"path\") && inPath) hit = true;\n }\n if (!hit) continue;\n }\n\n matches.push({\n name: path.split(\"/\").pop() ?? blob.sha,\n path,\n sha: blob.sha,\n score: text.length ? (content.toLowerCase().includes(text.toLowerCase()) ? 2 : 1) : 1,\n repo,\n });\n }\n\n matches.sort((a, b) => b.score - a.score);\n const total = matches.length;\n const slice = matches.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((m) => {\n const repoUrl = `${baseUrl}/repos/${m.repo.full_name}`;\n return {\n name: m.name,\n path: m.path,\n sha: m.sha,\n url: `${repoUrl}/contents/${m.path}?ref=HEAD`,\n git_url: `${repoUrl}/git/blobs/${m.sha}`,\n html_url: `${baseUrl}/${m.repo.full_name}/blob/HEAD/${m.path}`,\n repository: formatRepo(m.repo, gh, baseUrl),\n score: 1,\n };\n });\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/commits\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n\n const authUser = c.get(\"authUser\");\n const repoSpecs = parsed.qualifiers.get(\"repo\") ?? [];\n const authors = parsed.qualifiers.get(\"author\") ?? [];\n const committers = parsed.qualifiers.get(\"committer\") ?? [];\n const mergeVals = parsed.qualifiers.get(\"merge\") ?? [];\n\n let list: GitHubCommit[] = [];\n for (const commit of gh.commits.all()) {\n const repo = gh.repos.get(commit.repo_id);\n if (!repo) continue;\n if (!repoVisibleForSearch(repo, gh, authUser)) continue;\n if (repoSpecs.length) {\n const ok = repoSpecs.some((rs) => {\n const r = resolveRepoQualifier(gh, rs);\n return r && r.id === repo.id;\n });\n if (!ok) continue;\n }\n if (authors.length) {\n const ok = authors.some((a) => loginMatchesCommitAuthor(gh, a, commit, \"author\"));\n if (!ok) continue;\n }\n if (committers.length) {\n const ok = committers.some((a) => loginMatchesCommitAuthor(gh, a, commit, \"committer\"));\n if (!ok) continue;\n }\n if (mergeVals.length) {\n const isMerge = commit.parent_shas.length > 1;\n const ok = mergeVals.every((m) => {\n if (m === \"true\") return isMerge;\n if (m === \"false\") return !isMerge;\n return true;\n });\n if (!ok) continue;\n }\n const t = parsed.text.trim();\n if (t.length && !textMatches(commit.message, t)) continue;\n list.push(commit);\n }\n\n function rel(cm: GitHubCommit): number {\n const t = parsed.text.trim().toLowerCase();\n if (!t) return 1;\n return cm.message.toLowerCase().includes(t) ? 2 : 1;\n }\n\n if (sortRaw === \"author-date\") {\n list = [...list].sort((a, b) => {\n const cmp = a.author_date.localeCompare(b.author_date);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else if (sortRaw === \"committer-date\") {\n list = [...list].sort((a, b) => {\n const cmp = a.committer_date.localeCompare(b.committer_date);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else {\n list = [...list].sort((a, b) => rel(b) - rel(a));\n }\n\n const total = list.length;\n const slice = list.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((commit) => {\n const repo = gh.repos.get(commit.repo_id)!;\n return formatSearchCommit(gh, commit, repo, baseUrl);\n });\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/topics\", (c) => {\n const q = c.req.query(\"q\") ?? \"\";\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const text = parsed.text.trim().toLowerCase();\n\n const topicSet = new Map<string, { name: string; updated: string }>();\n for (const repo of gh.repos.all()) {\n for (const t of repo.topics) {\n const key = t.toLowerCase();\n if (!topicSet.has(key)) {\n topicSet.set(key, { name: t, updated: repo.updated_at });\n } else {\n const cur = topicSet.get(key)!;\n if (repo.updated_at > cur.updated) topicSet.set(key, { name: t, updated: repo.updated_at });\n }\n }\n }\n\n let topics = Array.from(topicSet.values());\n if (text.length) {\n topics = topics.filter((t) => t.name.toLowerCase().includes(text));\n }\n\n topics.sort((a, b) => a.name.localeCompare(b.name));\n const total = topics.length;\n const slice = topics.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((t) => ({\n name: t.name,\n display_name: t.name,\n short_description: \"\",\n created_by: null as string | null,\n created_at: t.updated,\n updated_at: t.updated,\n }));\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/labels\", (c) => {\n const q = c.req.query(\"q\") ?? \"\";\n const rawId = c.req.query(\"repository_id\");\n if (rawId === undefined || rawId === \"\") {\n throw new ApiError(422, \"Validation Failed: repository_id is required\");\n }\n const repositoryId = parseInt(rawId, 10);\n if (Number.isNaN(repositoryId)) {\n throw new ApiError(422, \"Validation Failed: invalid repository_id\");\n }\n const repo = gh.repos.get(repositoryId);\n if (!repo) {\n throw new ApiError(404, \"Not Found\");\n }\n\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const text = parsed.text.trim().toLowerCase();\n\n let labels = gh.labels.findBy(\"repo_id\", repositoryId);\n if (text.length) {\n labels = labels.filter(\n (l) => l.name.toLowerCase().includes(text) || (l.description && l.description.toLowerCase().includes(text)),\n );\n }\n\n labels.sort((a, b) => a.name.localeCompare(b.name));\n const total = labels.length;\n const slice = labels.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items: slice.map((l) => ({\n id: l.id,\n node_id: l.node_id,\n url: `${baseUrl}/repos/${repo.full_name}/labels/${encodeURIComponent(l.name)}`,\n name: l.name,\n color: l.color,\n default: l.default,\n description: l.description,\n })),\n });\n });\n}\n","import type { RouteContext, AuthUser } from \"@emulators/core\";\nimport { ApiError, forbidden, parseJsonBody, parsePagination, setLinkHeader, unauthorized } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubArtifact,\n GitHubJob,\n GitHubOrg,\n GitHubRepo,\n GitHubSecret,\n GitHubUser,\n GitHubWorkflow,\n GitHubWorkflowRun,\n} from \"../entities.js\";\nimport { formatRepo, formatUser, generateNodeId, generateSha, lookupRepo, timestamp } from \"../helpers.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoAdmin,\n assertRepoRead,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction listOrgMembersDeduped(gh: GitHubStore, orgId: number): { user: GitHubUser; orgRole: \"admin\" | \"member\" }[] {\n const byUser = new Map<number, { user: GitHubUser; isAdmin: boolean }>();\n for (const team of gh.teams.findBy(\"org_id\", orgId)) {\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n const user = gh.users.get(m.user_id);\n if (!user) continue;\n const isAdmin = m.role === \"maintainer\";\n const prev = byUser.get(user.id);\n if (!prev) {\n byUser.set(user.id, { user, isAdmin });\n } else {\n byUser.set(user.id, { user, isAdmin: prev.isAdmin || isAdmin });\n }\n }\n }\n return [...byUser.values()]\n .map(({ user, isAdmin }) => ({\n user,\n orgRole: isAdmin ? (\"admin\" as const) : (\"member\" as const),\n }))\n .sort((a, b) => a.user.id - b.user.id);\n}\n\nfunction orgRoleForUser(gh: GitHubStore, orgId: number, userId: number): \"admin\" | \"member\" | null {\n const row = listOrgMembersDeduped(gh, orgId).find((r) => r.user.id === userId);\n return row?.orgRole ?? null;\n}\n\nfunction assertOrgAdmin(gh: GitHubStore, authUser: AuthUser | undefined, org: GitHubOrg) {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n if (orgRoleForUser(gh, org.id, user.id) === \"admin\") return;\n throw forbidden();\n}\n\nfunction getOrgByLogin(gh: GitHubStore, login: string): GitHubOrg | undefined {\n return gh.orgs.findOneBy(\"login\", login);\n}\n\nfunction resolveWorkflow(gh: GitHubStore, repoId: number, param: string): GitHubWorkflow | undefined {\n const trimmed = param.trim();\n const asNum = parseInt(trimmed, 10);\n if (!Number.isNaN(asNum) && String(asNum) === trimmed) {\n const w = gh.workflows.get(asNum);\n if (w && w.repo_id === repoId) return w;\n }\n const decoded = decodeURIComponent(trimmed);\n return gh.workflows\n .findBy(\"repo_id\", repoId)\n .find((w) => w.path === decoded || w.path.endsWith(`/${decoded}`) || w.name === decoded);\n}\n\nfunction resolveRefToBranchAndSha(gh: GitHubStore, repo: GitHubRepo, ref: string): { branch: string; sha: string } {\n const name = ref.replace(/^refs\\/heads\\//, \"\").replace(/^refs\\/tags\\//, \"\");\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === name);\n if (branch) return { branch: branch.name, sha: branch.sha };\n return { branch: name, sha: generateSha() };\n}\n\nfunction nextRunNumber(gh: GitHubStore, workflowId: number, repoId: number): number {\n const runs = gh.workflowRuns.findBy(\"workflow_id\", workflowId).filter((r) => r.repo_id === repoId);\n return runs.reduce((m, r) => Math.max(m, r.run_number), 0) + 1;\n}\n\nfunction findRepoSecret(gh: GitHubStore, repoId: number, name: string): GitHubSecret | undefined {\n return gh.secrets.all().find((s) => s.repo_id === repoId && s.org_id === null && s.name === name);\n}\n\nfunction findOrgSecret(gh: GitHubStore, orgId: number, name: string): GitHubSecret | undefined {\n return gh.secrets.all().find((s) => s.org_id === orgId && s.repo_id === null && s.name === name);\n}\n\nfunction listRepoSecrets(gh: GitHubStore, repoId: number): GitHubSecret[] {\n return gh.secrets.all().filter((s) => s.repo_id === repoId && s.org_id === null);\n}\n\nfunction listOrgSecrets(gh: GitHubStore, orgId: number): GitHubSecret[] {\n return gh.secrets.all().filter((s) => s.org_id === orgId && s.repo_id === null);\n}\n\nfunction deleteJobsForRun(gh: GitHubStore, runId: number) {\n for (const j of gh.jobs.findBy(\"run_id\", runId)) {\n gh.jobs.delete(j.id);\n }\n}\n\nfunction deleteArtifactsForRun(gh: GitHubStore, runId: number) {\n for (const a of gh.artifacts.findBy(\"run_id\", runId)) {\n gh.artifacts.delete(a.id);\n }\n}\n\nfunction seedStubJobs(gh: GitHubStore, repo: GitHubRepo, run: GitHubWorkflowRun) {\n const job = gh.jobs.insert({\n node_id: \"\",\n repo_id: repo.id,\n run_id: run.id,\n name: \"build\",\n status: run.status === \"completed\" ? \"completed\" : \"in_progress\",\n conclusion: run.status === \"completed\" ? run.conclusion : null,\n started_at: run.run_started_at,\n completed_at: run.status === \"completed\" ? run.updated_at : null,\n runner_id: 1,\n runner_name: \"Hosted Agent\",\n steps: [\n {\n name: \"Set up job\",\n status: run.status === \"completed\" ? \"completed\" : \"in_progress\",\n conclusion: run.status === \"completed\" ? run.conclusion : null,\n number: 1,\n started_at: run.run_started_at,\n completed_at: run.status === \"completed\" ? run.updated_at : null,\n },\n ],\n } as Omit<GitHubJob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.jobs.update(job.id, { node_id: generateNodeId(\"Job\", job.id) });\n}\n\nfunction formatWorkflow(w: GitHubWorkflow, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n id: w.id,\n node_id: w.node_id,\n name: w.name,\n path: w.path,\n state: w.state,\n created_at: w.created_at,\n updated_at: w.updated_at,\n url: `${repoUrl}/actions/workflows/${w.id}`,\n html_url: `${baseUrl}/${repo.full_name}/blob/${repo.default_branch}/${w.path}`,\n badge_url:\n w.badge_url ||\n `${baseUrl}/${repo.full_name}/workflows/${encodeURIComponent(w.path.replace(/^\\/.github\\/workflows\\//, \"\"))}/badge.svg`,\n };\n}\n\nfunction formatWorkflowRun(run: GitHubWorkflowRun, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const wf = gh.workflows.get(run.workflow_id);\n const actor = gh.users.get(run.actor_id);\n const wfPath = wf?.path ?? \".github/workflows/main.yml\";\n return {\n id: run.id,\n name: run.name,\n node_id: run.node_id,\n head_branch: run.head_branch,\n head_sha: run.head_sha,\n path: wfPath,\n display_title: run.name,\n run_number: run.run_number,\n event: run.event,\n status: run.status,\n conclusion: run.conclusion,\n workflow_id: run.workflow_id,\n check_suite_id: null,\n url: `${repoUrl}/actions/runs/${run.id}`,\n html_url: `${baseUrl}/${repo.full_name}/actions/runs/${run.id}`,\n pull_requests: [],\n created_at: run.created_at,\n updated_at: run.updated_at,\n actor: actor ? formatUser(actor, baseUrl) : null,\n run_attempt: run.run_attempt,\n run_started_at: run.run_started_at,\n triggering_actor: actor ? formatUser(actor, baseUrl) : null,\n workflow_url: wf ? `${repoUrl}/actions/workflows/${wf.id}` : null,\n repository: formatRepo(repo, gh, baseUrl),\n head_commit: {\n id: run.head_sha,\n tree_id: generateSha(),\n message: \"Workflow run\",\n timestamp: run.created_at,\n author: actor\n ? { name: actor.login, email: `${actor.login}@users.noreply.github.com` }\n : { name: \"unknown\", email: \"unknown@users.noreply.github.com\" },\n },\n };\n}\n\nfunction formatJob(job: GitHubJob, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const run = gh.workflowRuns.get(job.run_id);\n const headSha = run?.head_sha ?? \"\";\n return {\n id: job.id,\n run_id: job.run_id,\n workflow_name: run?.name ?? \"workflow\",\n head_branch: run?.head_branch ?? \"\",\n run_url: `${repoUrl}/actions/runs/${job.run_id}`,\n node_id: job.node_id,\n head_sha: headSha,\n status: job.status,\n conclusion: job.conclusion,\n started_at: job.started_at,\n completed_at: job.completed_at,\n name: job.name,\n steps: job.steps,\n url: `${repoUrl}/actions/jobs/${job.id}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${headSha}/checks`,\n check_run_url: `${baseUrl}/repos/${repo.full_name}/check-runs/${job.id}`,\n labels: [\"hosted\"],\n runner_id: job.runner_id,\n runner_name: job.runner_name,\n runner_group_id: 1,\n runner_group_name: \"GitHub Actions\",\n created_at: job.created_at,\n updated_at: job.updated_at,\n };\n}\n\nfunction formatArtifact(a: GitHubArtifact, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const run = gh.workflowRuns.get(a.run_id);\n return {\n id: a.id,\n node_id: a.node_id,\n name: a.name,\n size_in_bytes: a.size_in_bytes,\n url: `${repoUrl}/actions/artifacts/${a.id}`,\n archive_download_url: `${repoUrl}/actions/artifacts/${a.id}/zip`,\n expired: a.expired,\n digest: null,\n created_at: a.created_at,\n expires_at: a.expires_at,\n workflow_run: run\n ? {\n id: run.id,\n repository_id: repo.id,\n head_repository_id: repo.id,\n head_branch: run.head_branch,\n head_sha: run.head_sha,\n }\n : null,\n };\n}\n\nfunction filterRuns(\n gh: GitHubStore,\n runs: GitHubWorkflowRun[],\n q: { actor?: string; branch?: string; event?: string; status?: string },\n) {\n let out = runs;\n if (q.actor) {\n const u = gh.users.findOneBy(\"login\", q.actor);\n out = u ? out.filter((r) => r.actor_id === u.id) : [];\n }\n if (q.branch) {\n out = out.filter((r) => r.head_branch === q.branch);\n }\n if (q.event) {\n out = out.filter((r) => r.event === q.event);\n }\n if (q.status) {\n out = out.filter((r) => r.status === q.status);\n }\n return out.sort((a, b) => b.created_at.localeCompare(a.created_at));\n}\n\nexport function actionsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/actions/workflows\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const workflows = gh.workflows.findBy(\"repo_id\", repo.id).sort((a, b) => a.path.localeCompare(b.path));\n return c.json({\n total_count: workflows.length,\n workflows: workflows.map((w) => formatWorkflow(w, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/workflows/:workflow_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n return c.json(formatWorkflow(w, repo, gh, baseUrl));\n });\n\n app.put(\"/repos/:owner/:repo/actions/workflows/:workflow_id/disable\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n gh.workflows.update(w.id, { state: \"disabled_manually\" });\n return c.body(null, 204);\n });\n\n app.put(\"/repos/:owner/:repo/actions/workflows/:workflow_id/enable\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n gh.workflows.update(w.id, { state: \"active\" });\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/actions/workflows/:workflow_id/dispatches\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertAuthenticatedUser(gh, c.get(\"authUser\"));\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n if (w.state !== \"active\") {\n throw new ApiError(422, \"Workflow is not active\");\n }\n const body = await parseJsonBody(c);\n const ref = typeof body.ref === \"string\" ? body.ref : repo.default_branch;\n const { branch, sha } = resolveRefToBranchAndSha(gh, repo, ref);\n const now = timestamp();\n const runNumber = nextRunNumber(gh, w.id, repo.id);\n const run = gh.workflowRuns.insert({\n node_id: \"\",\n repo_id: repo.id,\n workflow_id: w.id,\n name: w.name,\n head_branch: branch,\n head_sha: sha,\n run_number: runNumber,\n event: \"workflow_dispatch\",\n status: \"queued\",\n conclusion: null,\n actor_id: actor.id,\n run_attempt: 1,\n run_started_at: now,\n } as Omit<GitHubWorkflowRun, \"id\" | \"created_at\" | \"updated_at\">);\n gh.workflowRuns.update(run.id, { node_id: generateNodeId(\"WorkflowRun\", run.id) });\n const created = gh.workflowRuns.get(run.id)!;\n seedStubJobs(gh, repo, created);\n const ownerLogin = ownerLoginOf(gh, repo);\n void webhooks.dispatch(\n \"workflow_dispatch\",\n undefined,\n {\n ref: `refs/heads/${branch}`,\n inputs: typeof body.inputs === \"object\" && body.inputs ? body.inputs : {},\n workflow: formatWorkflow(w, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n void webhooks.dispatch(\n \"workflow_run\",\n \"requested\",\n {\n workflow_run: formatWorkflowRun(created, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const { page, per_page } = parsePagination(c);\n const actor = c.req.query(\"actor\") ?? undefined;\n const branch = c.req.query(\"branch\") ?? undefined;\n const event = c.req.query(\"event\") ?? undefined;\n const status = c.req.query(\"status\") ?? undefined;\n const all = gh.workflowRuns.findBy(\"repo_id\", repo.id);\n const filtered = filterRuns(gh, all, { actor, branch, event, status });\n const total = filtered.length;\n const slice = filtered.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n workflow_runs: slice.map((r) => formatWorkflowRun(r, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatWorkflowRun(run, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/actions/workflows/:workflow_id/runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n const { page, per_page } = parsePagination(c);\n const actor = c.req.query(\"actor\") ?? undefined;\n const branch = c.req.query(\"branch\") ?? undefined;\n const event = c.req.query(\"event\") ?? undefined;\n const status = c.req.query(\"status\") ?? undefined;\n const all = gh.workflowRuns.findBy(\"repo_id\", repo.id).filter((r) => r.workflow_id === w.id);\n const filtered = filterRuns(gh, all, { actor, branch, event, status });\n const total = filtered.length;\n const slice = filtered.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n workflow_runs: slice.map((r) => formatWorkflowRun(r, repo, gh, baseUrl)),\n });\n });\n\n app.post(\"/repos/:owner/:repo/actions/runs/:run_id/cancel\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n gh.workflowRuns.update(run.id, { status: \"completed\", conclusion: \"cancelled\" });\n const updated = gh.workflowRuns.get(run.id)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n const actor = gh.users.get(run.actor_id);\n void webhooks.dispatch(\n \"workflow_run\",\n \"completed\",\n {\n workflow_run: formatWorkflowRun(updated, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: actor ? formatUser(actor, baseUrl) : null,\n },\n ownerLogin,\n repo.name,\n );\n return c.body(null, 202);\n });\n\n app.post(\"/repos/:owner/:repo/actions/runs/:run_id/rerun\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const parent = gh.workflowRuns.get(runId);\n if (!parent || parent.repo_id !== repo.id) throw notFoundResponse();\n const wf = gh.workflows.get(parent.workflow_id);\n if (!wf) throw notFoundResponse();\n const now = timestamp();\n const runNumber = nextRunNumber(gh, wf.id, repo.id);\n const run = gh.workflowRuns.insert({\n node_id: \"\",\n repo_id: repo.id,\n workflow_id: wf.id,\n name: parent.name,\n head_branch: parent.head_branch,\n head_sha: parent.head_sha,\n run_number: runNumber,\n event: parent.event,\n status: \"queued\",\n conclusion: null,\n actor_id: parent.actor_id,\n run_attempt: parent.run_attempt + 1,\n run_started_at: now,\n } as Omit<GitHubWorkflowRun, \"id\" | \"created_at\" | \"updated_at\">);\n gh.workflowRuns.update(run.id, { node_id: generateNodeId(\"WorkflowRun\", run.id) });\n const created = gh.workflowRuns.get(run.id)!;\n seedStubJobs(gh, repo, created);\n const ownerLogin = ownerLoginOf(gh, repo);\n const actor = gh.users.get(created.actor_id);\n void webhooks.dispatch(\n \"workflow_run\",\n \"requested\",\n {\n workflow_run: formatWorkflowRun(created, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: actor ? formatUser(actor, baseUrl) : null,\n },\n ownerLogin,\n repo.name,\n );\n return c.json(formatWorkflowRun(created, repo, gh, baseUrl), 201);\n });\n\n app.delete(\"/repos/:owner/:repo/actions/runs/:run_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n deleteArtifactsForRun(gh, run.id);\n deleteJobsForRun(gh, run.id);\n gh.workflowRuns.delete(run.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id/logs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n return c.text(`2025-01-01T00:00:00.0000000Z Workflow run ${run.id} logs (stub)\\n${run.head_sha}\\n`, 200, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id/jobs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n const jobs = gh.jobs.findBy(\"run_id\", runId).filter((j) => j.repo_id === repo.id);\n return c.json({\n total_count: jobs.length,\n jobs: jobs.map((j) => formatJob(j, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/jobs/:job_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const jobId = parseInt(c.req.param(\"job_id\")!, 10);\n const job = gh.jobs.get(jobId);\n if (!job || job.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatJob(job, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/actions/jobs/:job_id/logs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const jobId = parseInt(c.req.param(\"job_id\")!, 10);\n const job = gh.jobs.get(jobId);\n if (!job || job.repo_id !== repo.id) throw notFoundResponse();\n return c.text(`2025-01-01T00:00:00.0000000Z Job ${job.id} logs (stub)\\n`, 200, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/artifacts\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const { page, per_page } = parsePagination(c);\n const all = gh.artifacts.findBy(\"repo_id\", repo.id).sort((a, b) => b.created_at.localeCompare(a.created_at));\n const total = all.length;\n const slice = all.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n artifacts: slice.map((a) => formatArtifact(a, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id/artifacts\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n const arts = gh.artifacts.findBy(\"run_id\", runId).filter((a) => a.repo_id === repo.id);\n return c.json({\n total_count: arts.length,\n artifacts: arts.map((a) => formatArtifact(a, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/artifacts/:artifact_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const artifactId = parseInt(c.req.param(\"artifact_id\")!, 10);\n const a = gh.artifacts.get(artifactId);\n if (!a || a.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatArtifact(a, repo, gh, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/actions/artifacts/:artifact_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const artifactId = parseInt(c.req.param(\"artifact_id\")!, 10);\n const a = gh.artifacts.get(artifactId);\n if (!a || a.repo_id !== repo.id) throw notFoundResponse();\n gh.artifacts.delete(a.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/actions/secrets\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const secrets = listRepoSecrets(gh, repo.id).sort((a, b) => a.name.localeCompare(b.name));\n return c.json({\n total_count: secrets.length,\n secrets: secrets.map((s) => ({\n name: s.name,\n created_at: s.created_at,\n updated_at: s.updated_at,\n })),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/secrets/:secret_name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const name = c.req.param(\"secret_name\")!;\n const s = findRepoSecret(gh, repo.id, name);\n if (!s) throw notFoundResponse();\n return c.json({\n name: s.name,\n visibility: s.visibility,\n created_at: s.created_at,\n updated_at: s.updated_at,\n });\n });\n\n app.put(\"/repos/:owner/:repo/actions/secrets/:secret_name\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n await parseJsonBody(c);\n const name = c.req.param(\"secret_name\")!;\n const existing = findRepoSecret(gh, repo.id, name);\n if (existing) {\n gh.secrets.update(existing.id, { visibility: existing.visibility });\n return c.body(null, 204);\n }\n gh.secrets.insert({\n repo_id: repo.id,\n org_id: null,\n name,\n visibility: \"all\",\n } as Omit<GitHubSecret, \"id\" | \"created_at\" | \"updated_at\">);\n return c.body(null, 201);\n });\n\n app.delete(\"/repos/:owner/:repo/actions/secrets/:secret_name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const name = c.req.param(\"secret_name\")!;\n const s = findRepoSecret(gh, repo.id, name);\n if (!s) throw notFoundResponse();\n gh.secrets.delete(s.id);\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/actions/secrets\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n const secrets = listOrgSecrets(gh, org.id).sort((a, b) => a.name.localeCompare(b.name));\n return c.json({\n total_count: secrets.length,\n secrets: secrets.map((s) => ({\n name: s.name,\n created_at: s.created_at,\n updated_at: s.updated_at,\n })),\n });\n });\n\n app.get(\"/orgs/:org/actions/secrets/:secret_name\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n const name = c.req.param(\"secret_name\")!;\n const s = findOrgSecret(gh, org.id, name);\n if (!s) throw notFoundResponse();\n return c.json({\n name: s.name,\n visibility: s.visibility,\n created_at: s.created_at,\n updated_at: s.updated_at,\n });\n });\n\n app.put(\"/orgs/:org/actions/secrets/:secret_name\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n await parseJsonBody(c);\n const name = c.req.param(\"secret_name\")!;\n const existing = findOrgSecret(gh, org.id, name);\n if (existing) {\n gh.secrets.update(existing.id, { visibility: existing.visibility });\n return c.body(null, 204);\n }\n gh.secrets.insert({\n repo_id: null,\n org_id: org.id,\n name,\n visibility: \"all\",\n } as Omit<GitHubSecret, \"id\" | \"created_at\" | \"updated_at\">);\n return c.body(null, 201);\n });\n\n app.delete(\"/orgs/:org/actions/secrets/:secret_name\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n const name = c.req.param(\"secret_name\")!;\n const s = findOrgSecret(gh, org.id, name);\n if (!s) throw notFoundResponse();\n gh.secrets.delete(s.id);\n return c.body(null, 204);\n });\n}\n","import type { RouteContext, WebhookDispatcher } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubCheckRun,\n GitHubCheckSuite,\n GitHubCommit,\n GitHubRepo,\n GitHubUser,\n GitHubCheckAnnotation,\n} from \"../entities.js\";\nimport { formatRepo, formatUser, generateNodeId, lookupRepo, timestamp } from \"../helpers.js\";\nimport { assertRepoRead, assertRepoWrite, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\nconst CONCLUSION_RANK: Record<string, number> = {\n success: 0,\n neutral: 1,\n skipped: 2,\n cancelled: 3,\n timed_out: 4,\n action_required: 5,\n failure: 6,\n};\n\nfunction findCommitInRepo(gh: GitHubStore, repoId: number, shaParam: string): GitHubCommit | undefined {\n const want = shaParam.toLowerCase();\n const list = gh.commits.findBy(\"repo_id\", repoId);\n return list.find((c) => c.sha === shaParam || c.sha.toLowerCase() === want || c.sha.startsWith(shaParam));\n}\n\nfunction resolveRefToHeadSha(gh: GitHubStore, repo: GitHubRepo, refParam: string): string | undefined {\n const commit = findCommitInRepo(gh, repo.id, refParam);\n if (commit) return commit.sha;\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === refParam);\n if (branch) return branch.sha;\n const fullRef = refParam.startsWith(\"refs/\") ? refParam : `refs/heads/${refParam}`;\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (r) return r.sha;\n return undefined;\n}\n\nfunction headBranchForSha(gh: GitHubStore, repo: GitHubRepo, headSha: string): string {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.sha === headSha);\n if (branch) return branch.name;\n return repo.default_branch;\n}\n\nfunction getOrCreateCheckSuite(\n gh: GitHubStore,\n repo: GitHubRepo,\n headSha: string,\n headBranch?: string | null,\n): GitHubCheckSuite {\n const existing = gh.checkSuites.findBy(\"repo_id\", repo.id).find((s) => s.head_sha === headSha);\n if (existing) return existing;\n\n const hb = headBranch?.trim() || headBranchForSha(gh, repo, headSha);\n const row = gh.checkSuites.insert({\n node_id: \"\",\n repo_id: repo.id,\n head_branch: hb,\n head_sha: headSha,\n status: \"queued\",\n conclusion: null,\n before: \"\",\n after: headSha,\n app_id: null,\n } as Omit<GitHubCheckSuite, \"id\" | \"created_at\" | \"updated_at\">);\n gh.checkSuites.update(row.id, { node_id: generateNodeId(\"CheckSuite\", row.id) });\n return gh.checkSuites.get(row.id)!;\n}\n\nfunction worstConclusion(\n conclusions: NonNullable<GitHubCheckRun[\"conclusion\"]>[],\n): NonNullable<GitHubCheckSuite[\"conclusion\"]> {\n let best: NonNullable<GitHubCheckSuite[\"conclusion\"]> = \"success\";\n let rank = -1;\n for (const c of conclusions) {\n const r = CONCLUSION_RANK[c] ?? 3;\n if (r > rank) {\n rank = r;\n best = c;\n }\n }\n return best;\n}\n\nfunction recomputeSuiteFromRuns(runs: GitHubCheckRun[]): {\n status: GitHubCheckSuite[\"status\"];\n conclusion: GitHubCheckSuite[\"conclusion\"];\n} {\n if (runs.length === 0) {\n return { status: \"completed\", conclusion: null };\n }\n const allDone = runs.every((r) => r.status === \"completed\");\n if (allDone) {\n const conclusions = runs.map((r) => r.conclusion).filter((c): c is NonNullable<typeof c> => c != null);\n return {\n status: \"completed\",\n conclusion: conclusions.length ? worstConclusion(conclusions) : null,\n };\n }\n const anyInProgress = runs.some((r) => r.status === \"in_progress\");\n if (anyInProgress) {\n return { status: \"in_progress\", conclusion: null };\n }\n const anyQueued = runs.some((r) => r.status === \"queued\");\n const anyCompleted = runs.some((r) => r.status === \"completed\");\n if (anyCompleted && anyQueued) {\n return { status: \"in_progress\", conclusion: null };\n }\n if (anyQueued) {\n return { status: \"queued\", conclusion: null };\n }\n return { status: \"in_progress\", conclusion: null };\n}\n\nfunction recomputeCheckSuite(gh: GitHubStore, suiteId: number) {\n const suite = gh.checkSuites.get(suiteId);\n if (!suite) return;\n const runs = gh.checkRuns.findBy(\"repo_id\", suite.repo_id).filter((r) => r.check_suite_id === suiteId);\n const { status, conclusion } = recomputeSuiteFromRuns(runs);\n gh.checkSuites.update(suiteId, { status, conclusion });\n}\n\nfunction parseConclusion(raw: unknown): GitHubCheckRun[\"conclusion\"] | undefined {\n if (raw === undefined) return undefined;\n if (raw === null) return null;\n if (typeof raw !== \"string\") throw new ApiError(422, \"Invalid conclusion\");\n const allowed = new Set([\"success\", \"failure\", \"neutral\", \"cancelled\", \"skipped\", \"timed_out\", \"action_required\"]);\n if (!allowed.has(raw)) throw new ApiError(422, \"Invalid conclusion\");\n return raw as GitHubCheckRun[\"conclusion\"];\n}\n\nfunction parseStatus(raw: unknown, fallback: GitHubCheckRun[\"status\"]): GitHubCheckRun[\"status\"] {\n if (raw === undefined || raw === null) return fallback;\n if (raw !== \"queued\" && raw !== \"in_progress\" && raw !== \"completed\") {\n throw new ApiError(422, \"Invalid status\");\n }\n return raw;\n}\n\nfunction normalizeAnnotations(raw: unknown): GitHubCheckAnnotation[] {\n if (raw === undefined || raw === null) return [];\n if (!Array.isArray(raw)) throw new ApiError(422, \"Invalid annotations\");\n const out: GitHubCheckAnnotation[] = [];\n for (const a of raw) {\n if (!a || typeof a !== \"object\") throw new ApiError(422, \"Invalid annotation\");\n const o = a as Record<string, unknown>;\n const path = typeof o.path === \"string\" ? o.path : null;\n const message = typeof o.message === \"string\" ? o.message : null;\n const start_line = typeof o.start_line === \"number\" ? o.start_line : parseInt(String(o.start_line), 10);\n const end_line = typeof o.end_line === \"number\" ? o.end_line : parseInt(String(o.end_line), 10);\n const annotation_level = typeof o.annotation_level === \"string\" ? o.annotation_level : \"notice\";\n if (!path || !message || !Number.isFinite(start_line) || !Number.isFinite(end_line)) {\n throw new ApiError(422, \"Invalid annotation fields\");\n }\n out.push({\n path,\n start_line,\n end_line,\n annotation_level,\n message,\n });\n }\n return out;\n}\n\nfunction formatCheckSuiteBrief(suite: GitHubCheckSuite, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n id: suite.id,\n node_id: suite.node_id,\n head_branch: suite.head_branch,\n head_sha: suite.head_sha,\n url: `${repoUrl}/check-suites/${suite.id}`,\n };\n}\n\nfunction formatRepoBrief(repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const owner = formatRepo(repo, gh, baseUrl).owner;\n return {\n id: repo.id,\n node_id: repo.node_id,\n name: repo.name,\n full_name: repo.full_name,\n private: repo.private,\n owner,\n url: `${baseUrl}/repos/${repo.full_name}`,\n html_url: `${baseUrl}/${repo.full_name}`,\n };\n}\n\nfunction formatCheckRun(run: GitHubCheckRun, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const suite = run.check_suite_id ? gh.checkSuites.get(run.check_suite_id) : null;\n return {\n id: run.id,\n node_id: run.node_id,\n head_sha: run.head_sha,\n name: run.name,\n status: run.status,\n conclusion: run.conclusion,\n started_at: run.started_at,\n completed_at: run.completed_at,\n external_id: run.external_id,\n url: `${repoUrl}/check-runs/${run.id}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${run.head_sha}/checks/${run.id}`,\n details_url: run.details_url,\n output: {\n title: run.output.title,\n summary: run.output.summary,\n text: run.output.text,\n annotations_count: run.output.annotations_count,\n },\n check_suite: suite ? formatCheckSuiteBrief(suite, repo, baseUrl) : null,\n app: null,\n pull_requests: [] as unknown[],\n };\n}\n\nfunction formatCheckSuite(suite: GitHubCheckSuite, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n id: suite.id,\n node_id: suite.node_id,\n head_branch: suite.head_branch,\n head_sha: suite.head_sha,\n status: suite.status,\n conclusion: suite.conclusion,\n url: `${repoUrl}/check-suites/${suite.id}`,\n before: suite.before,\n after: suite.after,\n pull_requests: [],\n app: null,\n repository: formatRepoBrief(repo, gh, baseUrl),\n created_at: suite.created_at,\n updated_at: suite.updated_at,\n };\n}\n\nfunction dispatchCheckRun(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n run: GitHubCheckRun,\n actor: GitHubUser,\n baseUrl: string,\n action: string | undefined,\n) {\n const ownerLogin = ownerLoginOf(gh, repo);\n void webhooks.dispatch(\n \"check_run\",\n action,\n {\n action,\n check_run: formatCheckRun(run, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n}\n\nfunction dispatchCheckSuite(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n suite: GitHubCheckSuite,\n actor: GitHubUser,\n baseUrl: string,\n action: string | undefined,\n) {\n const ownerLogin = ownerLoginOf(gh, repo);\n void webhooks.dispatch(\n \"check_suite\",\n action,\n {\n action,\n check_suite: formatCheckSuite(suite, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n}\n\nexport function checksRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Preferences (static path before :check_suite_id) ---\n app.patch(\"/repos/:owner/:repo/check-suites/preferences\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n const auto =\n Array.isArray(body.auto_trigger_checks) && body.auto_trigger_checks.every((x) => x && typeof x === \"object\")\n ? body.auto_trigger_checks\n : [];\n return c.json({\n preferences: {\n auto_trigger_checks: auto,\n },\n });\n });\n\n app.post(\"/repos/:owner/:repo/check-suites\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (typeof body.head_sha !== \"string\" || !body.head_sha.trim()) {\n throw new ApiError(422, \"head_sha is required\");\n }\n const headSha = body.head_sha.trim();\n const headBranch = typeof body.head_branch === \"string\" && body.head_branch.trim() ? body.head_branch.trim() : null;\n\n const suite = getOrCreateCheckSuite(gh, repo, headSha, headBranch);\n if (headBranch && suite.head_branch !== headBranch) {\n gh.checkSuites.update(suite.id, { head_branch: headBranch });\n }\n const updated = gh.checkSuites.get(suite.id)!;\n dispatchCheckSuite(webhooks, gh, repo, updated, actor, baseUrl, \"requested\");\n return c.json(formatCheckSuite(updated, repo, gh, baseUrl), 201);\n });\n\n app.get(\"/repos/:owner/:repo/check-suites/:check_suite_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const suiteId = parseInt(c.req.param(\"check_suite_id\")!, 10);\n const suite = gh.checkSuites.get(suiteId);\n if (!suite || suite.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatCheckSuite(suite, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/check-suites/:check_suite_id/check-runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const suiteId = parseInt(c.req.param(\"check_suite_id\")!, 10);\n const suite = gh.checkSuites.get(suiteId);\n if (!suite || suite.repo_id !== repo.id) throw notFoundResponse();\n const { page, per_page } = parsePagination(c);\n let runs = gh.checkRuns.findBy(\"repo_id\", repo.id).filter((r) => r.check_suite_id === suiteId);\n runs = runs.sort((a, b) => b.id - a.id);\n const total = runs.length;\n const slice = runs.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n check_runs: slice.map((r) => formatCheckRun(r, repo, gh, baseUrl)),\n });\n });\n\n app.post(\"/repos/:owner/:repo/check-suites/:check_suite_id/rerequest\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const suiteId = parseInt(c.req.param(\"check_suite_id\")!, 10);\n const suite = gh.checkSuites.get(suiteId);\n if (!suite || suite.repo_id !== repo.id) throw notFoundResponse();\n\n const runs = gh.checkRuns.findBy(\"repo_id\", repo.id).filter((r) => r.check_suite_id === suiteId);\n const now = timestamp();\n for (const r of runs) {\n gh.checkRuns.update(r.id, {\n status: \"queued\",\n conclusion: null,\n completed_at: null,\n started_at: null,\n updated_at: now,\n });\n }\n gh.checkSuites.update(suiteId, { status: \"queued\", conclusion: null });\n const suiteAfter = gh.checkSuites.get(suiteId)!;\n dispatchCheckSuite(webhooks, gh, repo, suiteAfter, actor, baseUrl, \"rerequested\");\n return c.body(null, 201);\n });\n\n app.get(\"/repos/:owner/:repo/commits/:ref/check-suites\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const ref = c.req.param(\"ref\")!;\n const headSha = resolveRefToHeadSha(gh, repo, ref);\n if (!headSha) throw notFoundResponse();\n const suites = gh.checkSuites\n .findBy(\"repo_id\", repo.id)\n .filter((s) => s.head_sha === headSha)\n .sort((a, b) => b.id - a.id);\n return c.json({\n total_count: suites.length,\n check_suites: suites.map((s) => formatCheckSuite(s, repo, gh, baseUrl)),\n });\n });\n\n // --- Check runs ---\n app.post(\"/repos/:owner/:repo/check-runs\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n\n if (typeof body.name !== \"string\" || !body.name.trim()) {\n throw new ApiError(422, \"name is required\");\n }\n if (typeof body.head_sha !== \"string\" || !body.head_sha.trim()) {\n throw new ApiError(422, \"head_sha is required\");\n }\n\n const name = body.name.trim();\n const headSha = body.head_sha.trim();\n const status = parseStatus(body.status, \"queued\");\n let conclusion = parseConclusion(body.conclusion);\n if (status === \"completed\" && (conclusion === undefined || conclusion === null)) {\n throw new ApiError(422, \"conclusion is required when status is completed\");\n }\n if (status !== \"completed\") {\n conclusion = null;\n }\n\n const details_url =\n typeof body.details_url === \"string\" || body.details_url === null ? (body.details_url as string | null) : null;\n const external_id =\n typeof body.external_id === \"string\"\n ? body.external_id\n : body.external_id == null\n ? \"\"\n : String(body.external_id);\n\n const started_at =\n body.started_at === undefined\n ? null\n : body.started_at === null\n ? null\n : typeof body.started_at === \"string\"\n ? body.started_at\n : null;\n let completed_at =\n body.completed_at === undefined\n ? null\n : body.completed_at === null\n ? null\n : typeof body.completed_at === \"string\"\n ? body.completed_at\n : null;\n\n if (status === \"completed\" && !completed_at) {\n completed_at = timestamp();\n }\n\n const outRaw = body.output && typeof body.output === \"object\" ? (body.output as Record<string, unknown>) : {};\n const annotations = normalizeAnnotations(outRaw.annotations);\n const output = {\n title: typeof outRaw.title === \"string\" ? outRaw.title : outRaw.title === null ? null : null,\n summary: typeof outRaw.summary === \"string\" ? outRaw.summary : outRaw.summary === null ? null : null,\n text: typeof outRaw.text === \"string\" ? outRaw.text : outRaw.text === null ? null : null,\n annotations_count: annotations.length,\n annotations,\n };\n\n let actions: GitHubCheckRun[\"actions\"] = null;\n if (Array.isArray(body.actions)) {\n actions = [];\n for (const act of body.actions) {\n if (!act || typeof act !== \"object\") continue;\n const a = act as Record<string, unknown>;\n if (typeof a.id === \"string\" && typeof a.label === \"string\" && typeof a.description === \"string\") {\n actions.push({ id: a.id, label: a.label, description: a.description });\n }\n }\n if (actions.length === 0) actions = null;\n }\n\n const suite = getOrCreateCheckSuite(gh, repo, headSha, null);\n\n const row = gh.checkRuns.insert({\n node_id: \"\",\n repo_id: repo.id,\n head_sha: headSha,\n name,\n status,\n conclusion: conclusion ?? null,\n started_at,\n completed_at,\n external_id,\n details_url,\n actions,\n output,\n check_suite_id: suite.id,\n app_id: typeof body.app_id === \"number\" ? body.app_id : null,\n } as Omit<GitHubCheckRun, \"id\" | \"created_at\" | \"updated_at\">);\n gh.checkRuns.update(row.id, { node_id: generateNodeId(\"CheckRun\", row.id) });\n const run = gh.checkRuns.get(row.id)!;\n\n recomputeCheckSuite(gh, suite.id);\n\n dispatchCheckRun(webhooks, gh, repo, run, actor, baseUrl, \"created\");\n return c.json(formatCheckRun(run, repo, gh, baseUrl), 201);\n });\n\n app.patch(\"/repos/:owner/:repo/check-runs/:check_run_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const prev = gh.checkRuns.get(runId);\n if (!prev || prev.repo_id !== repo.id) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n\n const patch: Partial<GitHubCheckRun> = {};\n\n if (body.name !== undefined) {\n if (typeof body.name !== \"string\" || !body.name.trim()) throw new ApiError(422, \"Invalid name\");\n patch.name = body.name.trim();\n }\n if (body.head_sha !== undefined) {\n if (typeof body.head_sha !== \"string\" || !body.head_sha.trim()) throw new ApiError(422, \"Invalid head_sha\");\n patch.head_sha = body.head_sha.trim();\n }\n if (body.status !== undefined) {\n patch.status = parseStatus(body.status, prev.status);\n }\n if (body.conclusion !== undefined) {\n const pc = parseConclusion(body.conclusion);\n patch.conclusion = pc === undefined ? null : pc;\n }\n if (body.details_url !== undefined) {\n patch.details_url =\n typeof body.details_url === \"string\" || body.details_url === null ? (body.details_url as string | null) : null;\n }\n if (body.external_id !== undefined) {\n patch.external_id = typeof body.external_id === \"string\" ? body.external_id : String(body.external_id ?? \"\");\n }\n if (body.started_at !== undefined) {\n patch.started_at = body.started_at === null ? null : typeof body.started_at === \"string\" ? body.started_at : null;\n }\n if (body.completed_at !== undefined) {\n patch.completed_at =\n body.completed_at === null ? null : typeof body.completed_at === \"string\" ? body.completed_at : null;\n }\n if (body.app_id !== undefined) {\n patch.app_id = typeof body.app_id === \"number\" ? body.app_id : null;\n }\n if (body.actions !== undefined) {\n if (body.actions === null) {\n patch.actions = null;\n } else if (Array.isArray(body.actions)) {\n const actions: NonNullable<GitHubCheckRun[\"actions\"]> = [];\n for (const act of body.actions) {\n if (!act || typeof act !== \"object\") continue;\n const a = act as Record<string, unknown>;\n if (typeof a.id === \"string\" && typeof a.label === \"string\" && typeof a.description === \"string\") {\n actions.push({ id: a.id, label: a.label, description: a.description });\n }\n }\n patch.actions = actions.length ? actions : null;\n }\n }\n\n if (body.output !== undefined && body.output !== null && typeof body.output === \"object\") {\n const outRaw = body.output as Record<string, unknown>;\n const annotations = normalizeAnnotations(outRaw.annotations);\n patch.output = {\n title: outRaw.title === undefined ? prev.output.title : typeof outRaw.title === \"string\" ? outRaw.title : null,\n summary:\n outRaw.summary === undefined\n ? prev.output.summary\n : typeof outRaw.summary === \"string\"\n ? outRaw.summary\n : null,\n text: outRaw.text === undefined ? prev.output.text : typeof outRaw.text === \"string\" ? outRaw.text : null,\n annotations_count: annotations.length,\n annotations,\n };\n }\n\n const nextStatus = patch.status ?? prev.status;\n const nextConclusion: GitHubCheckRun[\"conclusion\"] =\n patch.conclusion !== undefined ? patch.conclusion : prev.conclusion;\n\n if (patch.head_sha && patch.head_sha !== prev.head_sha) {\n const newSuite = getOrCreateCheckSuite(gh, repo, patch.head_sha, null);\n patch.check_suite_id = newSuite.id;\n }\n\n if (nextStatus === \"completed\") {\n if (nextConclusion === undefined || nextConclusion === null) {\n throw new ApiError(422, \"conclusion is required when status is completed\");\n }\n patch.conclusion = nextConclusion;\n const nextCompleted = patch.completed_at !== undefined ? patch.completed_at : prev.completed_at;\n if (!nextCompleted) {\n patch.completed_at = timestamp();\n }\n } else {\n patch.conclusion = null;\n patch.completed_at = null;\n }\n\n gh.checkRuns.update(runId, patch);\n const run = gh.checkRuns.get(runId)!;\n\n if (run.check_suite_id) {\n recomputeCheckSuite(gh, run.check_suite_id);\n }\n\n if (prev.status !== \"completed\" && run.status === \"completed\") {\n dispatchCheckRun(webhooks, gh, repo, run, actor, baseUrl, \"completed\");\n }\n\n return c.json(formatCheckRun(run, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/check-runs/:check_run_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const run = gh.checkRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatCheckRun(run, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/check-runs/:check_run_id/annotations\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const run = gh.checkRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const annotations = run.output.annotations;\n const total = annotations.length;\n const slice = annotations.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const check_annotations = slice.map((a, i) => ({\n path: a.path,\n blob_href: `${baseUrl}/${repo.full_name}/blob/${run.head_sha}/${a.path}`,\n start_line: a.start_line,\n end_line: a.end_line,\n message: a.message,\n title: null as string | null,\n raw_details: null as string | null,\n start_column: null as number | null,\n end_column: null as number | null,\n annotation_level: a.annotation_level,\n id: (page - 1) * per_page + i + 1,\n }));\n\n return c.json({\n total_count: total,\n check_annotations,\n });\n });\n\n app.post(\"/repos/:owner/:repo/check-runs/:check_run_id/rerequest\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const prev = gh.checkRuns.get(runId);\n if (!prev || prev.repo_id !== repo.id) throw notFoundResponse();\n\n const now = timestamp();\n gh.checkRuns.update(runId, {\n status: \"queued\",\n conclusion: null,\n completed_at: null,\n started_at: null,\n updated_at: now,\n });\n const run = gh.checkRuns.get(runId)!;\n if (run.check_suite_id) {\n recomputeCheckSuite(gh, run.check_suite_id);\n }\n dispatchCheckRun(webhooks, gh, repo, run, actor, baseUrl, \"rerequested\");\n return c.body(null, 201);\n });\n\n app.get(\"/repos/:owner/:repo/commits/:ref/check-runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const ref = c.req.param(\"ref\")!;\n const headSha = resolveRefToHeadSha(gh, repo, ref);\n if (!headSha) throw notFoundResponse();\n\n const check_name = c.req.query(\"check_name\")?.trim();\n const statusQ = c.req.query(\"status\")?.trim() as GitHubCheckRun[\"status\"] | undefined;\n const filter = (c.req.query(\"filter\") ?? \"latest\").toLowerCase();\n\n let runs = gh.checkRuns.findBy(\"repo_id\", repo.id).filter((r) => r.head_sha === headSha);\n if (check_name) {\n runs = runs.filter((r) => r.name === check_name);\n }\n if (statusQ && (statusQ === \"queued\" || statusQ === \"in_progress\" || statusQ === \"completed\")) {\n runs = runs.filter((r) => r.status === statusQ);\n }\n\n runs = runs.sort((a, b) => b.id - a.id);\n\n if (filter === \"latest\") {\n const byName = new Map<string, GitHubCheckRun>();\n for (const r of runs.sort((a, b) => a.id - b.id)) {\n byName.set(r.name, r);\n }\n runs = [...byName.values()].sort((a, b) => b.id - a.id);\n }\n\n return c.json({\n total_count: runs.length,\n check_runs: runs.map((r) => formatCheckRun(r, repo, gh, baseUrl)),\n });\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\n\nexport function rateLimitRoutes({ app }: RouteContext): void {\n app.get(\"/rate_limit\", (c) => {\n const now = Math.floor(Date.now() / 1000);\n const reset = now + 3600;\n const rateLimit = {\n limit: 5000,\n remaining: 4999,\n reset,\n used: 1,\n resource: \"core\",\n };\n\n return c.json({\n resources: {\n core: rateLimit,\n search: { limit: 30, remaining: 29, reset, used: 1, resource: \"search\" },\n graphql: { limit: 5000, remaining: 4999, reset, used: 1, resource: \"graphql\" },\n integration_manifest: { limit: 5000, remaining: 4999, reset, used: 1, resource: \"integration_manifest\" },\n source_import: { limit: 100, remaining: 99, reset, used: 1, resource: \"source_import\" },\n code_scanning_upload: { limit: 500, remaining: 499, reset, used: 1, resource: \"code_scanning_upload\" },\n actions_runner_registration: {\n limit: 10000,\n remaining: 9999,\n reset,\n used: 1,\n resource: \"actions_runner_registration\",\n },\n scim: { limit: 15000, remaining: 14999, reset, used: 1, resource: \"scim\" },\n },\n rate: rateLimit,\n });\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\n\nexport function metaRoutes({ app, baseUrl }: RouteContext): void {\n app.get(\"/meta\", (c) => {\n return c.json({\n verifiable_password_authentication: true,\n ssh_key_fingerprints: {\n SHA256_RSA: \"placeholder\",\n SHA256_DSA: \"placeholder\",\n SHA256_ECDSA: \"placeholder\",\n SHA256_ED25519: \"placeholder\",\n },\n ssh_keys: [\"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPlaceholder\"],\n hooks: [\"127.0.0.1/32\"],\n web: [\"127.0.0.1/32\"],\n api: [\"127.0.0.1/32\"],\n git: [\"127.0.0.1/32\"],\n github_enterprise_importer: [\"127.0.0.1/32\"],\n packages: [\"127.0.0.1/32\"],\n pages: [\"127.0.0.1/32\"],\n importer: [\"127.0.0.1/32\"],\n actions: [\"127.0.0.1/32\"],\n actions_macos: [\"127.0.0.1/32\"],\n dependabot: [\"127.0.0.1/32\"],\n copilot: [\"127.0.0.1/32\"],\n domains: {\n website: [\"localhost\"],\n codespaces: [\"localhost\"],\n copilot: [\"localhost\"],\n packages: [\"localhost\"],\n actions: [\"localhost\"],\n artifact_attestations: { trust_domain: \"localhost\" },\n },\n });\n });\n\n app.get(\"/octocat\", (c) => {\n const say = c.req.query(\"s\") ?? \"emulate says hello!\";\n const art = `\n MMM. .MMM\n MMMMMMMMMMMMMMMMMMM\n MMMMMMMMMMMMMMMMMMM ____________________________\n MMMMMMMMMMMMMMMMMMMMM | |\n MMMMMMMMMMMMMMMMMMMMMMM | ${say.padEnd(26)} |\n MMMMMMMMMMMMMMMMMMMMMMMM |_ ________________________|\n MMMM::- -:::::::- -::MMMM |/\n MM~:~ 00~:::::~ 00~:~MM\n .. .. :~M]:[~:M. . ..\n .MM. ~MM. MM~ .MM.\n MMMM. ~MM:~MM~ .MMMM\n MMMMMM. ~MMMMMMMM~ .MMMMMM\n MMMMMMMMMMMMMMMMMMMMMMMMMMMM\n .MMMMMMMMMMMMMMMMMMMMMM.\n MMMMMMMMMMMMMMMMMM\n ;MMMMMMMMMMMMMMM;\n :MMMMMMMMMMMM:\n .MMMMMMMMMMM.\n MMMMMMMMMMM\n MMMMMMMMM\n MMMMMMM\n MMMMM\n MMM\n M\n`;\n c.header(\"Content-Type\", \"application/octocat-stream\");\n return c.text(art.trim());\n });\n\n app.get(\"/emojis\", (c) => {\n return c.json({\n \"+1\": `${baseUrl}/emojis/+1.png`,\n \"-1\": `${baseUrl}/emojis/-1.png`,\n \"100\": `${baseUrl}/emojis/100.png`,\n tada: `${baseUrl}/emojis/tada.png`,\n rocket: `${baseUrl}/emojis/rocket.png`,\n heart: `${baseUrl}/emojis/heart.png`,\n eyes: `${baseUrl}/emojis/eyes.png`,\n thinking: `${baseUrl}/emojis/thinking.png`,\n thumbsup: `${baseUrl}/emojis/thumbsup.png`,\n thumbsdown: `${baseUrl}/emojis/thumbsdown.png`,\n });\n });\n\n app.get(\"/zen\", (c) => {\n const phrases = [\n \"Non-blocking is better than blocking.\",\n \"Design for failure.\",\n \"Half measures are as bad as nothing at all.\",\n \"Encourage flow.\",\n \"Anything added dilutes everything else.\",\n \"Approachable is better than simple.\",\n \"Mind your words, they are important.\",\n \"Speak like a human.\",\n \"It's not fully shipped until it's fast.\",\n \"Responsive is better than fast.\",\n \"Keep it logically awesome.\",\n \"Favor focus over features.\",\n \"Avoid administrative distraction.\",\n ];\n return c.text(phrases[Math.floor(Math.random() * phrases.length)]);\n });\n\n app.get(\"/versions\", (c) => {\n return c.json([\"2022-11-28\", \"2022-08-09\"]);\n });\n}\n","import { randomBytes } from \"crypto\";\nimport type { Context } from \"hono\";\nimport type { RouteContext, Store, AuthUser, AppEnv } from \"@emulators/core\";\nimport {\n unauthorized,\n escapeHtml,\n escapeAttr,\n renderCardPage,\n renderErrorPage,\n renderSettingsPage,\n renderUserButton,\n matchesRedirectUri,\n constantTimeSecretEqual,\n parseCookies,\n debug,\n} from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport { formatUser, formatUserFull } from \"../helpers.js\";\n\ntype PendingCode = {\n login: string;\n scope: string;\n redirectUri: string;\n clientId: string;\n created_at: number;\n};\n\nconst PENDING_CODE_TTL_MS = 10 * 60 * 1000;\n\nfunction getPendingCodes(store: Store): Map<string, PendingCode> {\n let map = store.getData<Map<string, PendingCode>>(\"github.oauth.pendingCodes\");\n if (!map) {\n map = new Map();\n store.setData(\"github.oauth.pendingCodes\", map);\n }\n return map;\n}\n\nfunction getTokenToClientId(store: Store): Map<string, string> {\n let map = store.getData<Map<string, string>>(\"github.oauth.tokenToClientId\");\n if (!map) {\n map = new Map();\n store.setData(\"github.oauth.tokenToClientId\", map);\n }\n return map;\n}\n\nfunction getSessionMap(store: Store): Map<string, string> {\n let map = store.getData<Map<string, string>>(\"github.oauth.sessionMap\");\n if (!map) {\n map = new Map();\n store.setData(\"github.oauth.sessionMap\", map);\n }\n return map;\n}\n\n/** On read: drops entries older than {@link PENDING_CODE_TTL_MS}. */\nfunction getPendingCodeIfValid(store: Store, code: string): PendingCode | undefined {\n const map = getPendingCodes(store);\n const pending = map.get(code);\n if (!pending) return undefined;\n if (Date.now() - pending.created_at > PENDING_CODE_TTL_MS) {\n map.delete(code);\n return undefined;\n }\n return pending;\n}\n\nconst SERVICE_LABEL = \"GitHub\";\n\nexport function oauthRoutes({ app, store, baseUrl, tokenMap }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n function resolveSessionUser(c: Context<AppEnv>): { login: string; id: number } | null {\n const authUser = c.get(\"authUser\") as AuthUser | undefined;\n if (authUser) {\n const user = gh.users.findOneBy(\"login\", authUser.login);\n if (user) return { login: user.login, id: user.id };\n }\n const cookieHeader = c.req.header(\"Cookie\") ?? \"\";\n const cookies = parseCookies(cookieHeader);\n const sessionId = cookies[\"_emu_session\"];\n if (sessionId) {\n const login = getSessionMap(store).get(sessionId);\n if (login) {\n const user = gh.users.findOneBy(\"login\", login);\n if (user) return { login: user.login, id: user.id };\n }\n }\n return null;\n }\n\n // ---------- OAuth authorize page ----------\n\n app.get(\"/login/oauth/authorize\", (c) => {\n const client_id = c.req.query(\"client_id\") ?? \"\";\n const redirect_uri = c.req.query(\"redirect_uri\") ?? \"\";\n const scope = c.req.query(\"scope\") ?? \"\";\n const state = c.req.query(\"state\") ?? \"\";\n\n const oauthAppsConfigured = gh.oauthApps.all().length > 0;\n let oauthAppForSubtitle: { name: string } | undefined;\n if (oauthAppsConfigured) {\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", client_id);\n if (!oauthApp) {\n return c.html(\n renderErrorPage(\"Application not found\", `The client_id '${client_id}' is not registered.`, SERVICE_LABEL),\n 400,\n );\n }\n if (redirect_uri && !matchesRedirectUri(redirect_uri, oauthApp.redirect_uris)) {\n console.warn(\n `[OAuth] redirect_uri mismatch: got \"${redirect_uri}\", registered: ${JSON.stringify(oauthApp.redirect_uris)}`,\n );\n return c.html(\n renderErrorPage(\n \"Redirect URI mismatch\",\n \"The redirect_uri is not registered for this application.\",\n SERVICE_LABEL,\n ),\n 400,\n );\n }\n oauthAppForSubtitle = oauthApp;\n }\n\n const users = [...gh.users.all()].sort((a, b) => a.login.localeCompare(b.login));\n\n const subtitleText = oauthAppForSubtitle\n ? `Authorize <strong>${escapeHtml(oauthAppForSubtitle.name)}</strong> to access your account.`\n : \"Choose a seeded user to authorize this application.\";\n\n const userButtons = users\n .map((u) => {\n const brief = formatUser(u, baseUrl);\n const full = formatUserFull(u, baseUrl);\n return renderUserButton({\n letter: (brief.login[0] ?? \"?\").toUpperCase(),\n login: full.login,\n name: full.name ?? undefined,\n email: full.email ?? undefined,\n formAction: \"/login/oauth/callback\",\n hiddenFields: {\n login: u.login,\n redirect_uri,\n scope,\n state,\n client_id,\n },\n });\n })\n .join(\"\\n\");\n\n const body = users.length === 0 ? '<p class=\"empty\">No users in the emulator store.</p>' : userButtons;\n\n return c.html(renderCardPage(\"Sign in to GitHub\", subtitleText, body, SERVICE_LABEL));\n });\n\n // ---------- OAuth callback (user selection) ----------\n\n app.post(\"/login/oauth/callback\", async (c) => {\n const body = (await c.req.parseBody()) as Record<string, string>;\n const login = String(body.login ?? \"\");\n const redirect_uri = String(body.redirect_uri ?? \"\");\n const scope = String(body.scope ?? \"\");\n const state = String(body.state ?? \"\");\n const client_id = String(body.client_id ?? \"\");\n\n const code = randomBytes(20).toString(\"hex\");\n getPendingCodes(store).set(code, {\n login,\n scope,\n redirectUri: redirect_uri,\n clientId: client_id,\n created_at: Date.now(),\n });\n\n debug(\n \"github.oauth\",\n `[OAuth callback] generated code: ${code.slice(0, 8)}... for login=${login}, pendingCodes size: ${getPendingCodes(store).size}`,\n );\n\n const sessionId = randomBytes(24).toString(\"base64url\");\n getSessionMap(store).set(sessionId, login);\n c.header(\"Set-Cookie\", `_emu_session=${sessionId}; Path=/; HttpOnly; SameSite=Lax`);\n\n const sep = redirect_uri.includes(\"?\") ? \"&\" : \"?\";\n const target = `${redirect_uri}${sep}code=${encodeURIComponent(code)}&state=${encodeURIComponent(state)}`;\n debug(\"github.oauth\", `[OAuth callback] redirecting to: ${target.slice(0, 120)}...`);\n return c.redirect(target, 302);\n });\n\n // ---------- Token exchange ----------\n\n app.post(\"/login/oauth/access_token\", async (c) => {\n const contentType = c.req.header(\"Content-Type\") ?? \"\";\n const accept = c.req.header(\"Accept\") ?? \"\";\n debug(\"github.oauth\", `[OAuth token] Content-Type: ${contentType}`);\n debug(\"github.oauth\", `[OAuth token] Accept: ${accept}`);\n debug(\"github.oauth\", `[OAuth token] pendingCodes size: ${getPendingCodes(store).size}`);\n debug(\n \"github.oauth\",\n `[OAuth token] pendingCodes keys: ${[...getPendingCodes(store).keys()].map((k) => k.slice(0, 8) + \"...\").join(\", \")}`,\n );\n\n const rawText = await c.req.text();\n debug(\"github.oauth\", `[OAuth token] raw body: ${rawText.slice(0, 500)}`);\n\n let raw: Record<string, unknown>;\n if (contentType.includes(\"application/json\")) {\n try {\n raw = JSON.parse(rawText);\n } catch {\n raw = {};\n }\n } else {\n raw = Object.fromEntries(new URLSearchParams(rawText));\n }\n\n debug(\"github.oauth\", `[OAuth token] parsed keys: ${Object.keys(raw).join(\", \")}`);\n\n const code = String(raw.code ?? \"\");\n const bodyClientId = String(raw.client_id ?? \"\");\n const bodyClientSecret = String(raw.client_secret ?? \"\").slice(0, 4) + \"****\";\n\n debug(\"github.oauth\", `[OAuth token] code: ${code.slice(0, 8)}... (len=${code.length})`);\n debug(\"github.oauth\", `[OAuth token] client_id: ${bodyClientId}`);\n debug(\"github.oauth\", `[OAuth token] client_secret: ${bodyClientSecret}`);\n\n const actualSecret = String(raw.client_secret ?? \"\");\n\n const incorrectClientCredentials = () => {\n debug(\"github.oauth\", `[OAuth token] REJECTED: incorrect_client_credentials`);\n return c.json(\n {\n error: \"incorrect_client_credentials\",\n error_description: \"The client_id and/or client_secret passed are incorrect.\",\n },\n 200,\n );\n };\n\n const oauthAppsConfigured = gh.oauthApps.all().length > 0;\n if (oauthAppsConfigured) {\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", bodyClientId);\n if (!oauthApp) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: client_id not found in oauthApps`);\n return incorrectClientCredentials();\n }\n if (!constantTimeSecretEqual(actualSecret, oauthApp.client_secret)) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: client_secret mismatch`);\n return incorrectClientCredentials();\n }\n debug(\"github.oauth\", `[OAuth token] client credentials OK (app: ${oauthApp.name})`);\n } else {\n debug(\"github.oauth\", `[OAuth token] no oauth apps configured, skipping client validation`);\n }\n\n const pending = getPendingCodeIfValid(store, code);\n if (!pending) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: code not found in pendingCodes or expired`);\n return c.json(\n { error: \"bad_verification_code\", error_description: \"The code passed is incorrect or expired.\" },\n 200,\n );\n }\n\n debug(\"github.oauth\", `[OAuth token] code valid, login=${pending.login}, scope=${pending.scope}`);\n getPendingCodes(store).delete(code);\n\n const user = gh.users.findOneBy(\"login\", pending.login);\n if (!user) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: user \"${pending.login}\" not found in store`);\n return c.json(\n { error: \"bad_verification_code\", error_description: \"The code passed is incorrect or expired.\" },\n 200,\n );\n }\n\n const token = \"gho_\" + randomBytes(20).toString(\"base64url\");\n const scopes = pending.scope ? pending.scope.split(/[,\\s]+/).filter(Boolean) : [\"repo\", \"user\"];\n\n if (tokenMap) {\n tokenMap.set(token, { login: user.login, id: user.id, scopes });\n }\n\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", pending.clientId);\n if (oauthApp) {\n const existingGrant = gh.oauthGrants.all().find((g) => g.user_id === user.id && g.client_id === pending.clientId);\n const orgAccess: Record<string, \"granted\" | \"denied\" | \"requested\"> = {};\n for (const org of gh.orgs.all()) {\n const isMember = gh.teamMembers\n .all()\n .some((tm) => tm.user_id === user.id && gh.teams.get(tm.team_id)?.org_id === org.id);\n if (isMember) orgAccess[org.login] = \"granted\";\n }\n\n if (existingGrant) {\n gh.oauthGrants.update(existingGrant.id, { scopes, org_access: orgAccess });\n } else {\n gh.oauthGrants.insert({\n user_id: user.id,\n oauth_app_id: oauthApp.id,\n client_id: pending.clientId,\n scopes,\n org_access: orgAccess,\n });\n }\n getTokenToClientId(store).set(token, pending.clientId);\n }\n\n debug(\"github.oauth\", `[OAuth token] SUCCESS: issued token for ${user.login} (scopes: ${scopes.join(\",\")})`);\n\n const wantsFormEncoded = accept.includes(\"application/x-www-form-urlencoded\");\n const scopeOut = pending.scope;\n\n if (wantsFormEncoded) {\n const formBody = `access_token=${encodeURIComponent(token)}&token_type=bearer&scope=${encodeURIComponent(scopeOut)}`;\n c.header(\"Content-Type\", \"application/x-www-form-urlencoded\");\n return c.body(formBody, 200);\n }\n\n return c.json({\n access_token: token,\n token_type: \"bearer\",\n scope: scopeOut,\n });\n });\n\n // ---------- User emails ----------\n\n app.get(\"/user/emails\", (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n throw unauthorized();\n }\n const user = gh.users.findOneBy(\"login\", authUser.login);\n if (!user) {\n throw unauthorized();\n }\n const email = user.email || `${user.login}@users.noreply.localhost`;\n return c.json([\n {\n email,\n primary: true,\n verified: true,\n visibility: \"public\",\n },\n ]);\n });\n\n // ---------- Settings: list authorized apps ----------\n\n const SCOPE_LABELS: Record<string, string> = {\n repo: \"Full control of private repositories\",\n \"read:user\": \"Read all user profile data\",\n \"user:email\": \"Access user email addresses (read-only)\",\n user: \"Full control of user profile\",\n workflow: \"Update GitHub action workflows\",\n \"admin:org\": \"Full control of orgs and teams\",\n \"admin:repo_hook\": \"Full control of repository hooks\",\n \"read:org\": \"Read org and team membership\",\n \"write:repo_hook\": \"Write repository hooks\",\n \"read:repo_hook\": \"Read repository hooks\",\n delete_repo: \"Delete repositories\",\n gist: \"Create gists\",\n notifications: \"Access notifications\",\n \"write:packages\": \"Upload packages\",\n \"read:packages\": \"Download packages\",\n \"admin:gpg_key\": \"Full control of GPG keys\",\n \"admin:public_key\": \"Full control of public keys\",\n };\n\n function scopeLabel(scope: string): string {\n return SCOPE_LABELS[scope] ?? scope;\n }\n\n const sidebarHtml = `\n <a href=\"/settings/applications\" class=\"active\">Authorized Apps</a>`;\n\n app.get(\"/settings/applications\", (c) => {\n const sessionUser = resolveSessionUser(c);\n if (!sessionUser) {\n return c.html(\n renderErrorPage(\"Unauthorized\", \"You must be authenticated to view this page.\", SERVICE_LABEL),\n 401,\n );\n }\n\n const grants = gh.oauthGrants.findBy(\"user_id\", sessionUser.id);\n\n let bodyHtml: string;\n if (grants.length === 0) {\n bodyHtml = `\n <div class=\"section-heading\">Authorized OAuth Apps</div>\n <div class=\"s-card\">\n <p class=\"empty\">No authorized applications. Apps you authorize will appear here.</p>\n </div>`;\n } else {\n const appLinks = grants\n .map((grant) => {\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", grant.client_id);\n const name = oauthApp?.name ?? grant.client_id;\n const letter = escapeHtml((name[0] ?? \"?\").toUpperCase());\n const scopeText = grant.scopes.length > 0 ? grant.scopes.join(\", \") : \"No scopes\";\n return `<a href=\"/settings/connections/applications/${escapeAttr(grant.client_id)}\" class=\"app-link\">\n <div class=\"s-icon\">${letter}</div>\n <div>\n <div class=\"app-link-name\">${escapeHtml(name)}</div>\n <div class=\"app-link-scopes\">${escapeHtml(scopeText)}</div>\n </div>\n </a>`;\n })\n .join(\"\\n\");\n\n bodyHtml = `\n <div class=\"section-heading\">Authorized OAuth Apps</div>\n <div class=\"s-card\">${appLinks}</div>`;\n }\n\n return c.html(renderSettingsPage(\"Authorized OAuth Apps\", sidebarHtml, bodyHtml, SERVICE_LABEL));\n });\n\n // ---------- Settings: app detail ----------\n\n app.get(\"/settings/connections/applications/:client_id\", (c) => {\n const sessionUser = resolveSessionUser(c);\n if (!sessionUser) {\n return c.html(\n renderErrorPage(\"Unauthorized\", \"You must be authenticated to view this page.\", SERVICE_LABEL),\n 401,\n );\n }\n\n const clientId = c.req.param(\"client_id\");\n\n const grant = gh.oauthGrants.all().find((g) => g.user_id === sessionUser.id && g.client_id === clientId);\n if (!grant) {\n return c.html(renderErrorPage(\"Not Found\", \"No authorization found for this application.\", SERVICE_LABEL), 404);\n }\n\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", clientId);\n const appName = oauthApp?.name ?? clientId;\n const appLetter = escapeHtml((appName[0] ?? \"?\").toUpperCase());\n const lastUsed = new Date(grant.updated_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n const permRows = grant.scopes\n .map((s) => `<li><span class=\"check\">&#10003;</span> ${escapeHtml(scopeLabel(s))}</li>`)\n .join(\"\\n\");\n\n const orgRows = Object.entries(grant.org_access)\n .map(([org, status]) => {\n const letter = escapeHtml((org[0] ?? \"?\").toUpperCase());\n const badgeClass =\n status === \"granted\" ? \"badge-granted\" : status === \"denied\" ? \"badge-denied\" : \"badge-requested\";\n const icon = status === \"granted\" ? \"&#10003;\" : status === \"denied\" ? \"&#10007;\" : \"&#8943;\";\n return `<div class=\"org-row\">\n <div class=\"org-icon\">${letter}</div>\n <span class=\"org-name\">${escapeHtml(org)}</span>\n <span class=\"badge ${badgeClass}\">${icon}</span>\n </div>`;\n })\n .join(\"\\n\");\n\n const bodyHtml = `\n <div class=\"s-card\">\n <div class=\"s-card-header\">\n <div class=\"s-icon\">${appLetter}</div>\n <div>\n <div class=\"s-title\">${escapeHtml(appName)}</div>\n <div class=\"s-subtitle\">Last used: ${escapeHtml(lastUsed)}</div>\n </div>\n </div>\n </div>\n\n <div class=\"s-card\">\n <div class=\"section-heading\">\n <span>Permissions</span>\n <form method=\"post\" action=\"/settings/connections/applications/${escapeAttr(clientId)}/revoke\" style=\"display:inline\">\n <button type=\"submit\" class=\"btn-revoke\">Revoke access</button>\n </form>\n </div>\n <ul class=\"perm-list\">\n ${permRows || '<li style=\"color:#1a8c00\">No specific permissions granted.</li>'}\n </ul>\n </div>\n\n ${\n orgRows\n ? `<div class=\"s-card\">\n <div class=\"section-heading\">Organization access</div>\n ${orgRows}\n <p class=\"info-text\">Applications act on your behalf. Organizations control which apps may access their private data.</p>\n </div>`\n : \"\"\n }`;\n\n return c.html(renderSettingsPage(appName, sidebarHtml, bodyHtml, SERVICE_LABEL));\n });\n\n // ---------- Settings: revoke ----------\n\n app.post(\"/settings/connections/applications/:client_id/revoke\", (c) => {\n const sessionUser = resolveSessionUser(c);\n if (!sessionUser) {\n return c.html(\n renderErrorPage(\"Unauthorized\", \"You must be authenticated to perform this action.\", SERVICE_LABEL),\n 401,\n );\n }\n\n const clientId = c.req.param(\"client_id\");\n\n const grant = gh.oauthGrants.all().find((g) => g.user_id === sessionUser.id && g.client_id === clientId);\n if (grant) {\n gh.oauthGrants.delete(grant.id);\n }\n\n if (tokenMap) {\n for (const [token, tokenUser] of tokenMap.entries()) {\n if (tokenUser.login === sessionUser.login && getTokenToClientId(store).get(token) === clientId) {\n tokenMap.delete(token);\n getTokenToClientId(store).delete(token);\n }\n }\n }\n\n return c.redirect(\"/settings/applications\", 302);\n });\n}\n","import { randomBytes } from \"crypto\";\nimport type { RouteContext, AuthApp } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport { generateNodeId } from \"../helpers.js\";\n\nexport function appsRoutes({ app, store, baseUrl, tokenMap }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n function requireApp(c: any): AuthApp | null {\n const authApp = c.get(\"authApp\") as AuthApp | undefined;\n if (!authApp) {\n c.status(401);\n return null;\n }\n return authApp;\n }\n\n app.get(\"/app\", (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n },\n 401,\n );\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === authApp.appId);\n if (!ghApp) {\n return c.json({ message: \"Not Found\" }, 404);\n }\n\n const installations = gh.appInstallations.findBy(\"app_id\", ghApp.app_id);\n\n return c.json({\n id: ghApp.app_id,\n slug: ghApp.slug,\n node_id: generateNodeId(\"App\", ghApp.app_id),\n name: ghApp.name,\n description: ghApp.description,\n external_url: `${baseUrl}/apps/${ghApp.slug}`,\n html_url: `${baseUrl}/apps/${ghApp.slug}`,\n created_at: ghApp.created_at,\n updated_at: ghApp.updated_at,\n permissions: ghApp.permissions,\n events: ghApp.events,\n installations_count: installations.length,\n owner: null,\n });\n });\n\n app.get(\"/app/installations\", (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n },\n 401,\n );\n }\n\n const installations = gh.appInstallations.findBy(\"app_id\", authApp.appId);\n const ghApp = gh.apps.all().find((a) => a.app_id === authApp.appId);\n\n return c.json(installations.map((inst) => formatInstallation(inst, ghApp, baseUrl)));\n });\n\n app.get(\"/app/installations/:installation_id\", (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n },\n 401,\n );\n }\n\n const installationId = parseInt(c.req.param(\"installation_id\"), 10);\n const inst = gh.appInstallations\n .all()\n .find((i) => i.installation_id === installationId && i.app_id === authApp.appId);\n\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === authApp.appId);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n });\n\n app.post(\"/app/installations/:installation_id/access_tokens\", async (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n },\n 401,\n );\n }\n\n const installationId = parseInt(c.req.param(\"installation_id\"), 10);\n const inst = gh.appInstallations\n .all()\n .find((i) => i.installation_id === installationId && i.app_id === authApp.appId);\n\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n let requestedPermissions = inst.permissions;\n let requestedRepoIds = inst.repository_ids;\n\n try {\n const body = (await c.req.json()) as Record<string, unknown>;\n if (body.permissions && typeof body.permissions === \"object\") {\n requestedPermissions = body.permissions as Record<string, string>;\n }\n if (Array.isArray(body.repository_ids)) {\n requestedRepoIds = (body.repository_ids as number[]).filter(\n (id) => inst.repository_selection === \"all\" || inst.repository_ids.includes(id),\n );\n }\n } catch {\n // No body or invalid JSON, use installation defaults\n }\n\n const token = \"ghs_\" + randomBytes(20).toString(\"base64url\");\n const expiresAt = new Date(Date.now() + 60 * 60 * 1000).toISOString();\n\n if (tokenMap) {\n tokenMap.set(token, {\n login: inst.account_login,\n id: inst.account_id,\n scopes: Object.entries(requestedPermissions).map(([k, v]) => `${k}:${v}`),\n });\n }\n\n const repos = requestedRepoIds\n .map((id) => gh.repos.get(id))\n .filter(Boolean)\n .map((r) => ({\n id: r!.id,\n node_id: r!.node_id,\n name: r!.name,\n full_name: r!.full_name,\n private: r!.private,\n }));\n\n return c.json(\n {\n token,\n expires_at: expiresAt,\n permissions: requestedPermissions,\n repository_selection: inst.repository_selection,\n ...(inst.repository_selection === \"selected\" ? { repositories: repos } : {}),\n },\n 201,\n );\n });\n\n app.get(\"/repos/:owner/:repo/installation\", (c) => {\n const owner = c.req.param(\"owner\");\n const repoName = c.req.param(\"repo\");\n const fullName = `${owner}/${repoName}`;\n const repo = gh.repos.findOneBy(\"full_name\", fullName);\n if (!repo) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ownerEntity = gh.users.findOneBy(\"login\", owner) ?? gh.orgs.findOneBy(\"login\", owner);\n\n for (const inst of gh.appInstallations.all()) {\n if (inst.repository_selection === \"all\" && ownerEntity && inst.account_id === ownerEntity.id) {\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n }\n if (inst.repository_selection === \"selected\" && inst.repository_ids.includes(repo.id)) {\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n }\n }\n\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n });\n\n app.get(\"/orgs/:org/installation\", (c) => {\n const orgLogin = c.req.param(\"org\");\n const org = gh.orgs.findOneBy(\"login\", orgLogin);\n if (!org) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const inst = gh.appInstallations.all().find((i) => i.account_id === org.id && i.account_type === \"Organization\");\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n });\n\n app.get(\"/users/:username/installation\", (c) => {\n const username = c.req.param(\"username\");\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const inst = gh.appInstallations.all().find((i) => i.account_id === user.id && i.account_type === \"User\");\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n });\n\n function formatInstallation(inst: any, ghApp: any, baseUrl: string) {\n const account = inst.account_type === \"Organization\" ? gh.orgs.get(inst.account_id) : gh.users.get(inst.account_id);\n\n return {\n id: inst.installation_id,\n account: account\n ? {\n login: account.login,\n id: account.id,\n node_id: account.node_id,\n type: inst.account_type,\n avatar_url: `${baseUrl}/avatars/u/${account.login}`,\n url: `${baseUrl}/${inst.account_type === \"Organization\" ? \"orgs\" : \"users\"}/${account.login}`,\n }\n : null,\n repository_selection: inst.repository_selection,\n access_tokens_url: `${baseUrl}/app/installations/${inst.installation_id}/access_tokens`,\n repositories_url: `${baseUrl}/installation/repositories`,\n html_url: `${baseUrl}/settings/installations/${inst.installation_id}`,\n app_id: inst.app_id,\n app_slug: ghApp?.slug ?? null,\n target_type: inst.account_type,\n permissions: inst.permissions,\n events: inst.events,\n created_at: inst.created_at,\n updated_at: inst.updated_at,\n single_file_name: null,\n has_multiple_single_files: false,\n single_file_paths: [],\n suspended_by: null,\n suspended_at: inst.suspended_at,\n };\n }\n}\n"],"mappings":"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","names":["ownerLogin","ownerLogin","c","ownerLogin","adjustRepoOpenIssues","head","ownerLogin","lookupUserByLogin","findPull","ownerLogin","findPull","adjustPrReviewCommentCount","sortComments","parseCommentSort","ownerLogin","findIssueByNumber","insertIssueEvent","getOrCreateLabel","cmp","ownerLogin","m","r","blob","repoUrl","saved","notFound","ownerLogin","ownerLogin","teamsForOrg","listOrgMembersDeduped","orgRoleForUser","getOrgByLogin","ownerLogin","s","listOrgMembersDeduped","orgRoleForUser","assertOrgAdmin","getOrgByLogin","ownerLogin","findCommitInRepo","ownerLogin","randomBytes","randomBytes","oauthApp","randomBytes","randomBytes","baseUrl","ownerLogin"]}