AUXteam commited on
Commit
609fcb1
·
verified ·
1 Parent(s): db083e3

Upload folder using huggingface_hub

Browse files
Files changed (7) hide show
  1. .env.example +3 -0
  2. README.md +16 -0
  3. app/api/submit-job/route.ts +113 -0
  4. lib/ai-utils.ts +27 -0
  5. lib/github.ts +86 -0
  6. package.json +1 -0
  7. pnpm-lock.yaml +311 -0
.env.example CHANGED
@@ -44,3 +44,6 @@ GROQ_API_KEY=your_groq_api_key # Get from https://console.groq.com (Fast infere
44
  # Optional Morph Fast Apply
45
  # Get yours at https://morphllm.com/
46
  MORPH_API_KEY=your_fast_apply_key
 
 
 
 
44
  # Optional Morph Fast Apply
45
  # Get yours at https://morphllm.com/
46
  MORPH_API_KEY=your_fast_apply_key
47
+
48
+ # GitHub Personal Access Token (for Paper2Code jobs)
49
+ PERSONAL_ACCESS_TOKEN=your_github_pat_here
README.md CHANGED
@@ -71,6 +71,22 @@ pnpm dev # or npm run dev / yarn dev
71
 
72
  Open [http://localhost:3000](http://localhost:3000)
73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  ## License
75
 
76
  MIT
 
71
 
72
  Open [http://localhost:3000](http://localhost:3000)
73
 
74
+ ## API Endpoints
75
+
76
+ ### POST `/api/submit-job`
77
+ Submit a research paper to transform it into code and push to GitHub.
78
+
79
+ **Request Body:**
80
+ ```json
81
+ {
82
+ "arxivUrl": "https://arxiv.org/abs/...",
83
+ "paperName": "My Great Paper",
84
+ "repo": "owner/repo"
85
+ }
86
+ ```
87
+
88
+ **Required environment variable:** `PERSONAL_ACCESS_TOKEN` (GitHub PAT with repo access).
89
+
90
  ## License
91
 
92
  MIT
app/api/submit-job/route.ts ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ import { generateText } from "ai";
3
+ import { getProviderForModel } from "@/lib/ai/provider-manager";
4
+ import { extractFilesFromAI, sanitizeBranchName } from "@/lib/ai-utils";
5
+ import { pushToGitHub } from "@/lib/github";
6
+ import { appConfig } from "@/config/app.config";
7
+
8
+ export async function POST(request: NextRequest) {
9
+ try {
10
+ const {
11
+ arxivUrl,
12
+ paperContent,
13
+ repo,
14
+ paperName,
15
+ model = appConfig.ai.defaultModel
16
+ } = await request.json();
17
+
18
+ if (!repo) {
19
+ return NextResponse.json({ error: "Target GitHub repository is required (e.g. 'owner/repo')" }, { status: 400 });
20
+ }
21
+
22
+ if (!paperName) {
23
+ return NextResponse.json({ error: "Paper name is required for branch naming" }, { status: 400 });
24
+ }
25
+
26
+ const githubToken = process.env.PERSONAL_ACCESS_TOKEN;
27
+ if (!githubToken) {
28
+ return NextResponse.json({ error: "GitHub PERSONAL_ACCESS_TOKEN not configured in environment" }, { status: 500 });
29
+ }
30
+
31
+ let finalPaperContent = paperContent || "";
32
+
33
+ // 1. Get paper content from Arxiv if URL is provided
34
+ if (arxivUrl && !paperContent) {
35
+ console.log(`[submit-job] Scraping Arxiv: ${arxivUrl}`);
36
+ try {
37
+ const scrapeResponse = await fetch(`${process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000'}/api/scrape-website`, {
38
+ method: 'POST',
39
+ headers: { 'Content-Type': 'application/json' },
40
+ body: JSON.stringify({ url: arxivUrl })
41
+ });
42
+
43
+ if (scrapeResponse.ok) {
44
+ const scrapeData = await scrapeResponse.json();
45
+ if (scrapeData.success) {
46
+ finalPaperContent = scrapeData.data.content;
47
+ } else {
48
+ console.warn(`[submit-job] Scrape failed: ${scrapeData.error}`);
49
+ }
50
+ }
51
+ } catch (error) {
52
+ console.error(`[submit-job] Error calling scrape API:`, error);
53
+ }
54
+ }
55
+
56
+ if (!finalPaperContent) {
57
+ return NextResponse.json({ error: "No paper content provided or found at URL" }, { status: 400 });
58
+ }
59
+
60
+ // 2. Generate Code from Paper
61
+ console.log(`[submit-job] Generating code for: ${paperName}`);
62
+ const { client, actualModel } = getProviderForModel(model);
63
+
64
+ const systemPrompt = `You are an expert React developer. Your task is to transform the provided research paper content into a functional React application using Vite and Tailwind CSS.
65
+
66
+ The application should:
67
+ 1. Visualize the core concepts or findings of the paper.
68
+ 2. Provide interactive components if applicable (e.g., simulators, calculators, data explorers).
69
+ 3. Have a professional, clean UI.
70
+ 4. Include a detailed "About" section summarizing the paper.
71
+
72
+ Output format:
73
+ Generate multiple files using the <file path="..."> format.
74
+ Always start with src/index.css, then src/App.jsx, then components.
75
+ Do NOT include tailwind.config.js or vite.config.js.
76
+
77
+ ${finalPaperContent.substring(0, 10000)} // Truncated paper content for prompt`;
78
+
79
+ const { text: generatedContent } = await generateText({
80
+ model: client(actualModel),
81
+ system: "You transform research papers into interactive React code.",
82
+ prompt: systemPrompt,
83
+ });
84
+
85
+ // 3. Extract Files
86
+ const files = extractFilesFromAI(generatedContent);
87
+ if (files.length === 0) {
88
+ return NextResponse.json({
89
+ error: "AI failed to generate code in the expected format",
90
+ rawResponse: generatedContent.substring(0, 500)
91
+ }, { status: 500 });
92
+ }
93
+
94
+ // 4. Push to GitHub
95
+ const branchName = sanitizeBranchName(paperName);
96
+ const githubResult = await pushToGitHub(repo, branchName, files, githubToken);
97
+
98
+ return NextResponse.json({
99
+ success: true,
100
+ message: `Successfully transformed paper to code and pushed to GitHub`,
101
+ githubUrl: githubResult.url,
102
+ branch: branchName,
103
+ filesCount: files.length
104
+ });
105
+
106
+ } catch (error: any) {
107
+ console.error("[submit-job] Error:", error);
108
+ return NextResponse.json({
109
+ success: false,
110
+ error: error.message || "An unexpected error occurred"
111
+ }, { status: 500 });
112
+ }
113
+ }
lib/ai-utils.ts ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Extracts files from AI generated content using the <file path="...">...</file> format.
3
+ */
4
+ export function extractFilesFromAI(content: string): { path: string; content: string }[] {
5
+ const fileRegex = /<file path="([^"]+)">([\s\S]*?)<\/file>/g;
6
+ const files: { path: string; content: string }[] = [];
7
+ let match;
8
+
9
+ while ((match = fileRegex.exec(content)) !== null) {
10
+ const filePath = match[1];
11
+ const fileContent = match[2].trim();
12
+ files.push({ path: filePath, content: fileContent });
13
+ }
14
+
15
+ return files;
16
+ }
17
+
18
+ /**
19
+ * Sanitizes a string for use as a branch name.
20
+ */
21
+ export function sanitizeBranchName(name: string): string {
22
+ return name
23
+ .toLowerCase()
24
+ .replace(/[^a-z0-9]/g, '-')
25
+ .replace(/-+/g, '-')
26
+ .replace(/^-|-$/g, '');
27
+ }
lib/github.ts ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Octokit } from 'octokit';
2
+
3
+ /**
4
+ * Pushes files to a GitHub repository on a new branch.
5
+ * @param repo Full repo name (e.g., "owner/repo")
6
+ * @param branch Branch name to create
7
+ * @param files Array of files to upload [{ path: string, content: string }]
8
+ * @param token GitHub Personal Access Token
9
+ */
10
+ export async function pushToGitHub(
11
+ repo: string,
12
+ branch: string,
13
+ files: { path: string; content: string }[],
14
+ token: string
15
+ ) {
16
+ const [owner, repoName] = repo.split('/');
17
+ const octokit = new Octokit({ auth: token });
18
+
19
+ console.log(`[github] Pushing to ${repo} on branch ${branch}...`);
20
+
21
+ // 1. Get the default branch's last commit SHA
22
+ const { data: repoData } = await octokit.rest.repos.get({ owner, repo: repoName });
23
+ const defaultBranch = repoData.default_branch;
24
+ const { data: refData } = await octokit.rest.git.getRef({
25
+ owner,
26
+ repo: repoName,
27
+ ref: `heads/${defaultBranch}`,
28
+ });
29
+ const parentSha = refData.object.sha;
30
+
31
+ // 2. Create a new branch
32
+ try {
33
+ await octokit.rest.git.createRef({
34
+ owner,
35
+ repo: repoName,
36
+ ref: `refs/heads/${branch}`,
37
+ sha: parentSha,
38
+ });
39
+ console.log(`[github] Created branch ${branch}`);
40
+ } catch (error: any) {
41
+ if (error.status === 422) {
42
+ console.log(`[github] Branch ${branch} already exists, continuing...`);
43
+ } else {
44
+ throw error;
45
+ }
46
+ }
47
+
48
+ // 3. Create a tree with the new files
49
+ const tree = files.map(file => ({
50
+ path: file.path,
51
+ mode: '100644' as const,
52
+ type: 'blob' as const,
53
+ content: file.content,
54
+ }));
55
+
56
+ const { data: treeData } = await octokit.rest.git.createTree({
57
+ owner,
58
+ repo: repoName,
59
+ base_tree: parentSha,
60
+ tree,
61
+ });
62
+
63
+ // 4. Create a commit
64
+ const { data: commitData } = await octokit.rest.git.createCommit({
65
+ owner,
66
+ repo: repoName,
67
+ message: `feat: transform paper to code - ${branch}`,
68
+ tree: treeData.sha,
69
+ parents: [parentSha],
70
+ });
71
+
72
+ // 5. Update the branch reference
73
+ await octokit.rest.git.updateRef({
74
+ owner,
75
+ repo: repoName,
76
+ ref: `heads/${branch}`,
77
+ sha: commitData.sha,
78
+ force: true,
79
+ });
80
+
81
+ console.log(`[github] Successfully pushed to ${repo}/${branch}`);
82
+ return {
83
+ url: `https://github.com/${repo}/tree/${branch}`,
84
+ sha: commitData.sha
85
+ };
86
+ }
package.json CHANGED
@@ -68,6 +68,7 @@
68
  "nanoid": "^5.1.5",
69
  "next": "15.4.3",
70
  "next-themes": "^0.4.6",
 
71
  "pixi.js": "^8.13.1",
72
  "react": "19.1.0",
73
  "react-dom": "19.1.0",
 
68
  "nanoid": "^5.1.5",
69
  "next": "15.4.3",
70
  "next-themes": "^0.4.6",
71
+ "octokit": "^5.0.5",
72
  "pixi.js": "^8.13.1",
73
  "react": "19.1.0",
74
  "react-dom": "19.1.0",
pnpm-lock.yaml CHANGED
@@ -173,6 +173,9 @@ importers:
173
  next-themes:
174
  specifier: ^0.4.6
175
  version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
 
 
 
176
  pixi.js:
177
  specifier: ^8.13.1
178
  version: 8.13.2
@@ -641,6 +644,113 @@ packages:
641
  resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
642
  engines: {node: '>=12.4.0'}
643
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
644
  '@opentelemetry/api@1.9.0':
645
  resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
646
  engines: {node: '>=8.0.0'}
@@ -1308,6 +1418,9 @@ packages:
1308
  '@tybys/wasm-util@0.10.0':
1309
  resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==}
1310
 
 
 
 
1311
  '@types/css-font-loading-module@0.0.12':
1312
  resolution: {integrity: sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==}
1313
 
@@ -1666,10 +1779,16 @@ packages:
1666
  bare-events@2.6.1:
1667
  resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==}
1668
 
 
 
 
1669
  binary-extensions@2.3.0:
1670
  resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
1671
  engines: {node: '>=8'}
1672
 
 
 
 
1673
  brace-expansion@1.1.12:
1674
  resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
1675
 
@@ -2053,6 +2172,9 @@ packages:
2053
  resolution: {integrity: sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==}
2054
  engines: {node: '>=20.0.0'}
2055
 
 
 
 
2056
  fast-deep-equal@3.1.3:
2057
  resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
2058
 
@@ -2732,6 +2854,10 @@ packages:
2732
  resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
2733
  engines: {node: '>= 0.4'}
2734
 
 
 
 
 
2735
  openapi-fetch@0.9.8:
2736
  resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==}
2737
 
@@ -3223,6 +3349,10 @@ packages:
3223
  resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
3224
  engines: {node: '>=8.0'}
3225
 
 
 
 
 
3226
  toggle-selection@1.0.6:
3227
  resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
3228
 
@@ -3282,6 +3412,12 @@ packages:
3282
  undici-types@6.21.0:
3283
  resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
3284
 
 
 
 
 
 
 
3285
  unrs-resolver@1.11.1:
3286
  resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==}
3287
 
@@ -3751,6 +3887,153 @@ snapshots:
3751
 
3752
  '@nolyfill/is-core-module@1.0.39': {}
3753
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3754
  '@opentelemetry/api@1.9.0': {}
3755
 
3756
  '@pixi/colord@2.9.6': {}
@@ -4463,6 +4746,8 @@ snapshots:
4463
  tslib: 2.8.1
4464
  optional: true
4465
 
 
 
4466
  '@types/css-font-loading-module@0.0.12': {}
4467
 
4468
  '@types/earcut@3.0.0': {}
@@ -4848,8 +5133,12 @@ snapshots:
4848
  bare-events@2.6.1:
4849
  optional: true
4850
 
 
 
4851
  binary-extensions@2.3.0: {}
4852
 
 
 
4853
  brace-expansion@1.1.12:
4854
  dependencies:
4855
  balanced-match: 1.0.2
@@ -5377,6 +5666,8 @@ snapshots:
5377
 
5378
  eventsource-parser@3.0.3: {}
5379
 
 
 
5380
  fast-deep-equal@3.1.3: {}
5381
 
5382
  fast-fifo@1.3.2: {}
@@ -6025,6 +6316,20 @@ snapshots:
6025
  define-properties: 1.2.1
6026
  es-object-atoms: 1.1.1
6027
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6028
  openapi-fetch@0.9.8:
6029
  dependencies:
6030
  openapi-typescript-helpers: 0.0.8
@@ -6625,6 +6930,8 @@ snapshots:
6625
  dependencies:
6626
  is-number: 7.0.0
6627
 
 
 
6628
  toggle-selection@1.0.6: {}
6629
 
6630
  tr46@0.0.3: {}
@@ -6696,6 +7003,10 @@ snapshots:
6696
 
6697
  undici-types@6.21.0: {}
6698
 
 
 
 
 
6699
  unrs-resolver@1.11.1:
6700
  dependencies:
6701
  napi-postinstall: 0.3.2
 
173
  next-themes:
174
  specifier: ^0.4.6
175
  version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
176
+ octokit:
177
+ specifier: ^5.0.5
178
+ version: 5.0.5
179
  pixi.js:
180
  specifier: ^8.13.1
181
  version: 8.13.2
 
644
  resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
645
  engines: {node: '>=12.4.0'}
646
 
647
+ '@octokit/app@16.1.2':
648
+ resolution: {integrity: sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==}
649
+ engines: {node: '>= 20'}
650
+
651
+ '@octokit/auth-app@8.2.0':
652
+ resolution: {integrity: sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g==}
653
+ engines: {node: '>= 20'}
654
+
655
+ '@octokit/auth-oauth-app@9.0.3':
656
+ resolution: {integrity: sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==}
657
+ engines: {node: '>= 20'}
658
+
659
+ '@octokit/auth-oauth-device@8.0.3':
660
+ resolution: {integrity: sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==}
661
+ engines: {node: '>= 20'}
662
+
663
+ '@octokit/auth-oauth-user@6.0.2':
664
+ resolution: {integrity: sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==}
665
+ engines: {node: '>= 20'}
666
+
667
+ '@octokit/auth-token@6.0.0':
668
+ resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==}
669
+ engines: {node: '>= 20'}
670
+
671
+ '@octokit/auth-unauthenticated@7.0.3':
672
+ resolution: {integrity: sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==}
673
+ engines: {node: '>= 20'}
674
+
675
+ '@octokit/core@7.0.6':
676
+ resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==}
677
+ engines: {node: '>= 20'}
678
+
679
+ '@octokit/endpoint@11.0.2':
680
+ resolution: {integrity: sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==}
681
+ engines: {node: '>= 20'}
682
+
683
+ '@octokit/graphql@9.0.3':
684
+ resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==}
685
+ engines: {node: '>= 20'}
686
+
687
+ '@octokit/oauth-app@8.0.3':
688
+ resolution: {integrity: sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==}
689
+ engines: {node: '>= 20'}
690
+
691
+ '@octokit/oauth-authorization-url@8.0.0':
692
+ resolution: {integrity: sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==}
693
+ engines: {node: '>= 20'}
694
+
695
+ '@octokit/oauth-methods@6.0.2':
696
+ resolution: {integrity: sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==}
697
+ engines: {node: '>= 20'}
698
+
699
+ '@octokit/openapi-types@27.0.0':
700
+ resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==}
701
+
702
+ '@octokit/openapi-webhooks-types@12.1.0':
703
+ resolution: {integrity: sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==}
704
+
705
+ '@octokit/plugin-paginate-graphql@6.0.0':
706
+ resolution: {integrity: sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==}
707
+ engines: {node: '>= 20'}
708
+ peerDependencies:
709
+ '@octokit/core': '>=6'
710
+
711
+ '@octokit/plugin-paginate-rest@14.0.0':
712
+ resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==}
713
+ engines: {node: '>= 20'}
714
+ peerDependencies:
715
+ '@octokit/core': '>=6'
716
+
717
+ '@octokit/plugin-rest-endpoint-methods@17.0.0':
718
+ resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==}
719
+ engines: {node: '>= 20'}
720
+ peerDependencies:
721
+ '@octokit/core': '>=6'
722
+
723
+ '@octokit/plugin-retry@8.0.3':
724
+ resolution: {integrity: sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA==}
725
+ engines: {node: '>= 20'}
726
+ peerDependencies:
727
+ '@octokit/core': '>=7'
728
+
729
+ '@octokit/plugin-throttling@11.0.3':
730
+ resolution: {integrity: sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==}
731
+ engines: {node: '>= 20'}
732
+ peerDependencies:
733
+ '@octokit/core': ^7.0.0
734
+
735
+ '@octokit/request-error@7.1.0':
736
+ resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==}
737
+ engines: {node: '>= 20'}
738
+
739
+ '@octokit/request@10.0.7':
740
+ resolution: {integrity: sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==}
741
+ engines: {node: '>= 20'}
742
+
743
+ '@octokit/types@16.0.0':
744
+ resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==}
745
+
746
+ '@octokit/webhooks-methods@6.0.0':
747
+ resolution: {integrity: sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==}
748
+ engines: {node: '>= 20'}
749
+
750
+ '@octokit/webhooks@14.2.0':
751
+ resolution: {integrity: sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==}
752
+ engines: {node: '>= 20'}
753
+
754
  '@opentelemetry/api@1.9.0':
755
  resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
756
  engines: {node: '>=8.0.0'}
 
1418
  '@tybys/wasm-util@0.10.0':
1419
  resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==}
1420
 
1421
+ '@types/aws-lambda@8.10.160':
1422
+ resolution: {integrity: sha512-uoO4QVQNWFPJMh26pXtmtrRfGshPUSpMZGUyUQY20FhfHEElEBOPKgVmFs1z+kbpyBsRs2JnoOPT7++Z4GA9pA==}
1423
+
1424
  '@types/css-font-loading-module@0.0.12':
1425
  resolution: {integrity: sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==}
1426
 
 
1779
  bare-events@2.6.1:
1780
  resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==}
1781
 
1782
+ before-after-hook@4.0.0:
1783
+ resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==}
1784
+
1785
  binary-extensions@2.3.0:
1786
  resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
1787
  engines: {node: '>=8'}
1788
 
1789
+ bottleneck@2.19.5:
1790
+ resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==}
1791
+
1792
  brace-expansion@1.1.12:
1793
  resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
1794
 
 
2172
  resolution: {integrity: sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==}
2173
  engines: {node: '>=20.0.0'}
2174
 
2175
+ fast-content-type-parse@3.0.0:
2176
+ resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==}
2177
+
2178
  fast-deep-equal@3.1.3:
2179
  resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
2180
 
 
2854
  resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
2855
  engines: {node: '>= 0.4'}
2856
 
2857
+ octokit@5.0.5:
2858
+ resolution: {integrity: sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==}
2859
+ engines: {node: '>= 20'}
2860
+
2861
  openapi-fetch@0.9.8:
2862
  resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==}
2863
 
 
3349
  resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
3350
  engines: {node: '>=8.0'}
3351
 
3352
+ toad-cache@3.7.0:
3353
+ resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==}
3354
+ engines: {node: '>=12'}
3355
+
3356
  toggle-selection@1.0.6:
3357
  resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
3358
 
 
3412
  undici-types@6.21.0:
3413
  resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
3414
 
3415
+ universal-github-app-jwt@2.2.2:
3416
+ resolution: {integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==}
3417
+
3418
+ universal-user-agent@7.0.3:
3419
+ resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==}
3420
+
3421
  unrs-resolver@1.11.1:
3422
  resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==}
3423
 
 
3887
 
3888
  '@nolyfill/is-core-module@1.0.39': {}
3889
 
3890
+ '@octokit/app@16.1.2':
3891
+ dependencies:
3892
+ '@octokit/auth-app': 8.2.0
3893
+ '@octokit/auth-unauthenticated': 7.0.3
3894
+ '@octokit/core': 7.0.6
3895
+ '@octokit/oauth-app': 8.0.3
3896
+ '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6)
3897
+ '@octokit/types': 16.0.0
3898
+ '@octokit/webhooks': 14.2.0
3899
+
3900
+ '@octokit/auth-app@8.2.0':
3901
+ dependencies:
3902
+ '@octokit/auth-oauth-app': 9.0.3
3903
+ '@octokit/auth-oauth-user': 6.0.2
3904
+ '@octokit/request': 10.0.7
3905
+ '@octokit/request-error': 7.1.0
3906
+ '@octokit/types': 16.0.0
3907
+ toad-cache: 3.7.0
3908
+ universal-github-app-jwt: 2.2.2
3909
+ universal-user-agent: 7.0.3
3910
+
3911
+ '@octokit/auth-oauth-app@9.0.3':
3912
+ dependencies:
3913
+ '@octokit/auth-oauth-device': 8.0.3
3914
+ '@octokit/auth-oauth-user': 6.0.2
3915
+ '@octokit/request': 10.0.7
3916
+ '@octokit/types': 16.0.0
3917
+ universal-user-agent: 7.0.3
3918
+
3919
+ '@octokit/auth-oauth-device@8.0.3':
3920
+ dependencies:
3921
+ '@octokit/oauth-methods': 6.0.2
3922
+ '@octokit/request': 10.0.7
3923
+ '@octokit/types': 16.0.0
3924
+ universal-user-agent: 7.0.3
3925
+
3926
+ '@octokit/auth-oauth-user@6.0.2':
3927
+ dependencies:
3928
+ '@octokit/auth-oauth-device': 8.0.3
3929
+ '@octokit/oauth-methods': 6.0.2
3930
+ '@octokit/request': 10.0.7
3931
+ '@octokit/types': 16.0.0
3932
+ universal-user-agent: 7.0.3
3933
+
3934
+ '@octokit/auth-token@6.0.0': {}
3935
+
3936
+ '@octokit/auth-unauthenticated@7.0.3':
3937
+ dependencies:
3938
+ '@octokit/request-error': 7.1.0
3939
+ '@octokit/types': 16.0.0
3940
+
3941
+ '@octokit/core@7.0.6':
3942
+ dependencies:
3943
+ '@octokit/auth-token': 6.0.0
3944
+ '@octokit/graphql': 9.0.3
3945
+ '@octokit/request': 10.0.7
3946
+ '@octokit/request-error': 7.1.0
3947
+ '@octokit/types': 16.0.0
3948
+ before-after-hook: 4.0.0
3949
+ universal-user-agent: 7.0.3
3950
+
3951
+ '@octokit/endpoint@11.0.2':
3952
+ dependencies:
3953
+ '@octokit/types': 16.0.0
3954
+ universal-user-agent: 7.0.3
3955
+
3956
+ '@octokit/graphql@9.0.3':
3957
+ dependencies:
3958
+ '@octokit/request': 10.0.7
3959
+ '@octokit/types': 16.0.0
3960
+ universal-user-agent: 7.0.3
3961
+
3962
+ '@octokit/oauth-app@8.0.3':
3963
+ dependencies:
3964
+ '@octokit/auth-oauth-app': 9.0.3
3965
+ '@octokit/auth-oauth-user': 6.0.2
3966
+ '@octokit/auth-unauthenticated': 7.0.3
3967
+ '@octokit/core': 7.0.6
3968
+ '@octokit/oauth-authorization-url': 8.0.0
3969
+ '@octokit/oauth-methods': 6.0.2
3970
+ '@types/aws-lambda': 8.10.160
3971
+ universal-user-agent: 7.0.3
3972
+
3973
+ '@octokit/oauth-authorization-url@8.0.0': {}
3974
+
3975
+ '@octokit/oauth-methods@6.0.2':
3976
+ dependencies:
3977
+ '@octokit/oauth-authorization-url': 8.0.0
3978
+ '@octokit/request': 10.0.7
3979
+ '@octokit/request-error': 7.1.0
3980
+ '@octokit/types': 16.0.0
3981
+
3982
+ '@octokit/openapi-types@27.0.0': {}
3983
+
3984
+ '@octokit/openapi-webhooks-types@12.1.0': {}
3985
+
3986
+ '@octokit/plugin-paginate-graphql@6.0.0(@octokit/core@7.0.6)':
3987
+ dependencies:
3988
+ '@octokit/core': 7.0.6
3989
+
3990
+ '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)':
3991
+ dependencies:
3992
+ '@octokit/core': 7.0.6
3993
+ '@octokit/types': 16.0.0
3994
+
3995
+ '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)':
3996
+ dependencies:
3997
+ '@octokit/core': 7.0.6
3998
+ '@octokit/types': 16.0.0
3999
+
4000
+ '@octokit/plugin-retry@8.0.3(@octokit/core@7.0.6)':
4001
+ dependencies:
4002
+ '@octokit/core': 7.0.6
4003
+ '@octokit/request-error': 7.1.0
4004
+ '@octokit/types': 16.0.0
4005
+ bottleneck: 2.19.5
4006
+
4007
+ '@octokit/plugin-throttling@11.0.3(@octokit/core@7.0.6)':
4008
+ dependencies:
4009
+ '@octokit/core': 7.0.6
4010
+ '@octokit/types': 16.0.0
4011
+ bottleneck: 2.19.5
4012
+
4013
+ '@octokit/request-error@7.1.0':
4014
+ dependencies:
4015
+ '@octokit/types': 16.0.0
4016
+
4017
+ '@octokit/request@10.0.7':
4018
+ dependencies:
4019
+ '@octokit/endpoint': 11.0.2
4020
+ '@octokit/request-error': 7.1.0
4021
+ '@octokit/types': 16.0.0
4022
+ fast-content-type-parse: 3.0.0
4023
+ universal-user-agent: 7.0.3
4024
+
4025
+ '@octokit/types@16.0.0':
4026
+ dependencies:
4027
+ '@octokit/openapi-types': 27.0.0
4028
+
4029
+ '@octokit/webhooks-methods@6.0.0': {}
4030
+
4031
+ '@octokit/webhooks@14.2.0':
4032
+ dependencies:
4033
+ '@octokit/openapi-webhooks-types': 12.1.0
4034
+ '@octokit/request-error': 7.1.0
4035
+ '@octokit/webhooks-methods': 6.0.0
4036
+
4037
  '@opentelemetry/api@1.9.0': {}
