diff --git a/kits/agentic/code-review/.env.example b/kits/agentic/code-review/.env.example new file mode 100644 index 00000000..78224274 --- /dev/null +++ b/kits/agentic/code-review/.env.example @@ -0,0 +1,4 @@ +AGENTIC_GENERATE_CONTENT=AGENTIC_GENERATE_CONTENT_FLOW_ID +LAMATIC_API_KEY=LAMATIC_API_KEY +LAMATIC_API_URL=LAMATIC_API_URL +LAMATIC_PROJECT_ID=LAMATIC_PROJECT_ID diff --git a/kits/agentic/code-review/.gitignore b/kits/agentic/code-review/.gitignore new file mode 100644 index 00000000..9cdc8be7 --- /dev/null +++ b/kits/agentic/code-review/.gitignore @@ -0,0 +1,30 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# next.js +/.next/ +/out/ + +# production +/build + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files +.env +.env.local +.env.*.local +!.env.example + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts \ No newline at end of file diff --git a/kits/agentic/code-review/.next-dev-3001.err.log b/kits/agentic/code-review/.next-dev-3001.err.log new file mode 100644 index 00000000..e69de29b diff --git a/kits/agentic/code-review/.next-dev-3001.log b/kits/agentic/code-review/.next-dev-3001.log new file mode 100644 index 00000000..7e00146d --- /dev/null +++ b/kits/agentic/code-review/.next-dev-3001.log @@ -0,0 +1,16 @@ + +> code-review-agent@0.1.0 dev +> next dev --port 3001 + + ▲ Next.js 15.1.3 + - Local: http://localhost:3001 + - Network: http://10.72.173.67:3001 + - Environments: .env + + ✓ Starting... + ✓ Ready in 3.5s + ○ Compiling / ... + ✓ Compiled / in 1390ms (571 modules) + GET / 200 in 1935ms + GET / 200 in 36ms +[?25h diff --git a/kits/agentic/code-review/README.md b/kits/agentic/code-review/README.md new file mode 100644 index 00000000..eaa70c8c --- /dev/null +++ b/kits/agentic/code-review/README.md @@ -0,0 +1,185 @@ +# Code Review Agent + +An agentic Next.js starter kit that performs AI-powered code reviews on GitHub Pull Requests using Lamatic Flows. Enter any public GitHub PR and get a structured analysis of bugs, security vulnerabilities, and style issues in seconds. + +## Live Demo + +[agent-kit-stk.vercel.app](https://agent-kit-stk.vercel.app) + +--- + +## What It Does + +The agent takes three inputs — GitHub owner, repository, and PR number — then runs a multi-step agentic flow: + +1. **Fetches** the PR diff from the GitHub REST API +2. **Extracts** the raw patch content from all changed files +3. **Analyzes bugs** — null pointer risks, logic errors, runtime failures +4. **Analyzes security** — hardcoded secrets, injection risks, insecure dependencies +5. **Analyzes style** — naming conventions, complexity, readability +6. **Synthesizes** a concise overall summary of PR quality + +Results are returned as structured JSON and rendered in a premium dark-themed UI with severity-aware triage cards. + +--- + +## Tech Stack + +| Layer | Technology | +|---|---| +| Frontend | Next.js 16.2.1, React 19 | +| AI Flow | Lamatic Flows (GraphQL API) | +| LLM | Groq — `llama-3.3-70b-versatile` | +| GitHub Data | GitHub REST API | +| Deployment | Vercel | + +--- + +## Prerequisites + +- Node.js 18+ +- A [Lamatic](https://lamatic.ai) account with the Code Review Agent flow deployed +- A [Groq](https://console.groq.com) API key (free) +- A [GitHub](https://github.com) account (for public PR access) + +--- + +## Environment Variables + +Create a `.env` file in the kit root: + +--- + +## Lamatic Flow Setup + +This kit requires a Lamatic flow with the following node structure: + +```text +API Request Trigger (owner, repo, pr_number) + ↓ +Code Node — extract diff from GitHub API response + ↓ +GitHub API Node — GET /repos/{owner}/{repo}/pulls/{pr_number}/files + ↓ +Generate JSON — Bug Analysis + ↓ +Generate JSON — Security Scan + ↓ +Generate JSON — Style Check + ↓ +Generate JSON — Final Merge (summary) + ↓ +API Response +``` + +Import the exported flow from the `flows/` directory into your Lamatic project, then update the `workflowId` in `app/api/review/route.ts` with your deployed flow ID. + +--- + +## Running Locally + +```bash +# 1. Install dependencies +cd kits/agentic/code-review +npm install + +# 2. Set up environment variables +cp .env.example .env +# Fill in your LAMATIC_API_KEY + +# 3. Start the dev server +npm run dev +``` + +Open [http://localhost:3000](http://localhost:3000) in your browser. + +--- + +## Usage + +1. Enter the GitHub **owner** (e.g. `fmtlib`) +2. Enter the **repository** name (e.g. `fmt`) +3. Enter the **PR number** (e.g. `4660`) +4. Click **Review PR** + +The agent will fetch the diff and return: + +- **Summary** — a concise 2-3 sentence overview of PR quality +- **Bugs** — logic errors and runtime risks with severity levels (High / Medium / Low) +- **Security** — vulnerability findings with severity levels +- **Style** — readability and code quality suggestions + +--- + +## Project Structure + +```text +kits/agentic/code-review/ +├── app/ +│ ├── api/ +│ │ └── review/ +│ │ └── route.ts # Calls Lamatic GraphQL API +│ ├── page.tsx # Main UI +│ ├── layout.tsx +│ └── globals.css +├── flows/ +│ └── code-review-agent/ # Exported Lamatic flow +├── .env.example +├── config.json +├── package.json +└── README.md +``` + +--- + +## API Reference + +### `POST /api/review` + +**Request:** +```json +{ + "owner": "fmtlib", + "repo": "fmt", + "pr_number": "4660" +} +``` + +**Response:** +```json +{ + "summary": "The PR introduces a new is_container_adaptor trait...", + "bugs": [ + { "line": "776", "issue": "Potential null pointer risk", "severity": "High" } + ], + "security": [ + { "line": "765", "issue": "Insecure dependency", "severity": "Low" } + ], + "style": [ + "code style", + "readability issues" + ] +} +``` + +--- + +## Deployment + +Deploy to Vercel in one click: + +1. Fork this repository +2. Import to [vercel.com](https://vercel.com) +3. Set Root Directory to `kits/agentic/code-review` +4. Add environment variable: `LAMATIC_API_KEY` +5. Deploy + +--- + +![alt text](image.png) + +--- + +## Author + +Built by [Soumik](https://github.com/soumik15630m) as a contribution to [Lamatic AgentKit](https://github.com/Lamatic/AgentKit). diff --git a/kits/agentic/code-review/actions/orchestrate.ts b/kits/agentic/code-review/actions/orchestrate.ts new file mode 100644 index 00000000..ee068b7c --- /dev/null +++ b/kits/agentic/code-review/actions/orchestrate.ts @@ -0,0 +1,70 @@ +"use server" + +import { lamaticClient } from "@/lib/lamatic-client" +import config from "../config" + ++export async function generateContent( ++ prUrl: string, +): Promise<{ + success: boolean + data?: any + error?: string +}> { + try { + console.log("[v0] Generating content with:", { prUrl }) + + // Get the first workflow from the config + const flows = config.flows + const firstFlowKey = Object.keys(flows)[0] + + if (!firstFlowKey) { + throw new Error("No workflows found in configuration") + } + + // Fix: Add index signature to make TypeScript happy about accessing flows[firstFlowKey] + const flow = flows[firstFlowKey as keyof typeof flows] as (typeof flows)[keyof typeof flows]; + console.log("[v0] Using workflow:", flow.name, flow.workflowId); + + const inputs: Record = { prUrl } + console.log("[v0] Sending inputs:", inputs) + + if (!flow.workflowId) { + throw Error("Workflow not found in config.") + } + const workflowId = process.env[flow.workflowId] + if (!workflowId) { + throw new Error(`Missing environment variable for workflow ID key: ${flow.workflowId}`) + } + const resData = await lamaticClient.executeFlow(workflowId, inputs) + console.log("[v0] Raw response:", resData) + +const answer = resData?.result?.answer + + if (!answer) { + throw new Error("No answer found in response") + } + + return { + success: true, + data: answer, + } + } catch (error) { + console.error("[v0] Generation error:", error) + + let errorMessage = "Unknown error occurred" + if (error instanceof Error) { + errorMessage = error.message + if (error.message.includes("fetch failed")) { + errorMessage = + "Network error: Unable to connect to the service. Please check your internet connection and try again." + } else if (error.message.includes("API key")) { + errorMessage = "Authentication error: Please check your API configuration." + } + } + + return { + success: false, + error: errorMessage, + } + } +} diff --git a/kits/agentic/code-review/app/api/review/route.ts b/kits/agentic/code-review/app/api/review/route.ts new file mode 100644 index 00000000..29e108df --- /dev/null +++ b/kits/agentic/code-review/app/api/review/route.ts @@ -0,0 +1,139 @@ +import { NextRequest, NextResponse } from "next/server" + +const query = ` + query ExecuteWorkflow( + $workflowId: String! + $owner: String + $repo: String + $pr_number: String + ) { + executeWorkflow( + workflowId: $workflowId + payload: { + owner: $owner + repo: $repo + pr_number: $pr_number + } + ) { + status + result + } + } +` + +export async function POST(req: NextRequest) { + try { + const body = await req.json() + const owner = typeof body?.owner === "string" ? body.owner.trim() : "" + const repo = typeof body?.repo === "string" ? body.repo.trim() : "" + const pr_number = + typeof body?.pr_number === "string" ? body.pr_number.trim() : "" + + if (!owner || !repo || !pr_number) { + return NextResponse.json( + { error: "Owner, repo, and PR number are required." }, + { status: 400 } + ) + } + + if (!process.env.LAMATIC_API_KEY) { + return NextResponse.json( + { error: "LAMATIC_API_KEY is not configured on the server." }, + { status: 500 } + ) + } + + const res = await fetch( + "https://soumiksorganization573-codereviewagent135.lamatic.dev/graphql", + { + method: "POST", + headers: { + Authorization: `Bearer ${process.env.LAMATIC_API_KEY}`, + "Content-Type": "application/json", + "x-project-id": "4da47f5c-f38d-4519-89b3-82feda6e81ab", + }, + body: JSON.stringify({ + query, + variables: { + workflowId: "597871bb-6b0b-4cef-9771-05514dee60cd", + owner, + repo, + pr_number, + }, + }), + } + ) + + const raw = await res.text() + const trimmed = raw.trim() + let data: any = null + + if (trimmed) { + try { + data = JSON.parse(trimmed) + } catch { + data = null + } + } + + if (!res.ok) { + const upstreamMessage = + data?.errors?.map((error: any) => error?.message).filter(Boolean).join("; ") || + data?.message || + (trimmed.startsWith("<") + ? "Lamatic returned HTML instead of JSON." + : "Lamatic returned an unsuccessful response.") + + console.error("Lamatic workflow request failed", { + status: res.status, + message: upstreamMessage, + }) + + return NextResponse.json( + { error: `Lamatic request failed (${res.status}): ${upstreamMessage}` }, + { status: 502 } + ) + } + + if (!data || typeof data !== "object") { + console.error("Lamatic returned a non-JSON response", { + status: res.status, + }) + + return NextResponse.json( + { error: "Lamatic returned an invalid non-JSON response." }, + { status: 502 } + ) + } + + if (Array.isArray(data.errors) && data.errors.length > 0) { + const message = data.errors + .map((error: any) => error?.message) + .filter(Boolean) + .join("; ") + + console.error("Lamatic GraphQL errors", { message }) + + return NextResponse.json( + { error: message || "Lamatic returned GraphQL errors." }, + { status: 502 } + ) + } + + const result = data?.data?.executeWorkflow?.result + + return NextResponse.json({ + bugs: Array.isArray(result?.bugs) ? result.bugs : [], + security: Array.isArray(result?.security) ? result.security : [], + style: Array.isArray(result?.style) ? result.style : [], + summary: typeof result?.summary === "string" ? result.summary : "", + }) + } catch (error) { + console.error("Review route failed", error) + + return NextResponse.json( + { error: "The review route failed before it could complete the request." }, + { status: 500 } + ) + } +} diff --git a/kits/agentic/code-review/app/globals.css b/kits/agentic/code-review/app/globals.css new file mode 100644 index 00000000..10f1f3ea --- /dev/null +++ b/kits/agentic/code-review/app/globals.css @@ -0,0 +1,11 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: sans-serif; + background: #fff; + color: #111; +} \ No newline at end of file diff --git a/kits/agentic/code-review/app/layout.tsx b/kits/agentic/code-review/app/layout.tsx new file mode 100644 index 00000000..98fe75cf --- /dev/null +++ b/kits/agentic/code-review/app/layout.tsx @@ -0,0 +1,19 @@ +import type { Metadata } from "next" +import "./globals.css" + +export const metadata: Metadata = { + title: "Code Review Agent", + description: "AI-powered GitHub PR code review", +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} \ No newline at end of file diff --git a/kits/agentic/code-review/app/page.tsx b/kits/agentic/code-review/app/page.tsx new file mode 100644 index 00000000..d46ac4c8 --- /dev/null +++ b/kits/agentic/code-review/app/page.tsx @@ -0,0 +1,729 @@ +"use client" + +import { type FormEvent, type HTMLAttributes, type ReactNode, useState } from "react" + +type Finding = { line: string; issue: string; severity: string } +type StyleItem = string | { suggestion?: string; issue?: string } +type ReviewResult = { + summary: string + bugs: Finding[] + security: Finding[] + style: StyleItem[] +} + +export default function Home() { + const [owner, setOwner] = useState("") + const [repo, setRepo] = useState("") + const [prNumber, setPrNumber] = useState("") + const [loading, setLoading] = useState(false) + const [result, setResult] = useState(null) + const [error, setError] = useState("") + + async function handleReview() { + if (!owner || !repo || !prNumber) return + setLoading(true) + setError("") + setResult(null) + try { + const res = await fetch("/api/review", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ owner, repo, pr_number: prNumber }), + }) + + const raw = await res.text() + const trimmed = raw.trim() + let data: any = null + + if (trimmed) { + try { + data = JSON.parse(trimmed) + } catch { + data = null + } + } + + if (!res.ok) { + if (typeof data?.error === "string" && data.error) { + throw new Error(data.error) + } + + if (trimmed.startsWith("<")) { + throw new Error( + `The review API returned HTML instead of JSON (status ${res.status}). The server route likely failed before it could return a structured response.` + ) + } + + throw new Error(`Review request failed with status ${res.status}.`) + } + + if (!data || typeof data !== "object") { + throw new Error( + "The review API returned an invalid response. The server may be failing before it can send JSON." + ) + } + + setResult({ + summary: typeof data.summary === "string" ? data.summary : "", + bugs: Array.isArray(data.bugs) ? data.bugs : [], + security: Array.isArray(data.security) ? data.security : [], + style: Array.isArray(data.style) ? data.style : [], + }) + } catch (e: any) { + setError(e.message) + } finally { + setLoading(false) + } + } + + const bugCount = result?.bugs?.length ?? 0 + const securityCount = result?.security?.length ?? 0 + const styleCount = result?.style?.length ?? 0 + const target = owner && repo ? `${owner}/${repo}` : "owner/repo" + const pull = prNumber ? `#${prNumber}` : "#PR" + + return ( + <> +
+
+
+
+ +
+
+ AI Pull Request Review +

