├── auditai-cli
├── .gitignore
├── package.json
├── index.js
├── test.sol
├── src
│ └── ai-prompt.js
├── yarn.lock
└── package-lock.json
├── public
├── audit.png
├── report.png
├── thumbnail.jpg
├── vercel.svg
└── next.svg
├── next.config.mjs
├── postcss.config.mjs
├── utils
├── cn.ts
└── ai-prompt.ts
├── .gitignore
├── components
├── header.tsx
├── contract-input.tsx
├── ui
│ ├── wavy-background.tsx
│ └── placeholders-and-vanish-input.tsx
└── result-modal.tsx
├── tailwind.config.ts
├── app
├── layout.tsx
├── globals.css
└── page.jsx
├── tsconfig.json
├── package.json
├── test.sol
└── README.md
/auditai-cli/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | .env
4 |
--------------------------------------------------------------------------------
/public/audit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mendsalbert/auditra/HEAD/public/audit.png
--------------------------------------------------------------------------------
/public/report.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mendsalbert/auditra/HEAD/public/report.png
--------------------------------------------------------------------------------
/public/thumbnail.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mendsalbert/auditra/HEAD/public/thumbnail.jpg
--------------------------------------------------------------------------------
/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {};
3 |
4 | export default nextConfig;
5 |
--------------------------------------------------------------------------------
/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('postcss-load-config').Config} */
2 | const config = {
3 | plugins: {
4 | tailwindcss: {},
5 | },
6 | };
7 |
8 | export default config;
9 |
--------------------------------------------------------------------------------
/utils/cn.ts:
--------------------------------------------------------------------------------
1 | import { ClassValue, clsx } from "clsx";
2 | import { twMerge } from "tailwind-merge";
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs));
6 | }
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | /node_modules
3 | /.pnp
4 | .pnp.js
5 | .yarn/install-state.gz
6 |
7 | # testing
8 | /coverage
9 |
10 | # next.js
11 | /.next/
12 | /out/
13 |
14 | # production
15 | /build
16 |
17 | # misc
18 | .DS_Store
19 | *.pem
20 |
21 | # debug
22 | npm-debug.log*
23 | yarn-debug.log*
24 | yarn-error.log*
25 |
26 | # local env files
27 | .env*.local
28 | .env
29 | /.env
30 | /env
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
--------------------------------------------------------------------------------
/components/header.tsx:
--------------------------------------------------------------------------------
1 | import { WavyBackground } from "@/components/ui/wavy-background";
2 |
3 | export default function Header() {
4 | return (
5 |
6 |
7 | Auditra, AI Smart Contract Auditor
8 |
9 |
10 | Leverage the power of AI to audit your smart contracts
11 |
12 |
13 | );
14 | }
15 |
--------------------------------------------------------------------------------
/tailwind.config.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from "tailwindcss";
2 |
3 | const config: Config = {
4 | content: [
5 | "./pages/**/*.{js,ts,jsx,tsx,mdx}",
6 | "./components/**/*.{js,ts,jsx,tsx,mdx}",
7 | "./app/**/*.{js,ts,jsx,tsx,mdx}",
8 | ],
9 | theme: {
10 | extend: {
11 | backgroundImage: {
12 | "gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
13 | "gradient-conic":
14 | "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
15 | },
16 | },
17 | },
18 | plugins: [],
19 | };
20 | export default config;
21 |
--------------------------------------------------------------------------------
/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next";
2 | import { Poppins } from "next/font/google";
3 | import "./globals.css";
4 |
5 | const poppins = Poppins({ weight: ["400", "700"], subsets: ["latin"] });
6 |
7 | export const metadata: Metadata = {
8 | title: "Auditra",
9 | description: "AI Smart Contract Auditor",
10 | };
11 |
12 | export default function RootLayout({
13 | children,
14 | }: Readonly<{
15 | children: React.ReactNode;
16 | }>) {
17 | return (
18 |
19 |
{children}
20 |
21 | );
22 | }
23 |
--------------------------------------------------------------------------------
/auditai-cli/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "auditai-cli",
3 | "version": "1.0.5",
4 | "description": "A CLI tool to audit smart contracts using OpenAI",
5 | "main": "index.js",
6 | "bin": {
7 | "auditai": "./index.js"
8 | },
9 | "scripts": {
10 | "start": "node index.js"
11 | },
12 | "keywords": [
13 | "cli",
14 | "smart contract",
15 | "audit",
16 | "openai"
17 | ],
18 | "author": "Your Name",
19 | "license": "MIT",
20 | "dependencies": {
21 | "commander": "^8.0.0",
22 | "dotenv": "^10.0.0",
23 | "inquirer": "^8.0.0",
24 | "openai": "^4.53.0"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | :root {
6 | --foreground-rgb: 0, 0, 0;
7 | --background-start-rgb: 214, 219, 220;
8 | --background-end-rgb: 255, 255, 255;
9 | }
10 |
11 | @media (prefers-color-scheme: dark) {
12 | :root {
13 | --foreground-rgb: 255, 255, 255;
14 | --background-start-rgb: 0, 0, 0;
15 | --background-end-rgb: 0, 0, 0;
16 | }
17 | }
18 |
19 | body {
20 | color: rgb(var(--foreground-rgb));
21 | background: linear-gradient(
22 | to bottom,
23 | transparent,
24 | rgb(var(--background-end-rgb))
25 | )
26 | rgb(var(--background-start-rgb));
27 | }
28 |
29 | @layer utilities {
30 | .text-balance {
31 | text-wrap: balance;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es2020",
4 | "forceConsistentCasingInFileNames": true,
5 | "lib": ["dom", "dom.iterable", "esnext"],
6 | "allowJs": true,
7 | "skipLibCheck": true,
8 | "strict": true,
9 | "noEmit": true,
10 | "esModuleInterop": true,
11 | "module": "esnext",
12 | "moduleResolution": "bundler",
13 | "resolveJsonModule": true,
14 | "isolatedModules": true,
15 | "jsx": "preserve",
16 | "incremental": true,
17 | "plugins": [
18 | {
19 | "name": "next"
20 | }
21 | ],
22 | "paths": {
23 | "@/*": ["./*"]
24 | }
25 | },
26 | "include": [
27 | "next-env.d.ts",
28 | "**/*.ts",
29 | "**/*.tsx",
30 | ".next/types/**/*.ts",
31 | "app/page.jsx",
32 | "auditai-cli/src/auditai.js"
33 | ],
34 | "exclude": ["node_modules"]
35 | }
36 |
--------------------------------------------------------------------------------
/public/next.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useState } from "react";
4 | import Header from "@/components/header";
5 | import ContractInput from "@/components/contract-input";
6 | import ResultsModal from "@/components/result-modal";
7 | import { analyzeContract } from "@/utils/ai-prompt";
8 |
9 | export default function Home() {
10 | const [loading, setLoading] = useState(false);
11 | const [contract, setContract] = useState("");
12 | const [results, setResults] = useState(null);
13 | const [isModalOpen, setIsModalOpen] = useState(false);
14 |
15 | const analyze = async () => {
16 | setIsModalOpen(true);
17 | await analyzeContract(contract, setResults, setLoading);
18 | };
19 |
20 | const fixIssues = async () => {
21 | // const suggestions = results.find(
22 | // (r) => r.section === "Suggestions for Improvement"
23 | // ).details;
24 | // await fixIssues(contract, suggestions, setContract, setLoading);
25 | };
26 |
27 | return (
28 |
29 |
30 |
35 | setIsModalOpen(false)}
38 | loading={loading}
39 | results={results}
40 | fixIssues={fixIssues}
41 | />
42 |
43 | );
44 | }
45 |
--------------------------------------------------------------------------------
/auditai-cli/index.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | const { Command } = require("commander");
4 | const inquirer = require("inquirer");
5 | const { analyzeContract } = require("./src/ai-prompt");
6 | const fs = require("fs");
7 | const path = require("path");
8 | require("dotenv").config();
9 |
10 | const program = new Command();
11 |
12 | program
13 | .name("auditai")
14 | .description("A CLI tool to audit smart contracts using OpenAI")
15 | .version("1.0.0");
16 |
17 | const getApiKey = async () => {
18 | const { apiKey } = await inquirer.prompt([
19 | {
20 | type: "input",
21 | name: "apiKey",
22 | message: "Enter your OpenAI API key:",
23 | validate: (input) => input.length > 0 || "API key is required",
24 | },
25 | ]);
26 | return apiKey;
27 | };
28 |
29 | program
30 | .command("check ")
31 | .description("Analyze a smart contract")
32 | .action(async (file) => {
33 | try {
34 | const apiKey = await getApiKey();
35 |
36 | const contractPath = path.resolve(process.cwd(), file);
37 | console.log(`Checking file at path: ${contractPath}`);
38 |
39 | if (!fs.existsSync(contractPath)) {
40 | console.error(`File not found: ${contractPath}`);
41 | process.exit(1);
42 | }
43 |
44 | if (fs.statSync(contractPath).isDirectory()) {
45 | console.error(`Path is a directory, not a file: ${contractPath}`);
46 | process.exit(1);
47 | }
48 |
49 | const contract = fs.readFileSync(contractPath, "utf8");
50 | await analyzeContract(contract, apiKey);
51 | } catch (error) {
52 | console.error("Error during analysis:", error.message);
53 | }
54 | });
55 |
56 | program.parse(process.argv);
57 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "auditai",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@chainlink/contracts": "^1.1.1",
13 | "@headlessui/react": "^2.0.4",
14 | "@nomicfoundation/hardhat-chai-matchers": "^2.0.6",
15 | "@nomicfoundation/hardhat-ethers": "^3.0.6",
16 | "@nomicfoundation/hardhat-ignition": "^0.15.4",
17 | "@nomicfoundation/hardhat-ignition-ethers": "^0.15.4",
18 | "@nomicfoundation/hardhat-network-helpers": "^1.0.10",
19 | "@nomicfoundation/hardhat-toolbox": "^5.0.0",
20 | "@nomicfoundation/hardhat-verify": "^2.0.7",
21 | "@tabler/icons-react": "^3.11.0",
22 | "@typechain/ethers-v6": "^0.5.1",
23 | "@typechain/hardhat": "^9.1.0",
24 | "@types/prismjs": "^1.26.4",
25 | "auditai-cli": "^1.0.2",
26 | "chai": "4.3.7",
27 | "clsx": "^2.1.1",
28 | "ethers": "5.7.2",
29 | "framer-motion": "^11.2.6",
30 | "hardhat": "^2.22.4",
31 | "hardhat-gas-reporter": "^2.2.0",
32 | "next": "14.2.3",
33 | "openai": "^4.47.1",
34 | "prismjs": "^1.29.0",
35 | "react": "^18",
36 | "react-circular-progressbar": "^2.1.0",
37 | "react-dom": "^18",
38 | "react-simple-code-editor": "^0.14.1",
39 | "react-syntax-highlighter": "^15.5.0",
40 | "simplex-noise": "^4.0.1",
41 | "solidity-coverage": "^0.8.12",
42 | "tailwind-merge": "^2.3.0",
43 | "thirdweb": "5.24.0",
44 | "typechain": "^8.3.2"
45 | },
46 | "devDependencies": {
47 | "@types/node": "^20",
48 | "@types/react": "^18",
49 | "@types/react-dom": "^18",
50 | "postcss": "^8",
51 | "tailwindcss": "^3.4.1",
52 | "typescript": "^5"
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/test.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.0;
3 |
4 | contract AuditAI {
5 | string public name = "AuditAI Token";
6 | string public symbol = "AAT";
7 | uint8 public decimals = 18;
8 | uint256 public totalSupply = 1000000 * 10 ** uint256(decimals);
9 | mapping(address => uint256) public balanceOf;
10 | mapping(address => mapping(address => uint256)) public allowance;
11 |
12 | event Transfer(address indexed from, address indexed to, uint256 value);
13 | event Approval(address indexed owner, address indexed spender, uint256 value);
14 | event SmartContractAudited(address indexed auditor, string contractCode, string auditReport);
15 |
16 | constructor() {
17 | balanceOf[msg.sender] = totalSupply;
18 | }
19 |
20 | function transfer(address _to, uint256 _value) public returns (bool success) {
21 | require(balanceOf[msg.sender] >= _value, "Insufficient balance");
22 | balanceOf[msg.sender] -= _value;
23 | balanceOf[_to] += _value;
24 | emit Transfer(msg.sender, _to, _value);
25 | return true;
26 | }
27 |
28 | function approve(address _spender, uint256 _value) public returns (bool success) {
29 | allowance[msg.sender][_spender] = _value;
30 | emit Approval(msg.sender, _spender, _value);
31 | return true;
32 | }
33 |
34 | function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
35 | require(_value <= balanceOf[_from], "Insufficient balance");
36 | require(_value <= allowance[_from][msg.sender], "Allowance exceeded");
37 | balanceOf[_from] -= _value;
38 | balanceOf[_to] += _value;
39 | allowance[_from][msg.sender] -= _value;
40 | emit Transfer(_from, _to, _value);
41 | return true;
42 | }
43 |
44 | function auditSmartContract(string calldata contractCode, string calldata auditReport) external {
45 | emit SmartContractAudited(msg.sender, contractCode, auditReport);
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/auditai-cli/test.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity ^0.8.0;
3 |
4 | contract AuditAI {
5 | string public name = "AuditAI Token";
6 | string public symbol = "AAT";
7 | uint8 public decimals = 18;
8 | uint256 public totalSupply = 1000000 * 10 ** uint256(decimals);
9 | mapping(address => uint256) public balanceOf;
10 | mapping(address => mapping(address => uint256)) public allowance;
11 |
12 | event Transfer(address indexed from, address indexed to, uint256 value);
13 | event Approval(address indexed owner, address indexed spender, uint256 value);
14 | event SmartContractAudited(address indexed auditor, string contractCode, string auditReport);
15 |
16 | constructor() {
17 | balanceOf[msg.sender] = totalSupply;
18 | }
19 |
20 | function transfer(address _to, uint256 _value) public returns (bool success) {
21 | require(balanceOf[msg.sender] >= _value, "Insufficient balance");
22 | balanceOf[msg.sender] -= _value;
23 | balanceOf[_to] += _value;
24 | emit Transfer(msg.sender, _to, _value);
25 | return true;
26 | }
27 |
28 | function approve(address _spender, uint256 _value) public returns (bool success) {
29 | allowance[msg.sender][_spender] = _value;
30 | emit Approval(msg.sender, _spender, _value);
31 | return true;
32 | }
33 |
34 | function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
35 | require(_value <= balanceOf[_from], "Insufficient balance");
36 | require(_value <= allowance[_from][msg.sender], "Allowance exceeded");
37 | balanceOf[_from] -= _value;
38 | balanceOf[_to] += _value;
39 | allowance[_from][msg.sender] -= _value;
40 | emit Transfer(_from, _to, _value);
41 | return true;
42 | }
43 |
44 | function auditSmartContract(string calldata contractCode, string calldata auditReport) external {
45 | emit SmartContractAudited(msg.sender, contractCode, auditReport);
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/auditai-cli/src/ai-prompt.js:
--------------------------------------------------------------------------------
1 | const OpenAI = require("openai");
2 |
3 | const analyzeContract = async (contract, apiKey) => {
4 | const openai = new OpenAI({
5 | apiKey: apiKey,
6 | });
7 |
8 | const params = {
9 | model: "gpt-3.5-turbo",
10 | messages: [
11 | {
12 | role: "user",
13 | content: `Your role and goal is to be an AI Smart Contract Auditor. Your job is to perform an audit on the given smart contract. Here is the smart contract: ${contract}.
14 | Please provide the results in the following array format for easy front-end display:
15 | [
16 | {
17 | "section": "Audit Report",
18 | "details": "A detailed audit report of the smart contract, covering security, performance, and any other relevant aspects."
19 | },
20 | {
21 | "section": "Metric Scores",
22 | "details": [
23 | {
24 | "metric": "Security",
25 | "score": 0-10
26 | },
27 | {
28 | "metric": "Performance",
29 | "score": 0-10
30 | },
31 | {
32 | "metric": "Other Key Areas",
33 | "score": 0-10
34 | },
35 | {
36 | "metric": "Gas Efficiency",
37 | "score": 0-10
38 | },
39 | {
40 | "metric": "Code Quality",
41 | "score": 0-10
42 | },
43 | {
44 | "metric": "Documentation",
45 | "score": 0-10
46 | }
47 | ]
48 | },
49 | {
50 | "section": "Suggestions for Improvement",
51 | "details": "Suggestions for improving the smart contract in terms of security, performance, and any other identified weaknesses."
52 | }
53 | ]
54 | Thank you.`,
55 | },
56 | ],
57 | };
58 |
59 | const chatCompletion = await openai.chat.completions.create(params);
60 |
61 | const auditResults = JSON.parse(chatCompletion.choices[0].message.content);
62 |
63 | console.log("Audit Report:");
64 | console.log(auditResults.find((r) => r.section === "Audit Report").details);
65 |
66 | console.log("\nMetric Scores:");
67 | auditResults
68 | .find((r) => r.section === "Metric Scores")
69 | .details.forEach((metric) => {
70 | console.log(`${metric.metric}: ${metric.score}/10`);
71 | });
72 |
73 | console.log("\nSuggestions for Improvement:");
74 | console.log(
75 | auditResults.find((r) => r.section === "Suggestions for Improvement")
76 | .details
77 | );
78 | };
79 |
80 | module.exports = { analyzeContract };
81 |
--------------------------------------------------------------------------------
/utils/ai-prompt.ts:
--------------------------------------------------------------------------------
1 | import OpenAI from "openai";
2 |
3 | const apiKey = process.env.NEXT_PUBLIC_API_KEY;
4 |
5 | const openai = new OpenAI({
6 | apiKey: apiKey,
7 | dangerouslyAllowBrowser: true,
8 | });
9 |
10 | export const analyzeContract = async (
11 | contract: string,
12 | setResults: any,
13 | setLoading: any,
14 | auditSmartContract: any
15 | ) => {
16 | setLoading(true);
17 | const chatCompletion = (await openai.chat.completions.create({
18 | messages: [
19 | {
20 | role: "user",
21 | content: `Your role and goal is to be an AI Smart Contract Auditor. Your job is to perform an audit on the given smart contract. Here is the smart contract: ${contract}.
22 |
23 | Please provide the results in the following array format for easy front-end display:
24 |
25 | [
26 | {
27 | "section": "Audit Report",
28 | "details": "A detailed audit report of the smart contract, covering security, performance, and any other relevant aspects."
29 | },
30 | {
31 | "section": "Metric Scores",
32 | "details": [
33 | {
34 | "metric": "Security",
35 | "score": 0-10
36 | },
37 | {
38 | "metric": "Performance",
39 | "score": 0-10
40 | },
41 | {
42 | "metric": "Other Key Areas",
43 | "score": 0-10
44 | },
45 | {
46 | "metric": "Gas Efficiency",
47 | "score": 0-10
48 | },
49 | {
50 | "metric": "Code Quality",
51 | "score": 0-10
52 | },
53 | {
54 | "metric": "Documentation",
55 | "score": 0-10
56 | }
57 | ]
58 | },
59 | {
60 | "section": "Suggestions for Improvement",
61 | "details": "Suggestions for improving the smart contract in terms of security, performance, and any other identified weaknesses."
62 | }
63 | ]
64 |
65 | Thank you.`,
66 | },
67 | ],
68 | model: "gpt-3.5-turbo",
69 | })) as any;
70 |
71 | const auditResults = JSON.parse(chatCompletion.choices[0].message.content);
72 | setResults(auditResults);
73 | setLoading(false);
74 | };
75 |
76 | export const fixIssues = async (
77 | contract: string,
78 | suggestions: string,
79 | setContract: (contract: string) => void,
80 | setLoading: (loading: boolean) => void
81 | ) => {
82 | setLoading(true);
83 |
84 | const response = (await openai.chat.completions.create({
85 | messages: [
86 | {
87 | role: "user",
88 | content: `Here is the smart contract with the following issues: ${suggestions}. Please provide a fixed version of the contract:\n\n${contract}`,
89 | },
90 | ],
91 | model: "gpt-3.5-turbo",
92 | })) as any;
93 |
94 | const fixedContract = response.choices[0].message.content;
95 | setContract(fixedContract.trim());
96 | setLoading(false);
97 | };
98 |
--------------------------------------------------------------------------------
/components/contract-input.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Editor from "react-simple-code-editor";
3 | import Prism from "prismjs";
4 | import "prismjs/components/prism-solidity";
5 | import "prismjs/themes/prism-tomorrow.css"; // Import a Prism theme for styling
6 | import { IconChecklist, IconPaperclip, IconSend } from "@tabler/icons-react";
7 |
8 | interface CustomCodeEditorProps {
9 | contract: string;
10 | setContract: React.Dispatch>;
11 | analyze: () => Promise;
12 | }
13 |
14 | const highlightWithPrism = (code: string) => {
15 | return Prism.highlight(code, Prism.languages.solidity, "solidity");
16 | };
17 |
18 | // Utility function to check if the contract contains the required SPDX license and pragma directive
19 | const isValidSolidityContract = (code: string) => {
20 | const SPDXRegex = /\/\/\s*SPDX-License-Identifier:\s*[^\s]+/;
21 | const pragmaRegex = /pragma\s+solidity\s+[^;]+;/;
22 | return SPDXRegex.test(code) && pragmaRegex.test(code);
23 | };
24 |
25 | const CustomCodeEditor: React.FC = ({
26 | contract,
27 | setContract,
28 | analyze,
29 | }) => {
30 | const handleAnalyze = () => {
31 | if (!isValidSolidityContract(contract)) {
32 | alert(
33 | "The provided code does not appear to be a valid Solidity smart contract. Make sure it starts with the SPDX license identifier and the 'pragma' directive."
34 | );
35 | return;
36 | }
37 | analyze();
38 | };
39 |
40 | return (
41 |
42 |
46 | setContract(code)}
49 | highlight={(code) => highlightWithPrism(code)}
50 | padding={15}
51 | textareaId="code-editor"
52 | className="textarea-editor"
53 | textareaClassName="outline-none "
54 | style={{
55 | fontFamily: ' "Fira Mono", monospace',
56 | fontSize: 17,
57 | minHeight: "100%",
58 | background: "transparent",
59 | color: "inherit",
60 | }}
61 | />
62 |
63 |
64 |
65 |
66 |
67 |
71 |
72 |
73 |
74 |
75 |
76 |
81 | Audit
82 |
83 |
84 |
85 |
86 |
87 |
88 | );
89 | };
90 |
91 | export default CustomCodeEditor;
92 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
AuditAI
15 |
16 |
17 | AuditAI is an innovative tool designed to leverage the power of AI to audit smart contracts. This project uses the OpenAI API to generate detailed audit reports.
18 |
19 |
20 |
21 | ## 📋 Table of Contents
22 |
23 | 1. 🤖 [Introduction](#introduction)
24 | 2. 🔋 [Features](#features)
25 | 3. ⚙️ [Architecture](#architecture)
26 | 4. 🤸 [Setup and Deployment](#setup-and-deployment)
27 | 5. 🚀 [Usage](#usage)
28 | 6. 🤝 [Contributing](#contributing)
29 | 7. 📜 [License](#license)
30 |
31 | ## 🤖 Introduction
32 |
33 | AuditAI provides an easy and efficient way to audit your smart contracts using AI. It interacts with the OpenAI API to analyze and generate detailed reports on the provided smart contract code.
34 |
35 | ## 🔋 Features
36 |
37 | - **AI-Powered Auditing**: Leverages OpenAI to generate comprehensive audit reports.
38 | - **Command Line Tool**: Provides a CLI for easy integration into development workflows.
39 | - **User-Friendly Interface**: Offers an easy-to-use frontend for auditing smart contracts.
40 |
41 | ## ⚙️ Architecture
42 |
43 | 1. **Command Line Tool**: `auditai`
44 | 2. **Frontend**: React-based user interface
45 | 3. **API Integration**: OpenAI API
46 |
47 | ## 🤸 Setup and Deployment
48 |
49 | ### Prerequisites
50 |
51 | - Node.js and npm installed
52 |
53 | ### Steps
54 |
55 | 1. **Clone the Repository**
56 |
57 | ```bash
58 | git clone https://github.com/yourusername/AuditAI.git
59 | cd AuditAI
60 | ```
61 |
62 | 2. **Install Dependencies**
63 |
64 | ```bash
65 | npm install
66 | ```
67 |
68 | 3. **Setup Environment Variables**
69 |
70 | Create a `.env` file in the root directory with the following content:
71 |
72 | ```plaintext
73 | OPENAI_API_KEY=your_openai_api_key
74 | ```
75 |
76 | 4. **Build the Project**
77 |
78 | ```bash
79 | npm run build
80 | ```
81 |
82 | 5. **Install the CLI Globally**
83 |
84 | ```bash
85 | npm install -g .
86 | ```
87 |
88 | ## 🚀 Usage
89 |
90 | ### Using the CLI
91 |
92 | 1. **Analyze a Smart Contract**
93 |
94 | ```bash
95 | auditai check
96 | ```
97 |
98 | ### Using the Frontend
99 |
100 | 1. **Start the Frontend**
101 |
102 | ```bash
103 | npm run dev
104 | ```
105 |
106 | 2. **Connect Wallet**: Connect your MetaMask wallet to the appropriate network.
107 | 3. **Submit Contract Code**: Paste your smart contract code into the provided textarea and click "Analyze".
108 | 4. **View Results**: After analysis, view the detailed audit report and metrics in the modal that appears.
109 |
110 | ## 🤝 Contributing
111 |
112 | Contributions are welcome! Please fork the repository and submit a pull request for any improvements or bug fixes.
113 |
114 | ## 📜 License
115 |
116 | This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
117 |
118 | ```
119 |
120 | This version should display correctly in your README. Adjust any specific details such as image links, repository links, and API keys to match your project.
121 | ```
122 |
--------------------------------------------------------------------------------
/components/ui/wavy-background.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { cn } from "@/utils/cn";
3 | import React, { useEffect, useRef, useState } from "react";
4 | import { createNoise3D } from "simplex-noise";
5 |
6 | export const WavyBackground = ({
7 | children,
8 | className,
9 | containerClassName,
10 | colors,
11 | waveWidth,
12 | backgroundFill,
13 | blur = 10,
14 | speed = "fast",
15 | waveOpacity = 0.5,
16 | ...props
17 | }: {
18 | children?: any;
19 | className?: string;
20 | containerClassName?: string;
21 | colors?: string[];
22 | waveWidth?: number;
23 | backgroundFill?: string;
24 | blur?: number;
25 | speed?: "slow" | "fast";
26 | waveOpacity?: number;
27 | [key: string]: any;
28 | }) => {
29 | const noise = createNoise3D();
30 | let w: number,
31 | h: number,
32 | nt: number,
33 | i: number,
34 | x: number,
35 | ctx: any,
36 | canvas: any;
37 | const canvasRef = useRef(null);
38 | const getSpeed = () => {
39 | switch (speed) {
40 | case "slow":
41 | return 0.001;
42 | case "fast":
43 | return 0.002;
44 | default:
45 | return 0.001;
46 | }
47 | };
48 |
49 | const init = () => {
50 | canvas = canvasRef.current;
51 | ctx = canvas.getContext("2d");
52 | w = ctx.canvas.width = window.innerWidth;
53 | h = ctx.canvas.height = window.innerHeight;
54 | ctx.filter = `blur(${blur}px)`;
55 | nt = 0;
56 | window.onresize = function () {
57 | w = ctx.canvas.width = window.innerWidth;
58 | h = ctx.canvas.height = window.innerHeight;
59 | ctx.filter = `blur(${blur}px)`;
60 | };
61 | render();
62 | };
63 |
64 | const waveColors = colors ?? [
65 | "#38bdf8",
66 | "#818cf8",
67 | "#c084fc",
68 | "#e879f9",
69 | "#22d3ee",
70 | ];
71 | const drawWave = (n: number) => {
72 | nt += getSpeed();
73 | for (i = 0; i < n; i++) {
74 | ctx.beginPath();
75 | ctx.lineWidth = waveWidth || 50;
76 | ctx.strokeStyle = waveColors[i % waveColors.length];
77 | for (x = 0; x < w; x += 5) {
78 | var y = noise(x / 800, 0.3 * i, nt) * 100;
79 | ctx.lineTo(x, y + h * 0.5); // adjust for height, currently at 50% of the container
80 | }
81 | ctx.stroke();
82 | ctx.closePath();
83 | }
84 | };
85 |
86 | let animationId: number;
87 | const render = () => {
88 | ctx.fillStyle = backgroundFill || "black";
89 | ctx.globalAlpha = waveOpacity || 0.5;
90 | ctx.fillRect(0, 0, w, h);
91 | drawWave(5);
92 | animationId = requestAnimationFrame(render);
93 | };
94 |
95 | useEffect(() => {
96 | init();
97 | return () => {
98 | cancelAnimationFrame(animationId);
99 | };
100 | }, []);
101 |
102 | const [isSafari, setIsSafari] = useState(false);
103 | useEffect(() => {
104 | // I'm sorry but i have got to support it on safari.
105 | setIsSafari(
106 | typeof window !== "undefined" &&
107 | navigator.userAgent.includes("Safari") &&
108 | !navigator.userAgent.includes("Chrome")
109 | );
110 | }, []);
111 |
112 | return (
113 |
119 |
127 |
128 | {children}
129 |
130 |
131 | );
132 | };
133 |
--------------------------------------------------------------------------------
/components/ui/placeholders-and-vanish-input.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { AnimatePresence, motion } from "framer-motion";
4 | import { useCallback, useEffect, useRef, useState } from "react";
5 | import { cn } from "@/utils/cn";
6 |
7 | export function PlaceholdersAndVanishTextarea({
8 | placeholders,
9 | onChange,
10 | onSubmit,
11 | }: {
12 | placeholders: string[];
13 | onChange: (e: React.ChangeEvent) => void;
14 | onSubmit: (e: React.FormEvent) => void;
15 | }) {
16 | const [currentPlaceholder, setCurrentPlaceholder] = useState(0);
17 |
18 | useEffect(() => {
19 | let interval: any;
20 | const startAnimation = () => {
21 | interval = setInterval(() => {
22 | setCurrentPlaceholder((prev) => (prev + 1) % placeholders.length);
23 | }, 1500);
24 | };
25 | startAnimation();
26 | return () => clearInterval(interval);
27 | }, [placeholders.length]);
28 |
29 | const canvasRef = useRef(null);
30 | const newDataRef = useRef([]);
31 | const textareaRef = useRef(null);
32 | const [value, setValue] = useState("");
33 | const [animating, setAnimating] = useState(false);
34 |
35 | const draw = useCallback(() => {
36 | if (!textareaRef.current) return;
37 | const canvas = canvasRef.current;
38 | if (!canvas) return;
39 | const ctx = canvas.getContext("2d");
40 | if (!ctx) return;
41 |
42 | canvas.width = 800;
43 | canvas.height = 800;
44 | ctx.clearRect(0, 0, 800, 800);
45 | const computedStyles = getComputedStyle(textareaRef.current);
46 |
47 | const fontSize = parseFloat(computedStyles.getPropertyValue("font-size"));
48 | ctx.font = `${fontSize * 2}px ${computedStyles.fontFamily}`;
49 | ctx.fillStyle = "#FFF";
50 | ctx.fillText(value, 16, 40);
51 |
52 | const imageData = ctx.getImageData(0, 0, 800, 800);
53 | const pixelData = imageData.data;
54 | const newData: any[] = [];
55 |
56 | for (let t = 0; t < 800; t++) {
57 | let i = 4 * t * 800;
58 | for (let n = 0; n < 800; n++) {
59 | let e = i + 4 * n;
60 | if (
61 | pixelData[e] !== 0 &&
62 | pixelData[e + 1] !== 0 &&
63 | pixelData[e + 2] !== 0
64 | ) {
65 | newData.push({
66 | x: n,
67 | y: t,
68 | color: [
69 | pixelData[e],
70 | pixelData[e + 1],
71 | pixelData[e + 2],
72 | pixelData[e + 3],
73 | ],
74 | });
75 | }
76 | }
77 | }
78 |
79 | newDataRef.current = newData.map(({ x, y, color }) => ({
80 | x,
81 | y,
82 | r: 1,
83 | color: `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`,
84 | }));
85 | }, [value]);
86 |
87 | useEffect(() => {
88 | draw();
89 | }, [value, draw]);
90 |
91 | const animate = (start: number) => {
92 | const animateFrame = (pos: number = 0) => {
93 | requestAnimationFrame(() => {
94 | const newArr = [];
95 | for (let i = 0; i < newDataRef.current.length; i++) {
96 | const current = newDataRef.current[i];
97 | if (current.x < pos) {
98 | newArr.push(current);
99 | } else {
100 | if (current.r <= 0) {
101 | current.r = 0;
102 | continue;
103 | }
104 | current.x += Math.random() > 0.5 ? 1 : -1;
105 | current.y += Math.random() > 0.5 ? 1 : -1;
106 | current.r -= 0.05 * Math.random();
107 | newArr.push(current);
108 | }
109 | }
110 | newDataRef.current = newArr;
111 | const ctx = canvasRef.current?.getContext("2d");
112 | if (ctx) {
113 | ctx.clearRect(pos, 0, 800, 800);
114 | newDataRef.current.forEach((t) => {
115 | const { x: n, y: i, r: s, color: color } = t;
116 | if (n > pos) {
117 | ctx.beginPath();
118 | ctx.rect(n, i, s, s);
119 | ctx.fillStyle = color;
120 | ctx.strokeStyle = color;
121 | ctx.stroke();
122 | }
123 | });
124 | }
125 | if (newDataRef.current.length > 0) {
126 | animateFrame(pos - 8);
127 | } else {
128 | setValue("");
129 | setAnimating(false);
130 | }
131 | });
132 | };
133 | animateFrame(start);
134 | };
135 |
136 | const handleKeyDown = (e: React.KeyboardEvent) => {
137 | if (e.key === "Enter" && !animating) {
138 | vanishAndSubmit();
139 | }
140 | };
141 |
142 | const vanishAndSubmit = () => {
143 | setAnimating(true);
144 | draw();
145 |
146 | const value = textareaRef.current?.value || "";
147 | if (value && textareaRef.current) {
148 | const maxX = newDataRef.current.reduce(
149 | (prev, current) => (current.x > prev ? current.x : prev),
150 | 0
151 | );
152 | animate(maxX);
153 | }
154 | };
155 |
156 | const handleSubmit = (e: React.FormEvent) => {
157 | e.preventDefault();
158 | vanishAndSubmit();
159 | onSubmit && onSubmit(e);
160 | };
161 | return (
162 |
259 | );
260 | }
261 |
--------------------------------------------------------------------------------
/components/result-modal.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import { Dialog } from "@headlessui/react";
3 | import {
4 | IconChecklist,
5 | IconCircleCheck,
6 | IconGauge,
7 | IconChevronDown,
8 | IconChevronUp,
9 | IconTool,
10 | } from "@tabler/icons-react";
11 | import { CircularProgressbar, buildStyles } from "react-circular-progressbar";
12 | import "react-circular-progressbar/dist/styles.css";
13 |
14 | interface ResultsModalProps {
15 | isOpen: boolean;
16 | closeModal: () => void;
17 | loading: boolean;
18 | results: any;
19 | fixIssues: () => void;
20 | }
21 |
22 | const ResultsModal: React.FC = ({
23 | isOpen,
24 | closeModal,
25 | loading,
26 | results,
27 | fixIssues,
28 | }) => {
29 | const [expandedSection, setExpandedSection] = useState(null);
30 |
31 | const toggleSection = (section: string) => {
32 | setExpandedSection((prevSection) =>
33 | prevSection === section ? null : section
34 | );
35 | };
36 |
37 | return (
38 |
43 |
44 |
48 | {loading ? (
49 |
50 |
51 |
57 |
65 |
70 |
71 |
72 | Analyzing smart contract...
73 |
74 |
75 |
76 | ) : (
77 | results && (
78 |
79 |
80 |
81 |
82 | Audit Results
83 |
84 |
85 |
86 |
toggleSection("auditReport")}
89 | >
90 |
91 |
92 | Audit Report
93 |
94 | {expandedSection === "auditReport" ? (
95 |
96 | ) : (
97 |
98 | )}
99 |
100 | {expandedSection === "auditReport" && (
101 |
102 | {
103 | results.find((r: any) => r.section === "Audit Report")
104 | .details
105 | }
106 |
107 | )}
108 |
109 |
110 |
toggleSection("metricScores")}
113 | >
114 |
115 |
116 | Metric Scores
117 |
118 | {expandedSection === "metricScores" ? (
119 |
120 | ) : (
121 |
122 | )}
123 |
124 | {expandedSection === "metricScores" && (
125 |
126 | {results
127 | .find((r: any) => r.section === "Metric Scores")
128 | .details.map((metric: any, metricIndex: number) => {
129 | let color;
130 | if (metric.score >= 8) color = "#4caf50"; // green
131 | else if (metric.score < 5) color = "#f44336"; // red
132 | else color = "#ffeb3b"; // yellow
133 | return (
134 |
138 |
139 |
150 |
151 |
152 | {metric.metric}
153 |
154 |
155 | );
156 | })}
157 |
158 | )}
159 |
160 |
161 |
toggleSection("suggestions")}
164 | >
165 |
166 |
167 | Suggestions for Improvement
168 |
169 | {expandedSection === "suggestions" ? (
170 |
171 | ) : (
172 |
173 | )}
174 |
175 | {expandedSection === "suggestions" && (
176 | <>
177 |
178 | {
179 | results.find(
180 | (r: any) =>
181 | r.section === "Suggestions for Improvement"
182 | ).details
183 | }
184 |
185 |
189 |
190 | Fix
191 |
192 | >
193 | )}
194 |
195 |
196 |
200 | Close
201 |
202 |
203 |
204 |
205 | )
206 | )}
207 |
208 |
209 | );
210 | };
211 |
212 | export default ResultsModal;
213 |
--------------------------------------------------------------------------------
/auditai-cli/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@types/node-fetch@^2.6.4":
6 | version "2.6.11"
7 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24"
8 | integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==
9 | dependencies:
10 | "@types/node" "*"
11 | form-data "^4.0.0"
12 |
13 | "@types/node@*":
14 | version "20.14.11"
15 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.11.tgz#09b300423343460455043ddd4d0ded6ac579b74b"
16 | integrity sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==
17 | dependencies:
18 | undici-types "~5.26.4"
19 |
20 | "@types/node@^18.11.18":
21 | version "18.19.41"
22 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.41.tgz#27695cf2cac63f22c202b9217c0bcf3fb192a2f0"
23 | integrity sha512-LX84pRJ+evD2e2nrgYCHObGWkiQJ1mL+meAgbvnwk/US6vmMY7S2ygBTGV2Jw91s9vUsLSXeDEkUHZIJGLrhsg==
24 | dependencies:
25 | undici-types "~5.26.4"
26 |
27 | abort-controller@^3.0.0:
28 | version "3.0.0"
29 | resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
30 | integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
31 | dependencies:
32 | event-target-shim "^5.0.0"
33 |
34 | agentkeepalive@^4.2.1:
35 | version "4.5.0"
36 | resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923"
37 | integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==
38 | dependencies:
39 | humanize-ms "^1.2.1"
40 |
41 | ansi-escapes@^4.2.1:
42 | version "4.3.2"
43 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
44 | integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
45 | dependencies:
46 | type-fest "^0.21.3"
47 |
48 | ansi-regex@^5.0.1:
49 | version "5.0.1"
50 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
51 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
52 |
53 | ansi-styles@^4.0.0, ansi-styles@^4.1.0:
54 | version "4.3.0"
55 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
56 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
57 | dependencies:
58 | color-convert "^2.0.1"
59 |
60 | asynckit@^0.4.0:
61 | version "0.4.0"
62 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
63 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
64 |
65 | base64-js@^1.3.1:
66 | version "1.5.1"
67 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
68 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
69 |
70 | bl@^4.1.0:
71 | version "4.1.0"
72 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
73 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
74 | dependencies:
75 | buffer "^5.5.0"
76 | inherits "^2.0.4"
77 | readable-stream "^3.4.0"
78 |
79 | buffer@^5.5.0:
80 | version "5.7.1"
81 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
82 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
83 | dependencies:
84 | base64-js "^1.3.1"
85 | ieee754 "^1.1.13"
86 |
87 | chalk@^4.1.0, chalk@^4.1.1:
88 | version "4.1.2"
89 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
90 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
91 | dependencies:
92 | ansi-styles "^4.1.0"
93 | supports-color "^7.1.0"
94 |
95 | chardet@^0.7.0:
96 | version "0.7.0"
97 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
98 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
99 |
100 | cli-cursor@^3.1.0:
101 | version "3.1.0"
102 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
103 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
104 | dependencies:
105 | restore-cursor "^3.1.0"
106 |
107 | cli-spinners@^2.5.0:
108 | version "2.9.2"
109 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41"
110 | integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==
111 |
112 | cli-width@^3.0.0:
113 | version "3.0.0"
114 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
115 | integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
116 |
117 | clone@^1.0.2:
118 | version "1.0.4"
119 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
120 | integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
121 |
122 | color-convert@^2.0.1:
123 | version "2.0.1"
124 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
125 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
126 | dependencies:
127 | color-name "~1.1.4"
128 |
129 | color-name@~1.1.4:
130 | version "1.1.4"
131 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
132 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
133 |
134 | combined-stream@^1.0.8:
135 | version "1.0.8"
136 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
137 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
138 | dependencies:
139 | delayed-stream "~1.0.0"
140 |
141 | commander@^8.0.0:
142 | version "8.3.0"
143 | resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
144 | integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
145 |
146 | defaults@^1.0.3:
147 | version "1.0.4"
148 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a"
149 | integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==
150 | dependencies:
151 | clone "^1.0.2"
152 |
153 | delayed-stream@~1.0.0:
154 | version "1.0.0"
155 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
156 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
157 |
158 | dotenv@^10.0.0:
159 | version "10.0.0"
160 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81"
161 | integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==
162 |
163 | emoji-regex@^8.0.0:
164 | version "8.0.0"
165 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
166 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
167 |
168 | escape-string-regexp@^1.0.5:
169 | version "1.0.5"
170 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
171 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
172 |
173 | event-target-shim@^5.0.0:
174 | version "5.0.1"
175 | resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
176 | integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
177 |
178 | external-editor@^3.0.3:
179 | version "3.1.0"
180 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
181 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
182 | dependencies:
183 | chardet "^0.7.0"
184 | iconv-lite "^0.4.24"
185 | tmp "^0.0.33"
186 |
187 | figures@^3.0.0:
188 | version "3.2.0"
189 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
190 | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
191 | dependencies:
192 | escape-string-regexp "^1.0.5"
193 |
194 | form-data-encoder@1.7.2:
195 | version "1.7.2"
196 | resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040"
197 | integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==
198 |
199 | form-data@^4.0.0:
200 | version "4.0.0"
201 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
202 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
203 | dependencies:
204 | asynckit "^0.4.0"
205 | combined-stream "^1.0.8"
206 | mime-types "^2.1.12"
207 |
208 | formdata-node@^4.3.2:
209 | version "4.4.1"
210 | resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2"
211 | integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==
212 | dependencies:
213 | node-domexception "1.0.0"
214 | web-streams-polyfill "4.0.0-beta.3"
215 |
216 | has-flag@^4.0.0:
217 | version "4.0.0"
218 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
219 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
220 |
221 | humanize-ms@^1.2.1:
222 | version "1.2.1"
223 | resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
224 | integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
225 | dependencies:
226 | ms "^2.0.0"
227 |
228 | iconv-lite@^0.4.24:
229 | version "0.4.24"
230 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
231 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
232 | dependencies:
233 | safer-buffer ">= 2.1.2 < 3"
234 |
235 | ieee754@^1.1.13:
236 | version "1.2.1"
237 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
238 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
239 |
240 | inherits@^2.0.3, inherits@^2.0.4:
241 | version "2.0.4"
242 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
243 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
244 |
245 | inquirer@^8.0.0:
246 | version "8.2.6"
247 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562"
248 | integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==
249 | dependencies:
250 | ansi-escapes "^4.2.1"
251 | chalk "^4.1.1"
252 | cli-cursor "^3.1.0"
253 | cli-width "^3.0.0"
254 | external-editor "^3.0.3"
255 | figures "^3.0.0"
256 | lodash "^4.17.21"
257 | mute-stream "0.0.8"
258 | ora "^5.4.1"
259 | run-async "^2.4.0"
260 | rxjs "^7.5.5"
261 | string-width "^4.1.0"
262 | strip-ansi "^6.0.0"
263 | through "^2.3.6"
264 | wrap-ansi "^6.0.1"
265 |
266 | is-fullwidth-code-point@^3.0.0:
267 | version "3.0.0"
268 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
269 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
270 |
271 | is-interactive@^1.0.0:
272 | version "1.0.0"
273 | resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
274 | integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
275 |
276 | is-unicode-supported@^0.1.0:
277 | version "0.1.0"
278 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
279 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
280 |
281 | lodash@^4.17.21:
282 | version "4.17.21"
283 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
284 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
285 |
286 | log-symbols@^4.1.0:
287 | version "4.1.0"
288 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
289 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
290 | dependencies:
291 | chalk "^4.1.0"
292 | is-unicode-supported "^0.1.0"
293 |
294 | mime-db@1.52.0:
295 | version "1.52.0"
296 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
297 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
298 |
299 | mime-types@^2.1.12:
300 | version "2.1.35"
301 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
302 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
303 | dependencies:
304 | mime-db "1.52.0"
305 |
306 | mimic-fn@^2.1.0:
307 | version "2.1.0"
308 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
309 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
310 |
311 | ms@^2.0.0:
312 | version "2.1.3"
313 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
314 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
315 |
316 | mute-stream@0.0.8:
317 | version "0.0.8"
318 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
319 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
320 |
321 | node-domexception@1.0.0:
322 | version "1.0.0"
323 | resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
324 | integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
325 |
326 | node-fetch@^2.6.7:
327 | version "2.7.0"
328 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
329 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
330 | dependencies:
331 | whatwg-url "^5.0.0"
332 |
333 | onetime@^5.1.0:
334 | version "5.1.2"
335 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
336 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
337 | dependencies:
338 | mimic-fn "^2.1.0"
339 |
340 | openai@^4.53.0:
341 | version "4.53.0"
342 | resolved "https://registry.yarnpkg.com/openai/-/openai-4.53.0.tgz#5ac6fc2ba1bba239a31c910bd57d793814bea61d"
343 | integrity sha512-XoMaJsSLuedW5eoMEMmZbdNoXgML3ujcU5KfwRnC6rnbmZkHE2Q4J/SArwhqCxQRqJwHnQUj1LpiROmKPExZJA==
344 | dependencies:
345 | "@types/node" "^18.11.18"
346 | "@types/node-fetch" "^2.6.4"
347 | abort-controller "^3.0.0"
348 | agentkeepalive "^4.2.1"
349 | form-data-encoder "1.7.2"
350 | formdata-node "^4.3.2"
351 | node-fetch "^2.6.7"
352 | web-streams-polyfill "^3.2.1"
353 |
354 | ora@^5.4.1:
355 | version "5.4.1"
356 | resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
357 | integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
358 | dependencies:
359 | bl "^4.1.0"
360 | chalk "^4.1.0"
361 | cli-cursor "^3.1.0"
362 | cli-spinners "^2.5.0"
363 | is-interactive "^1.0.0"
364 | is-unicode-supported "^0.1.0"
365 | log-symbols "^4.1.0"
366 | strip-ansi "^6.0.0"
367 | wcwidth "^1.0.1"
368 |
369 | os-tmpdir@~1.0.2:
370 | version "1.0.2"
371 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
372 | integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
373 |
374 | readable-stream@^3.4.0:
375 | version "3.6.2"
376 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
377 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
378 | dependencies:
379 | inherits "^2.0.3"
380 | string_decoder "^1.1.1"
381 | util-deprecate "^1.0.1"
382 |
383 | restore-cursor@^3.1.0:
384 | version "3.1.0"
385 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
386 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
387 | dependencies:
388 | onetime "^5.1.0"
389 | signal-exit "^3.0.2"
390 |
391 | run-async@^2.4.0:
392 | version "2.4.1"
393 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
394 | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
395 |
396 | rxjs@^7.5.5:
397 | version "7.8.1"
398 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543"
399 | integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
400 | dependencies:
401 | tslib "^2.1.0"
402 |
403 | safe-buffer@~5.2.0:
404 | version "5.2.1"
405 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
406 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
407 |
408 | "safer-buffer@>= 2.1.2 < 3":
409 | version "2.1.2"
410 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
411 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
412 |
413 | signal-exit@^3.0.2:
414 | version "3.0.7"
415 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
416 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
417 |
418 | string-width@^4.1.0:
419 | version "4.2.3"
420 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
421 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
422 | dependencies:
423 | emoji-regex "^8.0.0"
424 | is-fullwidth-code-point "^3.0.0"
425 | strip-ansi "^6.0.1"
426 |
427 | string_decoder@^1.1.1:
428 | version "1.3.0"
429 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
430 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
431 | dependencies:
432 | safe-buffer "~5.2.0"
433 |
434 | strip-ansi@^6.0.0, strip-ansi@^6.0.1:
435 | version "6.0.1"
436 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
437 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
438 | dependencies:
439 | ansi-regex "^5.0.1"
440 |
441 | supports-color@^7.1.0:
442 | version "7.2.0"
443 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
444 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
445 | dependencies:
446 | has-flag "^4.0.0"
447 |
448 | through@^2.3.6:
449 | version "2.3.8"
450 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
451 | integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
452 |
453 | tmp@^0.0.33:
454 | version "0.0.33"
455 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
456 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
457 | dependencies:
458 | os-tmpdir "~1.0.2"
459 |
460 | tr46@~0.0.3:
461 | version "0.0.3"
462 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
463 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
464 |
465 | tslib@^2.1.0:
466 | version "2.6.3"
467 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
468 | integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
469 |
470 | type-fest@^0.21.3:
471 | version "0.21.3"
472 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
473 | integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
474 |
475 | undici-types@~5.26.4:
476 | version "5.26.5"
477 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
478 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
479 |
480 | util-deprecate@^1.0.1:
481 | version "1.0.2"
482 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
483 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
484 |
485 | wcwidth@^1.0.1:
486 | version "1.0.1"
487 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
488 | integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==
489 | dependencies:
490 | defaults "^1.0.3"
491 |
492 | web-streams-polyfill@4.0.0-beta.3:
493 | version "4.0.0-beta.3"
494 | resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38"
495 | integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==
496 |
497 | web-streams-polyfill@^3.2.1:
498 | version "3.3.3"
499 | resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b"
500 | integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==
501 |
502 | webidl-conversions@^3.0.0:
503 | version "3.0.1"
504 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
505 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
506 |
507 | whatwg-url@^5.0.0:
508 | version "5.0.0"
509 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
510 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
511 | dependencies:
512 | tr46 "~0.0.3"
513 | webidl-conversions "^3.0.0"
514 |
515 | wrap-ansi@^6.0.1:
516 | version "6.2.0"
517 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
518 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
519 | dependencies:
520 | ansi-styles "^4.0.0"
521 | string-width "^4.1.0"
522 | strip-ansi "^6.0.0"
523 |
--------------------------------------------------------------------------------
/auditai-cli/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "auditai-cli",
3 | "version": "1.0.4",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "auditai-cli",
9 | "version": "1.0.4",
10 | "license": "MIT",
11 | "dependencies": {
12 | "commander": "^8.0.0",
13 | "dotenv": "^10.0.0",
14 | "inquirer": "^8.2.6",
15 | "openai": "^3.0.0"
16 | },
17 | "bin": {
18 | "auditai": "index.js"
19 | }
20 | },
21 | "node_modules/ansi-escapes": {
22 | "version": "4.3.2",
23 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
24 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
25 | "dependencies": {
26 | "type-fest": "^0.21.3"
27 | },
28 | "engines": {
29 | "node": ">=8"
30 | },
31 | "funding": {
32 | "url": "https://github.com/sponsors/sindresorhus"
33 | }
34 | },
35 | "node_modules/ansi-regex": {
36 | "version": "5.0.1",
37 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
38 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
39 | "engines": {
40 | "node": ">=8"
41 | }
42 | },
43 | "node_modules/ansi-styles": {
44 | "version": "4.3.0",
45 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
46 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
47 | "dependencies": {
48 | "color-convert": "^2.0.1"
49 | },
50 | "engines": {
51 | "node": ">=8"
52 | },
53 | "funding": {
54 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
55 | }
56 | },
57 | "node_modules/asynckit": {
58 | "version": "0.4.0",
59 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
60 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
61 | },
62 | "node_modules/axios": {
63 | "version": "0.26.1",
64 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
65 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
66 | "dependencies": {
67 | "follow-redirects": "^1.14.8"
68 | }
69 | },
70 | "node_modules/base64-js": {
71 | "version": "1.5.1",
72 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
73 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
74 | "funding": [
75 | {
76 | "type": "github",
77 | "url": "https://github.com/sponsors/feross"
78 | },
79 | {
80 | "type": "patreon",
81 | "url": "https://www.patreon.com/feross"
82 | },
83 | {
84 | "type": "consulting",
85 | "url": "https://feross.org/support"
86 | }
87 | ]
88 | },
89 | "node_modules/bl": {
90 | "version": "4.1.0",
91 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
92 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
93 | "dependencies": {
94 | "buffer": "^5.5.0",
95 | "inherits": "^2.0.4",
96 | "readable-stream": "^3.4.0"
97 | }
98 | },
99 | "node_modules/buffer": {
100 | "version": "5.7.1",
101 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
102 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
103 | "funding": [
104 | {
105 | "type": "github",
106 | "url": "https://github.com/sponsors/feross"
107 | },
108 | {
109 | "type": "patreon",
110 | "url": "https://www.patreon.com/feross"
111 | },
112 | {
113 | "type": "consulting",
114 | "url": "https://feross.org/support"
115 | }
116 | ],
117 | "dependencies": {
118 | "base64-js": "^1.3.1",
119 | "ieee754": "^1.1.13"
120 | }
121 | },
122 | "node_modules/chalk": {
123 | "version": "4.1.2",
124 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
125 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
126 | "dependencies": {
127 | "ansi-styles": "^4.1.0",
128 | "supports-color": "^7.1.0"
129 | },
130 | "engines": {
131 | "node": ">=10"
132 | },
133 | "funding": {
134 | "url": "https://github.com/chalk/chalk?sponsor=1"
135 | }
136 | },
137 | "node_modules/chardet": {
138 | "version": "0.7.0",
139 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
140 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
141 | },
142 | "node_modules/cli-cursor": {
143 | "version": "3.1.0",
144 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
145 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
146 | "dependencies": {
147 | "restore-cursor": "^3.1.0"
148 | },
149 | "engines": {
150 | "node": ">=8"
151 | }
152 | },
153 | "node_modules/cli-spinners": {
154 | "version": "2.9.2",
155 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
156 | "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
157 | "engines": {
158 | "node": ">=6"
159 | },
160 | "funding": {
161 | "url": "https://github.com/sponsors/sindresorhus"
162 | }
163 | },
164 | "node_modules/cli-width": {
165 | "version": "3.0.0",
166 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
167 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
168 | "engines": {
169 | "node": ">= 10"
170 | }
171 | },
172 | "node_modules/clone": {
173 | "version": "1.0.4",
174 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
175 | "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
176 | "engines": {
177 | "node": ">=0.8"
178 | }
179 | },
180 | "node_modules/color-convert": {
181 | "version": "2.0.1",
182 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
183 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
184 | "dependencies": {
185 | "color-name": "~1.1.4"
186 | },
187 | "engines": {
188 | "node": ">=7.0.0"
189 | }
190 | },
191 | "node_modules/color-name": {
192 | "version": "1.1.4",
193 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
194 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
195 | },
196 | "node_modules/combined-stream": {
197 | "version": "1.0.8",
198 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
199 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
200 | "dependencies": {
201 | "delayed-stream": "~1.0.0"
202 | },
203 | "engines": {
204 | "node": ">= 0.8"
205 | }
206 | },
207 | "node_modules/commander": {
208 | "version": "8.3.0",
209 | "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
210 | "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
211 | "engines": {
212 | "node": ">= 12"
213 | }
214 | },
215 | "node_modules/defaults": {
216 | "version": "1.0.4",
217 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
218 | "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
219 | "dependencies": {
220 | "clone": "^1.0.2"
221 | },
222 | "funding": {
223 | "url": "https://github.com/sponsors/sindresorhus"
224 | }
225 | },
226 | "node_modules/delayed-stream": {
227 | "version": "1.0.0",
228 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
229 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
230 | "engines": {
231 | "node": ">=0.4.0"
232 | }
233 | },
234 | "node_modules/dotenv": {
235 | "version": "10.0.0",
236 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
237 | "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
238 | "engines": {
239 | "node": ">=10"
240 | }
241 | },
242 | "node_modules/emoji-regex": {
243 | "version": "8.0.0",
244 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
245 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
246 | },
247 | "node_modules/escape-string-regexp": {
248 | "version": "1.0.5",
249 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
250 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
251 | "engines": {
252 | "node": ">=0.8.0"
253 | }
254 | },
255 | "node_modules/external-editor": {
256 | "version": "3.1.0",
257 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
258 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
259 | "dependencies": {
260 | "chardet": "^0.7.0",
261 | "iconv-lite": "^0.4.24",
262 | "tmp": "^0.0.33"
263 | },
264 | "engines": {
265 | "node": ">=4"
266 | }
267 | },
268 | "node_modules/figures": {
269 | "version": "3.2.0",
270 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
271 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
272 | "dependencies": {
273 | "escape-string-regexp": "^1.0.5"
274 | },
275 | "engines": {
276 | "node": ">=8"
277 | },
278 | "funding": {
279 | "url": "https://github.com/sponsors/sindresorhus"
280 | }
281 | },
282 | "node_modules/follow-redirects": {
283 | "version": "1.15.6",
284 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
285 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
286 | "funding": [
287 | {
288 | "type": "individual",
289 | "url": "https://github.com/sponsors/RubenVerborgh"
290 | }
291 | ],
292 | "engines": {
293 | "node": ">=4.0"
294 | },
295 | "peerDependenciesMeta": {
296 | "debug": {
297 | "optional": true
298 | }
299 | }
300 | },
301 | "node_modules/form-data": {
302 | "version": "4.0.0",
303 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
304 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
305 | "dependencies": {
306 | "asynckit": "^0.4.0",
307 | "combined-stream": "^1.0.8",
308 | "mime-types": "^2.1.12"
309 | },
310 | "engines": {
311 | "node": ">= 6"
312 | }
313 | },
314 | "node_modules/has-flag": {
315 | "version": "4.0.0",
316 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
317 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
318 | "engines": {
319 | "node": ">=8"
320 | }
321 | },
322 | "node_modules/iconv-lite": {
323 | "version": "0.4.24",
324 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
325 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
326 | "dependencies": {
327 | "safer-buffer": ">= 2.1.2 < 3"
328 | },
329 | "engines": {
330 | "node": ">=0.10.0"
331 | }
332 | },
333 | "node_modules/ieee754": {
334 | "version": "1.2.1",
335 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
336 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
337 | "funding": [
338 | {
339 | "type": "github",
340 | "url": "https://github.com/sponsors/feross"
341 | },
342 | {
343 | "type": "patreon",
344 | "url": "https://www.patreon.com/feross"
345 | },
346 | {
347 | "type": "consulting",
348 | "url": "https://feross.org/support"
349 | }
350 | ]
351 | },
352 | "node_modules/inherits": {
353 | "version": "2.0.4",
354 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
355 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
356 | },
357 | "node_modules/inquirer": {
358 | "version": "8.2.6",
359 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz",
360 | "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==",
361 | "dependencies": {
362 | "ansi-escapes": "^4.2.1",
363 | "chalk": "^4.1.1",
364 | "cli-cursor": "^3.1.0",
365 | "cli-width": "^3.0.0",
366 | "external-editor": "^3.0.3",
367 | "figures": "^3.0.0",
368 | "lodash": "^4.17.21",
369 | "mute-stream": "0.0.8",
370 | "ora": "^5.4.1",
371 | "run-async": "^2.4.0",
372 | "rxjs": "^7.5.5",
373 | "string-width": "^4.1.0",
374 | "strip-ansi": "^6.0.0",
375 | "through": "^2.3.6",
376 | "wrap-ansi": "^6.0.1"
377 | },
378 | "engines": {
379 | "node": ">=12.0.0"
380 | }
381 | },
382 | "node_modules/is-fullwidth-code-point": {
383 | "version": "3.0.0",
384 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
385 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
386 | "engines": {
387 | "node": ">=8"
388 | }
389 | },
390 | "node_modules/is-interactive": {
391 | "version": "1.0.0",
392 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
393 | "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
394 | "engines": {
395 | "node": ">=8"
396 | }
397 | },
398 | "node_modules/is-unicode-supported": {
399 | "version": "0.1.0",
400 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
401 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
402 | "engines": {
403 | "node": ">=10"
404 | },
405 | "funding": {
406 | "url": "https://github.com/sponsors/sindresorhus"
407 | }
408 | },
409 | "node_modules/lodash": {
410 | "version": "4.17.21",
411 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
412 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
413 | },
414 | "node_modules/log-symbols": {
415 | "version": "4.1.0",
416 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
417 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
418 | "dependencies": {
419 | "chalk": "^4.1.0",
420 | "is-unicode-supported": "^0.1.0"
421 | },
422 | "engines": {
423 | "node": ">=10"
424 | },
425 | "funding": {
426 | "url": "https://github.com/sponsors/sindresorhus"
427 | }
428 | },
429 | "node_modules/mime-db": {
430 | "version": "1.52.0",
431 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
432 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
433 | "engines": {
434 | "node": ">= 0.6"
435 | }
436 | },
437 | "node_modules/mime-types": {
438 | "version": "2.1.35",
439 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
440 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
441 | "dependencies": {
442 | "mime-db": "1.52.0"
443 | },
444 | "engines": {
445 | "node": ">= 0.6"
446 | }
447 | },
448 | "node_modules/mimic-fn": {
449 | "version": "2.1.0",
450 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
451 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
452 | "engines": {
453 | "node": ">=6"
454 | }
455 | },
456 | "node_modules/mute-stream": {
457 | "version": "0.0.8",
458 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
459 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
460 | },
461 | "node_modules/onetime": {
462 | "version": "5.1.2",
463 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
464 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
465 | "dependencies": {
466 | "mimic-fn": "^2.1.0"
467 | },
468 | "engines": {
469 | "node": ">=6"
470 | },
471 | "funding": {
472 | "url": "https://github.com/sponsors/sindresorhus"
473 | }
474 | },
475 | "node_modules/openai": {
476 | "version": "3.3.0",
477 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.3.0.tgz",
478 | "integrity": "sha512-uqxI/Au+aPRnsaQRe8CojU0eCR7I0mBiKjD3sNMzY6DaC1ZVrc85u98mtJW6voDug8fgGN+DIZmTDxTthxb7dQ==",
479 | "dependencies": {
480 | "axios": "^0.26.0",
481 | "form-data": "^4.0.0"
482 | }
483 | },
484 | "node_modules/ora": {
485 | "version": "5.4.1",
486 | "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
487 | "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
488 | "dependencies": {
489 | "bl": "^4.1.0",
490 | "chalk": "^4.1.0",
491 | "cli-cursor": "^3.1.0",
492 | "cli-spinners": "^2.5.0",
493 | "is-interactive": "^1.0.0",
494 | "is-unicode-supported": "^0.1.0",
495 | "log-symbols": "^4.1.0",
496 | "strip-ansi": "^6.0.0",
497 | "wcwidth": "^1.0.1"
498 | },
499 | "engines": {
500 | "node": ">=10"
501 | },
502 | "funding": {
503 | "url": "https://github.com/sponsors/sindresorhus"
504 | }
505 | },
506 | "node_modules/os-tmpdir": {
507 | "version": "1.0.2",
508 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
509 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
510 | "engines": {
511 | "node": ">=0.10.0"
512 | }
513 | },
514 | "node_modules/readable-stream": {
515 | "version": "3.6.2",
516 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
517 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
518 | "dependencies": {
519 | "inherits": "^2.0.3",
520 | "string_decoder": "^1.1.1",
521 | "util-deprecate": "^1.0.1"
522 | },
523 | "engines": {
524 | "node": ">= 6"
525 | }
526 | },
527 | "node_modules/restore-cursor": {
528 | "version": "3.1.0",
529 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
530 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
531 | "dependencies": {
532 | "onetime": "^5.1.0",
533 | "signal-exit": "^3.0.2"
534 | },
535 | "engines": {
536 | "node": ">=8"
537 | }
538 | },
539 | "node_modules/run-async": {
540 | "version": "2.4.1",
541 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
542 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
543 | "engines": {
544 | "node": ">=0.12.0"
545 | }
546 | },
547 | "node_modules/rxjs": {
548 | "version": "7.8.1",
549 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
550 | "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
551 | "dependencies": {
552 | "tslib": "^2.1.0"
553 | }
554 | },
555 | "node_modules/safe-buffer": {
556 | "version": "5.2.1",
557 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
558 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
559 | "funding": [
560 | {
561 | "type": "github",
562 | "url": "https://github.com/sponsors/feross"
563 | },
564 | {
565 | "type": "patreon",
566 | "url": "https://www.patreon.com/feross"
567 | },
568 | {
569 | "type": "consulting",
570 | "url": "https://feross.org/support"
571 | }
572 | ]
573 | },
574 | "node_modules/safer-buffer": {
575 | "version": "2.1.2",
576 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
577 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
578 | },
579 | "node_modules/signal-exit": {
580 | "version": "3.0.7",
581 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
582 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
583 | },
584 | "node_modules/string_decoder": {
585 | "version": "1.3.0",
586 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
587 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
588 | "dependencies": {
589 | "safe-buffer": "~5.2.0"
590 | }
591 | },
592 | "node_modules/string-width": {
593 | "version": "4.2.3",
594 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
595 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
596 | "dependencies": {
597 | "emoji-regex": "^8.0.0",
598 | "is-fullwidth-code-point": "^3.0.0",
599 | "strip-ansi": "^6.0.1"
600 | },
601 | "engines": {
602 | "node": ">=8"
603 | }
604 | },
605 | "node_modules/strip-ansi": {
606 | "version": "6.0.1",
607 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
608 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
609 | "dependencies": {
610 | "ansi-regex": "^5.0.1"
611 | },
612 | "engines": {
613 | "node": ">=8"
614 | }
615 | },
616 | "node_modules/supports-color": {
617 | "version": "7.2.0",
618 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
619 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
620 | "dependencies": {
621 | "has-flag": "^4.0.0"
622 | },
623 | "engines": {
624 | "node": ">=8"
625 | }
626 | },
627 | "node_modules/through": {
628 | "version": "2.3.8",
629 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
630 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
631 | },
632 | "node_modules/tmp": {
633 | "version": "0.0.33",
634 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
635 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
636 | "dependencies": {
637 | "os-tmpdir": "~1.0.2"
638 | },
639 | "engines": {
640 | "node": ">=0.6.0"
641 | }
642 | },
643 | "node_modules/tslib": {
644 | "version": "2.6.3",
645 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
646 | "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
647 | },
648 | "node_modules/type-fest": {
649 | "version": "0.21.3",
650 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
651 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
652 | "engines": {
653 | "node": ">=10"
654 | },
655 | "funding": {
656 | "url": "https://github.com/sponsors/sindresorhus"
657 | }
658 | },
659 | "node_modules/util-deprecate": {
660 | "version": "1.0.2",
661 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
662 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
663 | },
664 | "node_modules/wcwidth": {
665 | "version": "1.0.1",
666 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
667 | "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
668 | "dependencies": {
669 | "defaults": "^1.0.3"
670 | }
671 | },
672 | "node_modules/wrap-ansi": {
673 | "version": "6.2.0",
674 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
675 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
676 | "dependencies": {
677 | "ansi-styles": "^4.0.0",
678 | "string-width": "^4.1.0",
679 | "strip-ansi": "^6.0.0"
680 | },
681 | "engines": {
682 | "node": ">=8"
683 | }
684 | }
685 | }
686 | }
687 |
--------------------------------------------------------------------------------