4038
 
4039
  '@pixi/colord@2.9.6': {}
 
4746
  tslib: 2.8.1
4747
  optional: true
4748
 
4749
+ '@types/aws-lambda@8.10.160': {}
4750
+
4751
  '@types/css-font-loading-module@0.0.12': {}
4752
 
4753
  '@types/earcut@3.0.0': {}
 
5133
  bare-events@2.6.1:
5134
  optional: true
5135
 
5136
+ before-after-hook@4.0.0: {}
5137
+
5138
  binary-extensions@2.3.0: {}
5139
 
5140
+ bottleneck@2.19.5: {}
5141
+
5142
  brace-expansion@1.1.12:
5143
  dependencies:
5144
  balanced-match: 1.0.2
 
5666
 
5667
  eventsource-parser@3.0.3: {}
5668
 
5669
+ fast-content-type-parse@3.0.0: {}
5670
+
5671
  fast-deep-equal@3.1.3: {}
5672
 
5673
  fast-fifo@1.3.2: {}
 
6316
  define-properties: 1.2.1
6317
  es-object-atoms: 1.1.1
6318
 
6319
+ octokit@5.0.5:
6320
+ dependencies:
6321
+ '@octokit/app': 16.1.2
6322
+ '@octokit/core': 7.0.6
6323
+ '@octokit/oauth-app': 8.0.3
6324
+ '@octokit/plugin-paginate-graphql': 6.0.0(@octokit/core@7.0.6)
6325
+ '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6)
6326
+ '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6)
6327
+ '@octokit/plugin-retry': 8.0.3(@octokit/core@7.0.6)
6328
+ '@octokit/plugin-throttling': 11.0.3(@octokit/core@7.0.6)
6329
+ '@octokit/request-error': 7.1.0
6330
+ '@octokit/types': 16.0.0
6331
+ '@octokit/webhooks': 14.2.0
6332
+
6333
  openapi-fetch@0.9.8:
6334
  dependencies:
6335
  openapi-typescript-helpers: 0.0.8
 
6930
  dependencies:
6931
  is-number: 7.0.0
6932
 
6933
+ toad-cache@3.7.0: {}
6934
+
6935
  toggle-selection@1.0.6: {}
6936
 
6937
  tr46@0.0.3: {}
 
7003
 
7004
  undici-types@6.21.0: {}
7005
 
7006
+ universal-github-app-jwt@2.2.2: {}
7007
+
7008
+ universal-user-agent@7.0.3: {}
7009
+
7010
  unrs-resolver@1.11.1:
7011
  dependencies:
7012
  napi-postinstall: 0.3.2