Elegant PR reviews, shaped like a modern developer tool.

+

+ Code Review Agent keeps the same Lamatic-backed review flow and + re-presents the output as a cleaner summary plus triage-ready bug, + security, and style cards. +

+
+ + Endpoint + /api/review + + + Output + Summary · Bugs · Security · Style + + + Target + {target} {pull} + +
+
+ +
+
+
+ Review Input +

Analyze a GitHub pull request

+
+ Live Flow +
+ +
) => { + event.preventDefault() + void handleReview() + }} + > + + + +
+ +
+ + +
+ Three inputs in, structured findings out. + + API behavior is unchanged. +
+
+ + {error ? ( +
+ Request failed +

{error}

+
+ ) : null} + + {loading ? ( + + ) : result ? ( +
+
+ + + + +
+ +
+
+
+
+ Summary +

PR overview

+
+
+ {target} + {pull} +
+
+

{result.summary || "No high-level summary was returned for this pull request."}

+
+ +
+ + {bugCount ? ( + result.bugs.map((item, index) => ) + ) : ( +
No bug-level issues were flagged in this review.
+ )} +
+ + + {securityCount ? ( + result.security.map((item, index) => ) + ) : ( +
No security issues were surfaced in this review.
+ )} +
+ + + {styleCount ? ( + result.style.map((item, index) => ( + + )) + ) : ( +
No style suggestions were returned for this review.
+ )} +
+
+
+ ) : ( + + )} +
+
+ + + + ) +} + +function Field({ + className, + label, + placeholder, + value, + onChange, + inputMode, +}: { + className: string + label: string + placeholder: string + value: string + onChange: (value: string) => void + inputMode?: HTMLAttributes["inputMode"] +}) { + return ( + + ) +} + +function StatCard({ label, value, accent }: { label: string; value: string; accent: string }) { + return ( +
+ + {value} + {label} +
+ ) +} + +function ResultCard({ + title, + description, + count, + accent, + children, +}: { + title: string + description: string + count: number + accent: string + children: ReactNode +}) { + return ( +
+
+
+
+

{title}

+

{description}

+
+ {count} +
+
{children}
+
+ ) +} + +function FindingItem({ finding, accent }: { finding: Finding; accent: string }) { + const badge = severityTone(finding.severity) + return ( +
+
+
+ + + {finding.severity || "Unknown"} + +
+ Line {finding.line || "?"} +
+

{finding.issue}

+
+ ) +} + +function StyleSuggestionCard({ text }: { text: string }) { + return ( +
+ +

{text}

+
+ ) +} + +function EmptyState() { + return ( +
+ Ready +

The review surface is standing by.

+

+ Enter a GitHub owner, repository, and pull request number to render the + review in a more structured workspace. +

+
+ + + +
+
+ ) +} + +function Preview({ title, text }: { title: string; text: string }) { + return ( +
+
+

{title}

+

{text}

+
+ ) +} + +function LoadingState() { + return ( +
+
+ +
+ Review In Progress + Scanning the pull request and assembling findings +
+
+
+ {Array.from({ length: 4 }).map((_, index) => ( +
+
+
+
+ ))} +
+
+
+
+
+
+
+
+ {Array.from({ length: 3 }).map((_, index) => ( +
+
+
+
+
+
+ ))} +
+
+ ) +} + +function severityTone(severity: string) { + switch (severity?.toLowerCase()) { + case "critical": + return { background: "rgba(239,68,68,.2)", color: "#fecaca", border: "1px solid rgba(248,113,113,.38)" } + case "high": + return { background: "rgba(248,113,113,.15)", color: "#fca5a5", border: "1px solid rgba(248,113,113,.28)" } + case "medium": + return { background: "rgba(250,204,21,.16)", color: "#fde68a", border: "1px solid rgba(250,204,21,.3)" } + case "low": + return { background: "rgba(148,163,184,.16)", color: "#cbd5e1", border: "1px solid rgba(148,163,184,.24)" } + default: + return { background: "rgba(96,165,250,.16)", color: "#bfdbfe", border: "1px solid rgba(96,165,250,.24)" } + } +} diff --git a/kits/agentic/code-review/components.json b/kits/agentic/code-review/components.json new file mode 100644 index 00000000..4ee62ee1 --- /dev/null +++ b/kits/agentic/code-review/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/kits/agentic/code-review/config.json b/kits/agentic/code-review/config.json new file mode 100644 index 00000000..d586f1a6 --- /dev/null +++ b/kits/agentic/code-review/config.json @@ -0,0 +1,34 @@ +{ + "type": "atomic", + "name": "Code Review Agent", + "description": "Analyzes GitHub PRs for bugs, security vulnerabilities, and style issues using multi-step agentic reasoning.", + "tags": ["Agentic", "Code Review", "Security"], + "flows": { + "code-review-flow": { + "name": "Code Review Flow", + "workflowId": "AGENTIC_GENERATE_CONTENT", + "inputSchema": { "prUrl": "string" }, + "outputSchema": { "summary": "string" } + } + }, + "api": { + "endpoint": "LAMATIC_API_URL", + "projectId": "LAMATIC_PROJECT_ID", + "apiKey": "LAMATIC_API_KEY" + }, + "author": { + "name": "Soumik", + "email": "soumik15630m@example.com" + }, + "steps": [ + { + "id": "code-review-agent", + "type": "mandatory", + "envKey": "AGENTIC_GENERATE_CONTENT" + } + ] + ], + "integrations": ["GitHub", "Groq"], + "demoUrl": "https://agent-kit-stk.vercel.app/", + "githubUrl": "https://github.com/soumik15630m/AgentKit-stk/tree/main/kits/agentic/code-review" +} \ No newline at end of file diff --git a/kits/agentic/code-review/flows/README.md b/kits/agentic/code-review/flows/README.md new file mode 100644 index 00000000..9b8e8bf9 --- /dev/null +++ b/kits/agentic/code-review/flows/README.md @@ -0,0 +1,45 @@ +# Flow Collection + +This collection contains **1 flow(s)** exported from Lamatic. + +## Flows Included + +1. **Code Review Agent** (`flows/code-review-agent/`) + +## Structure + +Each flow is contained in its own directory under `flows/` with the following structure: + +- **config.json** - Complete flow structure with nodes and connections +- **inputs.json** - Private inputs requiring configuration +- **meta.json** - Flow metadata and information +- **README.md** - Flow-specific documentation + +## Usage + +1. Navigate to any flow directory (e.g., `flows/flow-name/`) +2. Review the flow's README.md for specific setup instructions +3. Configure required inputs in `inputs.json` +4. Import the flow into your Lamatic project + +## Contributing + +Help grow the Lamatic ecosystem by contributing these flows to AgentKit! + +1. **Fork the Repository** + - Visit [github.com/Lamatic/AgentKit](https://github.com/Lamatic/AgentKit) + - Fork the repository to your GitHub account + +2. **Prepare Your Submission** + - Each flow should be in its own directory + - Ensure all files are included (`config.json`, `inputs.json`, `meta.json`, `README.md`) + - Review and update README files with comprehensive documentation + +3. **Open a Pull Request** + - Commit your changes with a descriptive message + - Push to your forked repository + - Open a PR to [github.com/Lamatic/AgentKit](https://github.com/Lamatic/AgentKit) + +--- +*Exported from Lamatic Flow Editor* +*Generated on 20/3/2026* diff --git a/kits/agentic/code-review/flows/code-review-agent/README.md b/kits/agentic/code-review/flows/code-review-agent/README.md new file mode 100644 index 00000000..fd50dd88 --- /dev/null +++ b/kits/agentic/code-review/flows/code-review-agent/README.md @@ -0,0 +1,64 @@ +# Code Review Agent + +## About This Flow + +This flow automates a workflow with **8 nodes** working together to process and transform data. The flow is designed to streamline operations and can be easily integrated into your existing systems. + +## Flow Components + +This workflow includes the following node types: +- Webhook +- API +- Code +- Generate JSON +- addNode + +## Configuration Requirements + +This flow requires configuration for **4 node(s)** with private inputs (credentials, API keys, model selections, etc.). All required configurations are documented in the `inputs.json` file. + +## Files Included + +- **config.json** - Complete flow structure with nodes and connections +- **inputs.json** - Private inputs requiring configuration +- **meta.json** - Flow metadata and information + +## Next Steps + +### Share with the Community + +Help grow the Lamatic ecosystem by contributing this flow to AgentKit! + +1. **Fork the Repository** + - Visit [github.com/Lamatic/AgentKit](https://github.com/Lamatic/AgentKit) + - Fork the repository to your GitHub account + +2. **Prepare Your Submission** + - Create a new folder with a descriptive name for your flow + - Add all files from this package (`config.json`, `inputs.json`, `meta.json`) + - Write a comprehensive README.md that includes: + - Clear description of what the flow does + - Use cases and benefits + - Step-by-step setup instructions + - Required credentials and how to obtain them + - Example inputs and expected outputs + - Screenshots or diagrams (optional but recommended) + +3. **Open a Pull Request** + - Commit your changes with a descriptive message + - Push to your forked repository + - Open a PR to [github.com/Lamatic/AgentKit](https://github.com/Lamatic/AgentKit) + - Add a clear description of your flow in the PR + +Your contribution will help others build amazing automations! 🚀 + +## Support + +For questions or issues with this flow: +- Review the node documentation for specific integrations +- Check the Lamatic documentation at docs.lamatic.ai +- Contact support for assistance + +--- +*Exported from Lamatic Flow Editor* +*Generated on 20/3/2026* diff --git a/kits/agentic/code-review/flows/code-review-agent/config.json b/kits/agentic/code-review/flows/code-review-agent/config.json new file mode 100644 index 00000000..92483dd5 --- /dev/null +++ b/kits/agentic/code-review/flows/code-review-agent/config.json @@ -0,0 +1,322 @@ +{ + "nodes": [ + { + "id": "triggerNode_1", + "data": { + "modes": {}, + "nodeId": "webhookTriggerNode", + "schema": { + "repo": "string", + "owner": "string", + "pr_number": "string" + }, + "values": { + "nodeName": "Webhook" + }, + "trigger": true + }, + "type": "triggerNode", + "measured": { + "width": 216, + "height": 93 + }, + "position": { + "x": 0, + "y": 0 + }, + "selected": false + }, + { + "id": "apiNode_688", + "data": { + "label": "New", + "logic": [], + "modes": {}, + "nodeId": "apiNode", + "values": { + "id": "apiNode_688", + "url": "https://api.github.com/repos/{{triggerNode_1.output.owner}}/{{triggerNode_1.output.repo}}/pulls/{{triggerNode_1.output.pr_number}}/files", + "body": "", + "method": "GET", + "headers": "{\"Accept\":\"application/vnd.github.v3+json\",\"User-Agent\":\"code-review-agent\"}", + "retries": "0", + "nodeName": "API", + "retry_delay": "0", + "convertXmlResponseToJson": false + } + }, + "type": "dynamicNode", + "measured": { + "width": 216, + "height": 93 + }, + "position": { + "x": 0, + "y": 130 + }, + "selected": false + }, + { + "id": "codeNode_104", + "data": { + "label": "dynamicNode node", + "logic": [], + "modes": {}, + "nodeId": "codeNode", + "schema": { + "diff": "string" + }, + "values": { + "id": "codeNode_104", + "code": "const files = {{apiNode_688.output}};\nlet diff = \"\";\nfor (const file of files) {\n diff += `File: ${file.filename}\\n${file.patch || \"\"}\\n\\n`;\n}\noutput = { diff: diff };", + "nodeName": "Code" + } + }, + "type": "dynamicNode", + "measured": { + "width": 216, + "height": 93 + }, + "position": { + "x": 0, + "y": 260 + }, + "selected": false + }, + { + "id": "InstructorLLMNode_312", + "data": { + "label": "New", + "modes": {}, + "nodeId": "InstructorLLMNode", + "values": { + "id": "InstructorLLMNode_312", + "tools": [], + "schema": "{\n \"type\": \"object\",\n \"properties\": {\n \"bugs\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"line\": {\n \"type\": \"string\"\n },\n \"issue\": {\n \"type\": \"string\"\n },\n \"severity\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": true\n }\n }\n }\n}", + "prompts": [ + { + "id": "187c2f4b-c23d-4545-abef-73dc897d6b7b", + "role": "system", + "content": "You are an expert code reviewer specializing in finding bugs and logic errors. \nAnalyze the provided GitHub PR diff and identify bugs, null pointer risks, \nincorrect logic, and potential runtime failures. Be precise and reference \nspecific line changes from the diff." + }, + { + "id": "187c2f4b-c23d-4545-abef-73dc897d6b7d", + "role": "user", + "content": "Analyze this PR diff for bugs and logic errors. Reference specific line numbers and code from the diff.\n{{codeNode_104.output.diff}}" + } + ], + "memories": "[]", + "messages": "[]", + "nodeName": "Bug_Analysis", + "attachments": "", + "generativeModelName": "llama-3.3-70b-versatile" + } + }, + "type": "dynamicNode", + "measured": { + "width": 216, + "height": 93 + }, + "position": { + "x": 0, + "y": 390 + }, + "selected": false + }, + { + "id": "InstructorLLMNode_549", + "data": { + "label": "New", + "modes": {}, + "nodeId": "InstructorLLMNode", + "values": { + "id": "InstructorLLMNode_549", + "tools": [], + "schema": "{\n \"type\": \"object\",\n \"properties\": {\n \"security\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"line\": {\n \"type\": \"string\"\n },\n \"issue\": {\n \"type\": \"string\"\n },\n \"severity\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": true\n }\n }\n }\n}", + "prompts": [ + { + "id": "187c2f4b-c23d-4545-abef-73dc897d6b7b", + "role": "system", + "content": "You are a security-focused code reviewer. Analyze GitHub PR diffs for security \nvulnerabilities including hardcoded secrets, SQL injection, XSS risks, insecure \ndependencies, exposed credentials, and unsafe API usage." + }, + { + "id": "187c2f4b-c23d-4545-abef-73dc897d6b7d", + "role": "user", + "content": "Analyze this PR diff for security vulnerabilities. Reference specific line numbers and code from the diff.\n{{codeNode_104.output.diff}}" + } + ], + "memories": "[]", + "messages": "[]", + "nodeName": "Security_Scan", + "attachments": "", + "generativeModelName": "llama-3.3-70b-versatile" + } + }, + "type": "dynamicNode", + "measured": { + "width": 216, + "height": 93 + }, + "position": { + "x": 0, + "y": 520 + }, + "selected": false + }, + { + "id": "InstructorLLMNode_538", + "data": { + "label": "New", + "modes": {}, + "nodeId": "InstructorLLMNode", + "values": { + "id": "InstructorLLMNode_538", + "tools": [], + "schema": "{\n \"type\": \"object\",\n \"properties\": {\n \"style\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n}", + "prompts": [ + { + "id": "187c2f4b-c23d-4545-abef-73dc897d6b7b", + "role": "system", + "content": "You are a code quality reviewer. Analyze GitHub PR diffs for style issues including poor naming conventions, overly complex functions, missing error handling, lack of comments, and readability problems." + }, + { + "id": "187c2f4b-c23d-4545-abef-73dc897d6b7d", + "role": "user", + "content": "Analyze this PR diff for code style and readability issues. Reference specific line numbers and code from the diff. {{codeNode_104.output.diff}}" + } + ], + "memories": "[]", + "messages": "[]", + "nodeName": "Style_Check", + "attachments": "", + "generativeModelName": "llama-3.3-70b-versatile" + } + }, + "type": "dynamicNode", + "measured": { + "width": 216, + "height": 93 + }, + "position": { + "x": 0, + "y": 650 + }, + "selected": true + }, + { + "id": "plus-node-addNode_846235", + "data": { + "label": "+", + "nodeId": "addNode", + "values": {} + }, + "type": "addNode", + "measured": { + "width": 216, + "height": 100 + }, + "position": { + "x": 0, + "y": 910 + } + }, + { + "id": "InstructorLLMNode_481", + "data": { + "label": "New", + "modes": {}, + "nodeId": "InstructorLLMNode", + "values": { + "id": "InstructorLLMNode_481", + "tools": [], + "schema": "{\n \"type\": \"object\",\n \"properties\": {\n \"summary\": {\n \"type\": \"string\"\n }\n }\n}", + "prompts": [ + { + "id": "187c2f4b-c23d-4545-abef-73dc897d6b7b", + "role": "system", + "content": "You are a senior code reviewer. Merge the three analyses provided and write a concise overall summary of the code quality." + }, + { + "id": "187c2f4b-c23d-4545-abef-73dc897d6b7d", + "role": "user", + "content": "BUGS: {{InstructorLLMNode_312.output.bugs}}\nSECURITY: {{InstructorLLMNode_549.output.security}}\nSTYLE: {{InstructorLLMNode_538.output.style}}\nBased on these three code review analyses, write a concise 2-3 sentence overall summary of the PR quality" + } + ], + "memories": "[]", + "messages": "[]", + "nodeName": "Final_Merge", + "attachments": "", + "generativeModelName": "llama-3.3-70b-versatile" + } + }, + "type": "dynamicNode", + "measured": { + "width": 216, + "height": 93 + }, + "position": { + "x": 0, + "y": 780 + }, + "selected": false + } + ], + "edges": [ + { + "id": "InstructorLLMNode_312-InstructorLLMNode_549-380", + "type": "defaultEdge", + "source": "InstructorLLMNode_312", + "target": "InstructorLLMNode_549", + "sourceHandle": "bottom", + "targetHandle": "top" + }, + { + "id": "InstructorLLMNode_549-InstructorLLMNode_538-415", + "type": "defaultEdge", + "source": "InstructorLLMNode_549", + "target": "InstructorLLMNode_538", + "sourceHandle": "bottom", + "targetHandle": "top" + }, + { + "id": "triggerNode_1-apiNode_688-888", + "type": "defaultEdge", + "source": "triggerNode_1", + "target": "apiNode_688", + "sourceHandle": "bottom", + "targetHandle": "top" + }, + { + "id": "apiNode_688-codeNode_104-909", + "type": "defaultEdge", + "source": "apiNode_688", + "target": "codeNode_104", + "sourceHandle": "bottom", + "targetHandle": "top" + }, + { + "id": "codeNode_104-InstructorLLMNode_312-743", + "type": "defaultEdge", + "source": "codeNode_104", + "target": "InstructorLLMNode_312", + "sourceHandle": "bottom", + "targetHandle": "top" + }, + { + "id": "InstructorLLMNode_538-InstructorLLMNode_481-685", + "type": "defaultEdge", + "source": "InstructorLLMNode_538", + "target": "InstructorLLMNode_481", + "sourceHandle": "bottom", + "targetHandle": "top" + }, + { + "id": "InstructorLLMNode_481-plus-node-addNode_846235-985", + "type": "defaultEdge", + "source": "InstructorLLMNode_481", + "target": "plus-node-addNode_846235", + "sourceHandle": "bottom", + "targetHandle": "top" + } + ] +} diff --git a/kits/agentic/code-review/flows/code-review-agent/inputs.json b/kits/agentic/code-review/flows/code-review-agent/inputs.json new file mode 100644 index 00000000..de20dac9 --- /dev/null +++ b/kits/agentic/code-review/flows/code-review-agent/inputs.json @@ -0,0 +1,98 @@ +{ + "InstructorLLMNode_312": [ + { + "name": "generativeModelName", + "label": "Generative Model Name", + "type": "model", + "mode": "instructor", + "description": "Select the model to generate text based on the prompt.", + "modelType": "generator/text", + "required": true, + "isPrivate": true, + "defaultValue": [ + { + "configName": "configA", + "type": "generator/text", + "provider_name": "", + "credential_name": "", + "params": {} + } + ], + "typeOptions": { + "loadOptionsMethod": "listModels" + } + } + ], + "InstructorLLMNode_549": [ + { + "name": "generativeModelName", + "label": "Generative Model Name", + "type": "model", + "mode": "instructor", + "description": "Select the model to generate text based on the prompt.", + "modelType": "generator/text", + "required": true, + "isPrivate": true, + "defaultValue": [ + { + "configName": "configA", + "type": "generator/text", + "provider_name": "", + "credential_name": "", + "params": {} + } + ], + "typeOptions": { + "loadOptionsMethod": "listModels" + } + } + ], + "InstructorLLMNode_538": [ + { + "name": "generativeModelName", + "label": "Generative Model Name", + "type": "model", + "mode": "instructor", + "description": "Select the model to generate text based on the prompt.", + "modelType": "generator/text", + "required": true, + "isPrivate": true, + "defaultValue": [ + { + "configName": "configA", + "type": "generator/text", + "provider_name": "", + "credential_name": "", + "params": {} + } + ], + "typeOptions": { + "loadOptionsMethod": "listModels" + } + } + ], + "InstructorLLMNode_481": [ + { + "name": "generativeModelName", + "label": "Generative Model Name", + "type": "model", + "mode": "instructor", + "description": "Select the model to generate text based on the prompt.", + "modelType": "generator/text", + "required": true, + "isPrivate": true, + "defaultValue": [ + { + "configName": "configA", + "type": "generator/text", + "provider_name": "", + "credential_name": "", + "params": {} + } + ], + "typeOptions": { + "loadOptionsMethod": "listModels" + } + } + ] +} \ No newline at end of file diff --git a/kits/agentic/code-review/flows/code-review-agent/meta.json b/kits/agentic/code-review/flows/code-review-agent/meta.json new file mode 100644 index 00000000..703a622e --- /dev/null +++ b/kits/agentic/code-review/flows/code-review-agent/meta.json @@ -0,0 +1,9 @@ +{ + "name": "Code Review Agent", + "description": "", + "tags": [], + "testInput": "", + "githubUrl": "", + "documentationUrl": "", + "deployUrl": "" +} \ No newline at end of file diff --git a/kits/agentic/code-review/flows/config.json b/kits/agentic/code-review/flows/config.json new file mode 100644 index 00000000..510da8d6 --- /dev/null +++ b/kits/agentic/code-review/flows/config.json @@ -0,0 +1,16 @@ +{ + "name": "Flow Collection - 1 Flows", + "description": "A collection of 1 flows exported from Lamatic", + "tags": [], + "author": { + "name": "Lamatic AI", + "email": "info@lamatic.ai" + }, + "integrations": [], + "features": [], + "demoUrl": "", + "githubUrl": "", + "deployUrl": "", + "documentationUrl": "", + "imageUrl": "" +} diff --git a/kits/agentic/code-review/image.png b/kits/agentic/code-review/image.png new file mode 100644 index 00000000..7ca4a550 Binary files /dev/null and b/kits/agentic/code-review/image.png differ diff --git a/kits/agentic/code-review/lib/lamatic-client.ts b/kits/agentic/code-review/lib/lamatic-client.ts new file mode 100644 index 00000000..1d1c82d8 --- /dev/null +++ b/kits/agentic/code-review/lib/lamatic-client.ts @@ -0,0 +1,18 @@ +import { Lamatic } from "lamatic"; +import {config} from '../orchestrate.js' + +import { Lamatic } from "lamatic"; + +if (!process.env.LAMATIC_API_URL || !process.env.LAMATIC_PROJECT_ID || !process.env.LAMATIC_API_KEY) { + +if (!process.env.LAMATIC_API_URL || !process.env.LAMATIC_PROJECT_ID || !process.env.LAMATIC_API_KEY) { + throw new Error( + "All API Credentials in environment variable are not set. Please add it to your .env.local file." + ); +} + +export const lamaticClient = new Lamatic({ + endpoint: process.env.LAMATIC_API_URL ?? "", + projectId: process.env.LAMATIC_PROJECT_ID ?? null, + apiKey: process.env.LAMATIC_API_KEY ?? "" +}); diff --git a/kits/agentic/code-review/lib/utils.ts b/kits/agentic/code-review/lib/utils.ts new file mode 100644 index 00000000..fed2fe91 --- /dev/null +++ b/kits/agentic/code-review/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/kits/agentic/code-review/next.config.mjs b/kits/agentic/code-review/next.config.mjs new file mode 100644 index 00000000..4cd9948a --- /dev/null +++ b/kits/agentic/code-review/next.config.mjs @@ -0,0 +1,11 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + typescript: { + ignoreBuildErrors: true, + }, + images: { + unoptimized: true, + }, +} + +export default nextConfig diff --git a/kits/agentic/code-review/package-lock.json b/kits/agentic/code-review/package-lock.json new file mode 100644 index 00000000..48f24012 --- /dev/null +++ b/kits/agentic/code-review/package-lock.json @@ -0,0 +1,1627 @@ +{ + "name": "code-review-agent", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "code-review-agent", + "version": "0.1.0", + "dependencies": { + "@tailwindcss/postcss": "^4.2.2", + "next": "^16.2.1", + "postcss": "^8.5.8", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwindcss": "^4.2.2" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.1.tgz", + "integrity": "sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.1.tgz", + "integrity": "sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.1.tgz", + "integrity": "sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.1.tgz", + "integrity": "sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.1.tgz", + "integrity": "sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.1.tgz", + "integrity": "sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.1.tgz", + "integrity": "sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.1.tgz", + "integrity": "sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.1.tgz", + "integrity": "sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz", + "integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "postcss": "^8.5.6", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz", + "integrity": "sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.2.1", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.1.tgz", + "integrity": "sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==", + "license": "MIT", + "dependencies": { + "@next/env": "16.2.1", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.1", + "@next/swc-darwin-x64": "16.2.1", + "@next/swc-linux-arm64-gnu": "16.2.1", + "@next/swc-linux-arm64-musl": "16.2.1", + "@next/swc-linux-x64-gnu": "16.2.1", + "@next/swc-linux-x64-musl": "16.2.1", + "@next/swc-win32-arm64-msvc": "16.2.1", + "@next/swc-win32-x64-msvc": "16.2.1", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/kits/agentic/code-review/package.json b/kits/agentic/code-review/package.json new file mode 100644 index 00000000..de21fa3a --- /dev/null +++ b/kits/agentic/code-review/package.json @@ -0,0 +1,25 @@ +{ + "name": "code-review-agent", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@tailwindcss/postcss": "^4.2.2", + "next": "^16.2.1", + "postcss": "^8.5.8", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwindcss": "^4.2.2" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "typescript": "^5" + } +} diff --git a/kits/agentic/code-review/tsconfig.json b/kits/agentic/code-review/tsconfig.json new file mode 100644 index 00000000..f619795e --- /dev/null +++ b/kits/agentic/code-review/tsconfig.json @@ -0,0 +1,35 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "noEmit": true, + "incremental": true, + "module": "esnext", + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + ".next/types/**/*.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +}