From 41e3c4f6bdf3076bbded57067fca71d1fb5fb624 Mon Sep 17 00:00:00 2001 From: Toran Bruce Richards Date: Thu, 26 Sep 2024 15:20:05 +0100 Subject: [PATCH 001/155] Feat(Builder): Enhance AITextSummarizerBlock with configurable summary style and focus (#8165) * feat(platform): Enhance AITextSummarizerBlock with configurable summary style and focus The AITextSummarizerBlock in the autogpt_platform/backend/backend/blocks/llm.py file has been enhanced to include the following changes: - Added a new enum class, SummaryStyle, with options for concise, detailed, bullet points, and numbered list styles. - Added a new input parameter, focus, to specify the topic of the summary. - Modified the _summarize_chunk method to include the style and focus in the prompt. - Modified the _combine_summaries method to include the style and focus in the prompt. These changes allow users to customize the style and focus of the generated summaries, providing more flexibility and control. * run formatting and linting --- autogpt_platform/backend/backend/blocks/llm.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/autogpt_platform/backend/backend/blocks/llm.py b/autogpt_platform/backend/backend/blocks/llm.py index bafbaba0fb..f510d680f5 100644 --- a/autogpt_platform/backend/backend/blocks/llm.py +++ b/autogpt_platform/backend/backend/blocks/llm.py @@ -362,6 +362,13 @@ class AITextGeneratorBlock(Block): yield "error", str(e) +class SummaryStyle(Enum): + CONCISE = "concise" + DETAILED = "detailed" + BULLET_POINTS = "bullet points" + NUMBERED_LIST = "numbered list" + + class AITextSummarizerBlock(Block): class Input(BlockSchema): text: str @@ -370,6 +377,8 @@ class AITextSummarizerBlock(Block): default=LlmModel.GPT4_TURBO, description="The language model to use for summarizing the text.", ) + focus: str = "general information" + style: SummaryStyle = SummaryStyle.CONCISE api_key: BlockSecret = SecretField(value="") # TODO: Make this dynamic max_tokens: int = 4000 # Adjust based on the model's context window @@ -440,7 +449,7 @@ class AITextSummarizerBlock(Block): raise ValueError("Failed to get a response from the LLM.") def _summarize_chunk(self, chunk: str, input_data: Input) -> str: - prompt = f"Summarize the following text concisely:\n\n{chunk}" + prompt = f"Summarize the following text in a {input_data.style} form. Focus your summary on the topic of `{input_data.focus}` if present, otherwise just provide a general summary:\n\n```{chunk}```" llm_response = self.llm_call( AIStructuredResponseGeneratorBlock.Input( @@ -454,13 +463,10 @@ class AITextSummarizerBlock(Block): return llm_response["summary"] def _combine_summaries(self, summaries: list[str], input_data: Input) -> str: - combined_text = " ".join(summaries) + combined_text = "\n\n".join(summaries) if len(combined_text.split()) <= input_data.max_tokens: - prompt = ( - "Provide a final, concise summary of the following summaries:\n\n" - + combined_text - ) + prompt = f"Provide a final summary of the following section summaries in a {input_data.style} form, focus your summary on the topic of `{input_data.focus}` if present:\n\n ```{combined_text}```\n\n Just respond with the final_summary in the format specified." llm_response = self.llm_call( AIStructuredResponseGeneratorBlock.Input( From beedc4b9714c68d9a662615e44f585ab5982860f Mon Sep 17 00:00:00 2001 From: Swifty Date: Thu, 26 Sep 2024 17:09:01 +0200 Subject: [PATCH 002/155] tweak(platform): Updated onOpenChange code style (#8187) --- .../frontend/src/components/edit/control/BlocksControl.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx index e09017fefd..cfea589964 100644 --- a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx +++ b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx @@ -77,11 +77,7 @@ export const BlocksControl: React.FC = ({ return ( { - if (!open) { - resetFilters(); - } - }} + onOpenChange={(open) => open || resetFilters()} > From 351fdcef3281bb75492d736547808ecac9d4bd51 Mon Sep 17 00:00:00 2001 From: Toran Bruce Richards Date: Thu, 26 Sep 2024 16:25:12 +0100 Subject: [PATCH 003/155] Update broken link in setup.md --- docs/content/server/setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/server/setup.md b/docs/content/server/setup.md index 3a33fc781f..af05b4d97f 100644 --- a/docs/content/server/setup.md +++ b/docs/content/server/setup.md @@ -9,7 +9,7 @@ This guide will help you setup the server and builder for the project. -We also offer this in video format. You can check it out [here](https://github.com/Significant-Gravitas/AutoGPT#how-to-get-started). +We also offer this in video format. You can check it out [here](https://github.com/Significant-Gravitas/AutoGPT?tab=readme-ov-file#how-to-setup-for-self-hosting). !!! warning **DO NOT FOLLOW ANY OUTSIDE TUTORIALS AS THEY WILL LIKELY BE OUT OF DATE** From 007a773296435c335c90d424c207d252965d48fc Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Thu, 26 Sep 2024 16:56:36 +0100 Subject: [PATCH 004/155] fix(infra): Add missing quotes in helm values (#8193) fix missing quotes --- autogpt_platform/infra/helm/autogpt-server/values.dev.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autogpt_platform/infra/helm/autogpt-server/values.dev.yaml b/autogpt_platform/infra/helm/autogpt-server/values.dev.yaml index 8d80932ae7..5d17aa4078 100644 --- a/autogpt_platform/infra/helm/autogpt-server/values.dev.yaml +++ b/autogpt_platform/infra/helm/autogpt-server/values.dev.yaml @@ -85,7 +85,7 @@ env: NUM_NODE_WORKERS: 5 REDIS_HOST: "redis-dev-master.redis-dev.svc.cluster.local" REDIS_PORT: "6379" - BACKEND_CORS_ALLOW_ORIGINS: ["https://dev-builder.agpt.co"] + BACKEND_CORS_ALLOW_ORIGINS: '["https://dev-builder.agpt.co"]' SUPABASE_SERVICE_ROLE_KEY: "" GITHUB_CLIENT_ID: "" GITHUB_CLIENT_SECRET: "" From 0d8dfaf31243bbbf1b0c831e4f029b435c8e30c8 Mon Sep 17 00:00:00 2001 From: Toran Bruce Richards Date: Thu, 26 Sep 2024 16:57:17 +0100 Subject: [PATCH 005/155] tweak(docs): Update setup.md with git instructions. (#8192) Update setup.md with git instructions. --- docs/content/server/setup.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/content/server/setup.md b/docs/content/server/setup.md index af05b4d97f..d6ffa78422 100644 --- a/docs/content/server/setup.md +++ b/docs/content/server/setup.md @@ -20,6 +20,7 @@ To setup the server, you need to have the following installed: - [Node.js](https://nodejs.org/en/) - [Docker](https://docs.docker.com/get-docker/) +- [Git](https://git-scm.com/downloads) ### Checking if you have Node.js & NPM installed @@ -59,6 +60,16 @@ docker-compose -v Once you have Docker and Docker Compose installed, you can proceed to the next step. +## Cloning the Repository +The first step is cloning the AutoGPT repository to your computer. +To do this, open a terminal window in a folder on your computer and run: +``` +git clone https://github.com/Significant-Gravitas/AutoGPT.git +``` +If you get stuck, follow [this guide](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository). + +Once that's complete you can close this terminal window. + ## Running the backend services To run the backend services, follow these steps: From 9fd6d3df423477e32921ec705af398da3241aea8 Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Thu, 26 Sep 2024 17:02:08 +0100 Subject: [PATCH 006/155] tweak(platform): Remove unused supabase services in docker compose (#8178) remove unused supabase services --- autogpt_platform/docker-compose.yml | 30 ----------------------------- 1 file changed, 30 deletions(-) diff --git a/autogpt_platform/docker-compose.yml b/autogpt_platform/docker-compose.yml index be6f1f49ed..dcde6567f1 100644 --- a/autogpt_platform/docker-compose.yml +++ b/autogpt_platform/docker-compose.yml @@ -96,36 +96,6 @@ services: file: ./supabase/docker/docker-compose.yml service: rest - realtime: - <<: *supabase-services - extends: - file: ./supabase/docker/docker-compose.yml - service: realtime - - storage: - <<: *supabase-services - extends: - file: ./supabase/docker/docker-compose.yml - service: storage - - imgproxy: - <<: *supabase-services - extends: - file: ./supabase/docker/docker-compose.yml - service: imgproxy - - meta: - <<: *supabase-services - extends: - file: ./supabase/docker/docker-compose.yml - service: meta - - functions: - <<: *supabase-services - extends: - file: ./supabase/docker/docker-compose.yml - service: functions - analytics: <<: *supabase-services extends: From dc6c1bb8b012b81c860d121600f59d8750972cdd Mon Sep 17 00:00:00 2001 From: Toran Bruce Richards Date: Fri, 27 Sep 2024 03:00:42 +0100 Subject: [PATCH 007/155] Feat(Builder): Add Video and Image Rendering to Block outputs (#8167) Co-authored-by: Zamil Majdy --- .../frontend/src/components/DataTable.tsx | 22 ++--- .../frontend/src/components/ui/render.tsx | 82 +++++++++++++++++++ 2 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 autogpt_platform/frontend/src/components/ui/render.tsx diff --git a/autogpt_platform/frontend/src/components/DataTable.tsx b/autogpt_platform/frontend/src/components/DataTable.tsx index 6ab4a42e9b..aba62af6c2 100644 --- a/autogpt_platform/frontend/src/components/DataTable.tsx +++ b/autogpt_platform/frontend/src/components/DataTable.tsx @@ -1,3 +1,4 @@ +import React from "react"; import { beautifyString } from "@/lib/utils"; import { Button } from "./ui/button"; import { @@ -10,6 +11,7 @@ import { } from "./ui/table"; import { Clipboard } from "lucide-react"; import { useToast } from "./ui/use-toast"; +import { ContentRenderer } from "./ui/render"; type DataTableProps = { title?: string; @@ -72,17 +74,15 @@ export default function DataTable({ > - {value - .map((i) => { - const text = - typeof i === "object" - ? JSON.stringify(i, null, 2) - : String(i); - return truncateLongData && text.length > maxChars - ? text.slice(0, maxChars) + "..." - : text; - }) - .join(", ")} + {value.map((item, index) => ( + + + {index < value.length - 1 && ", "} + + ))} diff --git a/autogpt_platform/frontend/src/components/ui/render.tsx b/autogpt_platform/frontend/src/components/ui/render.tsx new file mode 100644 index 0000000000..b6147130d2 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/render.tsx @@ -0,0 +1,82 @@ +"use client"; + +import * as React from "react"; +import Image from "next/image"; + +const getYouTubeVideoId = (url: string) => { + const regExp = + /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/; + const match = url.match(regExp); + return match && match[7].length === 11 ? match[7] : null; +}; + +const isValidVideoUrl = (url: string): boolean => { + const videoExtensions = /\.(mp4|webm|ogg)$/i; + const youtubeRegex = /^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$/; + return videoExtensions.test(url) || youtubeRegex.test(url); +}; + +const isValidImageUrl = (url: string): boolean => { + const imageExtensions = /\.(jpeg|jpg|gif|png|svg|webp)$/i; + return imageExtensions.test(url); +}; + +const VideoRenderer: React.FC<{ videoUrl: string }> = ({ videoUrl }) => { + const videoId = getYouTubeVideoId(videoUrl); + return ( +
+ {videoId ? ( + + ) : ( + + )} +
+ ); +}; + +const ImageRenderer: React.FC<{ imageUrl: string }> = ({ imageUrl }) => ( +
+ Image +
+); + +const TextRenderer: React.FC<{ value: any; truncateLongData?: boolean }> = ({ + value, + truncateLongData, +}) => { + const maxChars = 100; + const text = + typeof value === "object" ? JSON.stringify(value, null, 2) : String(value); + return truncateLongData && text.length > maxChars + ? text.slice(0, maxChars) + "..." + : text; +}; + +export const ContentRenderer: React.FC<{ + value: any; + truncateLongData?: boolean; +}> = ({ value, truncateLongData }) => { + if (typeof value === "string") { + if (isValidVideoUrl(value)) { + return ; + } else if (isValidImageUrl(value)) { + return ; + } + } + return ; +}; From 538f945edce27b3a63e511fa4e5a0f4b2cd35512 Mon Sep 17 00:00:00 2001 From: Nicholas Tindle Date: Fri, 27 Sep 2024 01:31:43 -0500 Subject: [PATCH 008/155] feat(docs): add a few qol upgrades (#8176) * feat(docs): add a few qol upgrades * fix(docs): render favicon correctly * feat(docs): pr comments --- docs/mkdocs.yml | 35 ++++++++++++++++++++++-- docs/{ => overrides/assets}/favicon.png | Bin docs/requirements.txt | 1 + 3 files changed, 33 insertions(+), 3 deletions(-) rename docs/{ => overrides/assets}/favicon.png (100%) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index a397a00b65..28dc686c43 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -1,6 +1,8 @@ site_name: AutoGPT Documentation site_url: https://docs.agpt.co/ repo_url: https://github.com/Significant-Gravitas/AutoGPT +repo_name: AutoGPT +edit_uri: edit/master/docs/content docs_dir: content nav: - Home: index.md @@ -10,7 +12,7 @@ nav: - Setup: server/setup.md - Advanced Setup: server/advanced_setup.md - Using Ollama: server/ollama.md - - Using D-ID: serveer/d_id.md + - Using D-ID: server/d_id.md - AutoGPT Agent: - Introduction: AutoGPT/index.md @@ -69,14 +71,27 @@ nav: theme: name: material custom_dir: overrides + language: en icon: + repo: fontawesome/brands/github logo: material/book-open-variant - favicon: favicon.png + edit: material/pencil + view: material/eye + favicon: assets/favicon.png features: - navigation.sections - - toc.follow + - navigation.footer - navigation.top + - navigation.tracking + - navigation.tabs + # - navigation.path + - toc.follow + - toc.integrate + - content.action.edit + - content.action.view - content.code.copy + - content.code.annotate + - content.tabs.link palette: # Palette toggle for light mode - media: "(prefers-color-scheme: light)" @@ -137,6 +152,20 @@ markdown_extensions: plugins: - table-reader - search + - git-revision-date-localized: + enable_creation_date: true + + +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/Significant-Gravitas/AutoGPT + - icon: fontawesome/brands/x-twitter + link: https://x.com/Auto_GPT + - icon: fontawesome/brands/instagram + link: https://www.instagram.com/autogpt/ + - icon: fontawesome/brands/discord + link: https://discord.gg/autogpt extra_javascript: - https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js diff --git a/docs/favicon.png b/docs/overrides/assets/favicon.png similarity index 100% rename from docs/favicon.png rename to docs/overrides/assets/favicon.png diff --git a/docs/requirements.txt b/docs/requirements.txt index 074e062b04..73c7682333 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,3 +2,4 @@ mkdocs mkdocs-material mkdocs-table-reader-plugin pymdown-extensions +mkdocs-git-revision-date-localized-plugin From 0f503aa4674d51c65beba0136b59bdc63558af88 Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Fri, 27 Sep 2024 09:17:11 +0100 Subject: [PATCH 009/155] feat(prod): Set up prod values infra (#8201) updated prod vars --- .../infra/terraform/environments/prod.tfvars | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 autogpt_platform/infra/terraform/environments/prod.tfvars diff --git a/autogpt_platform/infra/terraform/environments/prod.tfvars b/autogpt_platform/infra/terraform/environments/prod.tfvars new file mode 100644 index 0000000000..43f2ae63c1 --- /dev/null +++ b/autogpt_platform/infra/terraform/environments/prod.tfvars @@ -0,0 +1,100 @@ +project_id = "agpt-prod" +region = "us-central1" +zone = "us-central1-a" +network_name = "prod-gke-network" +subnet_name = "prod-gke-subnet" +subnet_cidr = "10.0.0.0/24" +cluster_name = "prod-gke-cluster" +node_count = 4 +node_pool_name = "prod-main-pool" +machine_type = "e2-highmem-4" +disk_size_gb = 100 +static_ip_names = ["agpt-backend-ip", "agpt-frontend-ip", "agpt-ws-backend-ip", "agpt-market-ip"] + + +service_accounts = { + "prod-agpt-backend-sa" = { + display_name = "AutoGPT prod backend Account" + description = "Service account for agpt prod backend" + }, + "prod-agpt-frontend-sa" = { + display_name = "AutoGPT prod frontend Account" + description = "Service account for agpt prod frontend" + }, + "prod-agpt-ws-backend-sa" = { + display_name = "AutoGPT prod WebSocket backend Account" + description = "Service account for agpt prod websocket backend" + }, + "prod-agpt-market-sa" = { + display_name = "AutoGPT prod Market backend Account" + description = "Service account for agpt prod market backend" + } +} + +workload_identity_bindings = { + "prod-agpt-backend-workload-identity" = { + service_account_name = "prod-agpt-backend-sa" + namespace = "prod-agpt" + ksa_name = "prod-agpt-backend-sa" + }, + "prod-agpt-frontend-workload-identity" = { + service_account_name = "prod-agpt-frontend-sa" + namespace = "prod-agpt" + ksa_name = "prod-agpt-frontend-sa" + }, + "prod-agpt-ws-backend-workload-identity" = { + service_account_name = "prod-agpt-ws-backend-sa" + namespace = "prod-agpt" + ksa_name = "prod-agpt-ws-backend-sa" + }, + "prod-agpt-market-workload-identity" = { + service_account_name = "prod-agpt-market-sa" + namespace = "prod-agpt" + ksa_name = "prod-agpt-market-sa" + } +} + +role_bindings = { + "roles/container.developer" = [ + "serviceAccount:prod-agpt-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-frontend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-ws-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-market-sa@agpt-prod.iam.gserviceaccount.com" + ], + "roles/cloudsql.client" = [ + "serviceAccount:prod-agpt-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-frontend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-market-sa@agpt-prod.iam.gserviceaccount.com" + ], + "roles/cloudsql.editor" = [ + "serviceAccount:prod-agpt-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-frontend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-market-sa@agpt-prod.iam.gserviceaccount.com" + ], + "roles/cloudsql.instanceUser" = [ + "serviceAccount:prod-agpt-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-frontend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-market-sa@agpt-prod.iam.gserviceaccount.com" + ], + "roles/iam.workloadIdentityUser" = [ + "serviceAccount:prod-agpt-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-frontend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-ws-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-market-sa@agpt-prod.iam.gserviceaccount.com" + ] + "roles/compute.networkUser" = [ + "serviceAccount:prod-agpt-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-frontend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-ws-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-market-sa@agpt-prod.iam.gserviceaccount.com" + ], + "roles/container.hostServiceAgentUser" = [ + "serviceAccount:prod-agpt-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-frontend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-ws-backend-sa@agpt-prod.iam.gserviceaccount.com", + "serviceAccount:prod-agpt-market-sa@agpt-prod.iam.gserviceaccount.com" + ] +} + +pods_ip_cidr_range = "10.1.0.0/16" +services_ip_cidr_range = "10.2.0.0/20" \ No newline at end of file From f607efd74fd51bd121b0a32dd43378c51ffb42b3 Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Fri, 27 Sep 2024 09:31:12 +0100 Subject: [PATCH 010/155] feat(infra): Add prod redis values (#8202) add redis production values --- .../infra/helm/redis-values.prod.yaml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 autogpt_platform/infra/helm/redis-values.prod.yaml diff --git a/autogpt_platform/infra/helm/redis-values.prod.yaml b/autogpt_platform/infra/helm/redis-values.prod.yaml new file mode 100644 index 0000000000..ea59144775 --- /dev/null +++ b/autogpt_platform/infra/helm/redis-values.prod.yaml @@ -0,0 +1,15 @@ +architecture: standalone +auth: + enabled: true + password: "" #empty on purpose +master: + persistence: + enabled: true + size: 3Gi + configmap: + redis.conf: | + bind 127.0.0.1 + protected-mode yes + requirepass password +replica: + replicaCount: 0 \ No newline at end of file From 1286a1b0348fa1908a3a4ee1847bd174b25bd6e9 Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Fri, 27 Sep 2024 03:31:44 -0500 Subject: [PATCH 011/155] feat(platform): Sync on new UI design (#8194) * feat(platform): Sync on new UI design * simplify UI * block list add border and remove padding * add highlight on navbar button --------- Co-authored-by: Swifty --- .../frontend/src/app/auth/callback/route.ts | 2 +- .../frontend/src/app/build/page.tsx | 2 +- autogpt_platform/frontend/src/app/layout.tsx | 2 +- .../frontend/src/app/login/actions.ts | 4 +- .../frontend/src/app/login/page.tsx | 4 +- .../frontend/src/components/CustomNode.tsx | 2 +- .../frontend/src/components/Flow.tsx | 36 +++++++----- .../frontend/src/components/NavBar.tsx | 56 ++----------------- .../frontend/src/components/NavBarButtons.tsx | 49 ++++++++++++++++ .../src/components/PrimaryActionButton.tsx | 12 ++-- .../frontend/src/components/TallyPopup.tsx | 2 +- .../components/edit/control/BlocksControl.tsx | 2 +- .../components/edit/control/ControlPanel.tsx | 14 +++-- .../frontend/src/components/flow.css | 7 ++- .../frontend/src/components/ui/button.tsx | 2 +- 15 files changed, 109 insertions(+), 87 deletions(-) create mode 100644 autogpt_platform/frontend/src/components/NavBarButtons.tsx diff --git a/autogpt_platform/frontend/src/app/auth/callback/route.ts b/autogpt_platform/frontend/src/app/auth/callback/route.ts index c813415239..5d3e1e9536 100644 --- a/autogpt_platform/frontend/src/app/auth/callback/route.ts +++ b/autogpt_platform/frontend/src/app/auth/callback/route.ts @@ -6,7 +6,7 @@ export async function GET(request: Request) { const { searchParams, origin } = new URL(request.url); const code = searchParams.get("code"); // if "next" is in param, use it as the redirect URL - const next = searchParams.get("next") ?? "/profile"; + const next = searchParams.get("next") ?? "/"; if (code) { const supabase = createServerClient(); diff --git a/autogpt_platform/frontend/src/app/build/page.tsx b/autogpt_platform/frontend/src/app/build/page.tsx index 6d4c928c8d..6b5ea497e2 100644 --- a/autogpt_platform/frontend/src/app/build/page.tsx +++ b/autogpt_platform/frontend/src/app/build/page.tsx @@ -8,7 +8,7 @@ export default function Home() { return ( diff --git a/autogpt_platform/frontend/src/app/layout.tsx b/autogpt_platform/frontend/src/app/layout.tsx index 49ba9c7ac5..d175adc210 100644 --- a/autogpt_platform/frontend/src/app/layout.tsx +++ b/autogpt_platform/frontend/src/app/layout.tsx @@ -34,7 +34,7 @@ export default function RootLayout({ >
-
{children}
+
{children}
diff --git a/autogpt_platform/frontend/src/app/login/actions.ts b/autogpt_platform/frontend/src/app/login/actions.ts index b0f4a59bf1..ef0bff17dd 100644 --- a/autogpt_platform/frontend/src/app/login/actions.ts +++ b/autogpt_platform/frontend/src/app/login/actions.ts @@ -30,7 +30,7 @@ export async function login(values: z.infer) { } revalidatePath("/", "layout"); - redirect("/profile"); + redirect("/"); }); } @@ -61,7 +61,7 @@ export async function signup(values: z.infer) { } revalidatePath("/", "layout"); - redirect("/profile"); + redirect("/"); }, ); } diff --git a/autogpt_platform/frontend/src/app/login/page.tsx b/autogpt_platform/frontend/src/app/login/page.tsx index b21dd95e5c..ad70e26981 100644 --- a/autogpt_platform/frontend/src/app/login/page.tsx +++ b/autogpt_platform/frontend/src/app/login/page.tsx @@ -48,8 +48,8 @@ export default function LoginPage() { }); if (user) { - console.log("User exists, redirecting to profile"); - router.push("/profile"); + console.log("User exists, redirecting to home"); + router.push("/"); } if (isUserLoading || isSupabaseLoading || user) { diff --git a/autogpt_platform/frontend/src/components/CustomNode.tsx b/autogpt_platform/frontend/src/components/CustomNode.tsx index 8c434b9366..91c275a0fe 100644 --- a/autogpt_platform/frontend/src/components/CustomNode.tsx +++ b/autogpt_platform/frontend/src/components/CustomNode.tsx @@ -585,7 +585,7 @@ export function CustomNode({ data, id, width, height }: NodeProps) { {blockCost && (
- {blockCost.cost_amount} per {blockCost.cost_type} + {blockCost.cost_amount} credits/{blockCost.cost_type}
)} diff --git a/autogpt_platform/frontend/src/components/Flow.tsx b/autogpt_platform/frontend/src/components/Flow.tsx index a55fd5fc4e..7d22be3923 100644 --- a/autogpt_platform/frontend/src/components/Flow.tsx +++ b/autogpt_platform/frontend/src/components/Flow.tsx @@ -579,21 +579,27 @@ const FlowEditor: React.FC<{ > - - - requestSave(isTemplate ?? false)} - agentDescription={agentDescription} - onDescriptionChange={setAgentDescription} - agentName={agentName} - onNameChange={setAgentName} - /> - + + } + botChildren={ + requestSave(isTemplate ?? false)} + agentDescription={agentDescription} + onDescriptionChange={setAgentDescription} + agentName={agentName} + onNameChange={setAgentName} + /> + } + > runnerUIRef.current?.openRunnerOutput()} onClickRunAgent={() => { diff --git a/autogpt_platform/frontend/src/components/NavBar.tsx b/autogpt_platform/frontend/src/components/NavBar.tsx index 2ae259d880..667d653bff 100644 --- a/autogpt_platform/frontend/src/components/NavBar.tsx +++ b/autogpt_platform/frontend/src/components/NavBar.tsx @@ -5,19 +5,9 @@ import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"; import Image from "next/image"; import getServerUser from "@/hooks/getServerUser"; import ProfileDropdown from "./ProfileDropdown"; -import { - IconCircleUser, - IconMenu, - IconPackage2, - IconRefresh, - IconSquareActivity, - IconWorkFlow, -} from "@/components/ui/icons"; -import AutoGPTServerAPI from "@/lib/autogpt-server-api"; +import { IconCircleUser, IconMenu } from "@/components/ui/icons"; import CreditButton from "@/components/CreditButton"; -import { BsBoxes } from "react-icons/bs"; -import { LuLaptop } from "react-icons/lu"; -import { LuShoppingCart } from "react-icons/lu"; +import { NavBarButtons } from "./NavBarButtons"; export async function NavBar() { const isAvailable = Boolean( @@ -27,7 +17,7 @@ export async function NavBar() { const { user } = await getServerUser(); return ( -
+
@@ -42,28 +32,11 @@ export async function NavBar() { -
diff --git a/autogpt_platform/frontend/src/components/NavBarButtons.tsx b/autogpt_platform/frontend/src/components/NavBarButtons.tsx new file mode 100644 index 0000000000..5ca410e313 --- /dev/null +++ b/autogpt_platform/frontend/src/components/NavBarButtons.tsx @@ -0,0 +1,49 @@ +"use client"; + +import Link from "next/link"; +import { BsBoxes } from "react-icons/bs"; +import { LuLaptop } from "react-icons/lu"; +import { LuShoppingCart } from "react-icons/lu"; +import { cn } from "@/lib/utils"; +import { usePathname } from "next/navigation"; + +export function NavBarButtons({ className }: { className?: string }) { + "use client"; + + const pathname = usePathname(); + const buttons = [ + { + href: "/marketplace", + text: "Marketplace", + icon: , + }, + { + href: "/", + text: "Monitor", + icon: , + }, + { + href: "/build", + text: "Build", + icon: , + }, + ]; + + const activeButton = buttons.find((button) => button.href === pathname); + + console.log(">>>> ", activeButton); + + return buttons.map((button) => ( + + {button.icon} {button.text} + + )); +} diff --git a/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx b/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx index 739ad10cdf..2d399306eb 100644 --- a/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx +++ b/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx @@ -32,7 +32,7 @@ const PrimaryActionBar: React.FC = ({ const runButtonOnClick = !isRunning ? onClickRunAgent : requestStopRun; return ( -
+
@@ -42,8 +42,10 @@ const PrimaryActionBar: React.FC = ({ size="primary" variant="outline" > - - Agent Outputs + + + Agent Outputs{" "} + @@ -62,7 +64,9 @@ const PrimaryActionBar: React.FC = ({ }} > {runButtonIcon} - {runButtonLabel} + + {runButtonLabel} + diff --git a/autogpt_platform/frontend/src/components/TallyPopup.tsx b/autogpt_platform/frontend/src/components/TallyPopup.tsx index d16ed87877..f37e08b3fa 100644 --- a/autogpt_platform/frontend/src/components/TallyPopup.tsx +++ b/autogpt_platform/frontend/src/components/TallyPopup.tsx @@ -47,7 +47,7 @@ const TallyPopupSimple = () => { }; return ( -
+
diff --git a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx index cfea589964..0813d08d97 100644 --- a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx +++ b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx @@ -138,7 +138,7 @@ export const BlocksControl: React.FC = ({ ))}
- + { return ( - + -
- {children} +
+ {topChildren} {controls.map((control, index) => ( @@ -67,6 +69,8 @@ export const ControlPanel = ({ {control.label} ))} + + {botChildren}
diff --git a/autogpt_platform/frontend/src/components/flow.css b/autogpt_platform/frontend/src/components/flow.css index 830099e750..30ef76b68f 100644 --- a/autogpt_platform/frontend/src/components/flow.css +++ b/autogpt_platform/frontend/src/components/flow.css @@ -111,6 +111,9 @@ textarea::placeholder { } .flow-container { - width: 100%; - height: 600px; /* Adjust this height as needed */ + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; } diff --git a/autogpt_platform/frontend/src/components/ui/button.tsx b/autogpt_platform/frontend/src/components/ui/button.tsx index 467f58b2d8..2239996ac8 100644 --- a/autogpt_platform/frontend/src/components/ui/button.tsx +++ b/autogpt_platform/frontend/src/components/ui/button.tsx @@ -25,7 +25,7 @@ const buttonVariants = cva( default: "h-9 px-4 py-2", sm: "h-8 rounded-md px-3 text-xs", lg: "h-10 rounded-md px-8", - primary: "h-14 w-44 rounded-2xl", + primary: "md:h-14 md:w-44 rounded-2xl h-10 w-28", icon: "h-9 w-9", }, }, From 31450fcb9c10002711f811b4a81e9facb7f56187 Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Fri, 27 Sep 2024 10:08:01 +0100 Subject: [PATCH 012/155] feat(infra): Add market prod (#8204) market prod values market prod values --- .../templates/backendconfig.yaml | 2 +- .../autogpt-market/templates/deployment.yaml | 11 +- .../autogpt-market/templates/service.yaml | 6 +- .../infra/helm/autogpt-market/values.dev.yaml | 25 ++-- .../helm/autogpt-market/values.prod.yaml | 109 ++++++++++++++++++ .../infra/helm/autogpt-market/values.yaml | 9 -- 6 files changed, 131 insertions(+), 31 deletions(-) create mode 100644 autogpt_platform/infra/helm/autogpt-market/values.prod.yaml diff --git a/autogpt_platform/infra/helm/autogpt-market/templates/backendconfig.yaml b/autogpt_platform/infra/helm/autogpt-market/templates/backendconfig.yaml index e7f7c8a8f1..0e7c138d37 100644 --- a/autogpt_platform/infra/helm/autogpt-market/templates/backendconfig.yaml +++ b/autogpt_platform/infra/helm/autogpt-market/templates/backendconfig.yaml @@ -1,7 +1,7 @@ apiVersion: cloud.google.com/v1 kind: BackendConfig metadata: - name: {{ include "autogpt-market.fullname" . }} + name: {{ include "autogpt-market.fullname" . }}-backend-config spec: customRequestHeaders: headers: diff --git a/autogpt_platform/infra/helm/autogpt-market/templates/deployment.yaml b/autogpt_platform/infra/helm/autogpt-market/templates/deployment.yaml index a1b10c22e5..cb6d7faa45 100644 --- a/autogpt_platform/infra/helm/autogpt-market/templates/deployment.yaml +++ b/autogpt_platform/infra/helm/autogpt-market/templates/deployment.yaml @@ -41,7 +41,7 @@ spec: imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - name: http - containerPort: {{ .Values.service.port }} + containerPort: {{ .Values.service.targetPort }} protocol: TCP livenessProbe: {{- toYaml .Values.livenessProbe | nindent 12 }} @@ -53,15 +53,6 @@ spec: volumeMounts: {{- toYaml . | nindent 12 }} {{- end }} - - name: cloud-sql-proxy - image: "{{ .Values.cloudSqlProxy.image.repository }}:{{ .Values.cloudSqlProxy.image.tag }}" - args: - - "--structured-logs" - {{- if .Values.cloudSqlProxy.usePrivateIp }} - - "--private-ip" - {{- end }} - - "--port={{ .Values.cloudSqlProxy.port }}" - - "{{ .Values.cloudSqlProxy.instanceConnectionName }}" {{- with .Values.volumes }} volumes: {{- toYaml . | nindent 8 }} diff --git a/autogpt_platform/infra/helm/autogpt-market/templates/service.yaml b/autogpt_platform/infra/helm/autogpt-market/templates/service.yaml index ca126063dc..3895c760f8 100644 --- a/autogpt_platform/infra/helm/autogpt-market/templates/service.yaml +++ b/autogpt_platform/infra/helm/autogpt-market/templates/service.yaml @@ -4,11 +4,15 @@ metadata: name: {{ include "autogpt-market.fullname" . }} labels: {{- include "autogpt-market.labels" . | nindent 4 }} + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} - targetPort: http + targetPort: {{ .Values.service.targetPort }} protocol: TCP name: http selector: diff --git a/autogpt_platform/infra/helm/autogpt-market/values.dev.yaml b/autogpt_platform/infra/helm/autogpt-market/values.dev.yaml index 27fe4b2bd4..e8588fe0f4 100644 --- a/autogpt_platform/infra/helm/autogpt-market/values.dev.yaml +++ b/autogpt_platform/infra/helm/autogpt-market/values.dev.yaml @@ -12,11 +12,11 @@ serviceAccount: service: type: ClusterIP - port: 8000 - targetPort: 8005 + port: 8015 + targetPort: 8015 annotations: cloud.google.com/neg: '{"ingress": true}' - beta.cloud.google.com/backend-config: '{"default": "autogpt-market"}' + beta.cloud.google.com/backend-config: '{"default": "autogpt-market-backend-config"}' ingress: enabled: true @@ -25,7 +25,7 @@ ingress: kubernetes.io/ingress.class: gce kubernetes.io/ingress.global-static-ip-name: "agpt-dev-agpt-market-ip" networking.gke.io/managed-certificates: "autogpt-market-cert" - kubernetes.io/ingress.allow-http: "false" + networking.gke.io/v1beta1.FrontendConfig: "autogpt-market-frontend-config" hosts: - host: dev-market.agpt.co paths: @@ -34,12 +34,12 @@ ingress: backend: service: name: autogpt-market - port: 8000 + port: 8015 defaultBackend: service: name: autogpt-market port: - number: 8000 + number: 8015 resources: requests: @@ -52,7 +52,7 @@ resources: livenessProbe: httpGet: path: /health - port: 8000 + port: 8015 initialDelaySeconds: 60 periodSeconds: 20 timeoutSeconds: 10 @@ -60,7 +60,7 @@ livenessProbe: readinessProbe: httpGet: path: /health - port: 8000 + port: 8015 initialDelaySeconds: 60 periodSeconds: 20 timeoutSeconds: 10 @@ -95,9 +95,14 @@ cors: env: APP_ENV: "dev" + PYRO_HOST: "0.0.0.0" ENABLE_AUTH: "true" SUPABASE_JWT_SECRET: "" - SUPABASE_ANON_KEY: "" - SUPABASE_URL: "" DATABASE_URL: "" + SENTRY_DSN: "" + SUPABASE_SERVICE_ROLE_KEY: "" + GITHUB_CLIENT_ID: "" + GITHUB_CLIENT_SECRET: "" + FRONTEND_BASE_URL: "https://dev-builder.agpt.co/" + SUPABASE_URL: "https://adfjtextkuilwuhzdjpf.supabase.co" BACKEND_CORS_ALLOW_ORIGINS: "https://dev-builder.agpt.co" \ No newline at end of file diff --git a/autogpt_platform/infra/helm/autogpt-market/values.prod.yaml b/autogpt_platform/infra/helm/autogpt-market/values.prod.yaml new file mode 100644 index 0000000000..1ed7ad8748 --- /dev/null +++ b/autogpt_platform/infra/helm/autogpt-market/values.prod.yaml @@ -0,0 +1,109 @@ +# prod values, overwrite base values as needed. + +image: + repository: us-east1-docker.pkg.dev/agpt-prod/agpt-market-prod/agpt-market-prod + pullPolicy: Always + tag: "latest" + +serviceAccount: + annotations: + iam.gke.io/gcp-service-account: "prod-agpt-market-sa@agpt-prod.iam.gserviceaccount.com" + name: "prod-agpt-market-sa" + +service: + type: ClusterIP + port: 8015 + targetPort: 8015 + annotations: + cloud.google.com/neg: '{"ingress": true}' + beta.cloud.google.com/backend-config: '{"default": "autogpt-market-backend-config"}' + +ingress: + enabled: true + className: "gce" + annotations: + kubernetes.io/ingress.class: gce + kubernetes.io/ingress.global-static-ip-name: "agpt-prod-agpt-market-ip" + networking.gke.io/managed-certificates: "autogpt-market-cert" + networking.gke.io/v1beta1.FrontendConfig: "autogpt-market-frontend-config" + hosts: + - host: platform.agpt.co + paths: + - path: / + pathType: Prefix + backend: + service: + name: autogpt-market + port: 8015 + defaultBackend: + service: + name: autogpt-market + port: + number: 8015 + +resources: + requests: + cpu: 200m + memory: 1Gi + limits: + cpu: 2 + memory: 2Gi + +livenessProbe: + httpGet: + path: /health + port: 8015 + initialDelaySeconds: 60 + periodSeconds: 20 + timeoutSeconds: 10 + failureThreshold: 12 +readinessProbe: + httpGet: + path: /health + port: 8015 + initialDelaySeconds: 60 + periodSeconds: 20 + timeoutSeconds: 10 + failureThreshold: 12 + +domain: "market.agpt.co" + +cloudSqlProxy: + image: + repository: gcr.io/cloud-sql-connectors/cloud-sql-proxy + tag: 2.11.4 + instanceConnectionName: "agpt-prod:us-central1:agpt-server-prod" + port: 5432 + resources: + requests: + memory: "2Gi" + cpu: "1" + +cors: + allowOrigin: "https://platform.agpt.co" + allowMethods: + - "GET" + - "POST" + - "PUT" + - "DELETE" + - "OPTIONS" + allowHeaders: + - "Content-Type" + - "Authorization" + maxAge: 3600 + allowCredentials: true + +env: + APP_ENV: "prod" + PYRO_HOST: "0.0.0.0" + ENABLE_AUTH: "true" + SUPABASE_JWT_SECRET: "" + DATABASE_URL: "" + SENTRY_DSN: "" + SUPABASE_SERVICE_ROLE_KEY: "" + GITHUB_CLIENT_ID: "" + GITHUB_CLIENT_SECRET: "" + FRONTEND_BASE_URL: "https://platform.agpt.co/" + SUPABASE_URL: "https://bgwpwdsxblryihinutbx.supabase.co" + BACKEND_CORS_ALLOW_ORIGINS: "https://platform.agpt.co" + diff --git a/autogpt_platform/infra/helm/autogpt-market/values.yaml b/autogpt_platform/infra/helm/autogpt-market/values.yaml index b5227f5f09..6b6bd1add9 100644 --- a/autogpt_platform/infra/helm/autogpt-market/values.yaml +++ b/autogpt_platform/infra/helm/autogpt-market/values.yaml @@ -71,15 +71,6 @@ resources: {} # cpu: 100m # memory: 128Mi -livenessProbe: - httpGet: - path: / - port: http -readinessProbe: - httpGet: - path: / - port: http - autoscaling: enabled: false minReplicas: 1 From 230ec1c88c46434d657ce68dd981de57fad3bb33 Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Fri, 27 Sep 2024 10:12:13 +0100 Subject: [PATCH 013/155] tweak(infra): Update prod market ingres host (#8205) update name --- autogpt_platform/infra/helm/autogpt-market/values.prod.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autogpt_platform/infra/helm/autogpt-market/values.prod.yaml b/autogpt_platform/infra/helm/autogpt-market/values.prod.yaml index 1ed7ad8748..702dcce863 100644 --- a/autogpt_platform/infra/helm/autogpt-market/values.prod.yaml +++ b/autogpt_platform/infra/helm/autogpt-market/values.prod.yaml @@ -27,7 +27,7 @@ ingress: networking.gke.io/managed-certificates: "autogpt-market-cert" networking.gke.io/v1beta1.FrontendConfig: "autogpt-market-frontend-config" hosts: - - host: platform.agpt.co + - host: market.agpt.co paths: - path: / pathType: Prefix From a5c63880b8a5d809892bc23c95323a6a4cc968f0 Mon Sep 17 00:00:00 2001 From: Michael Sheinman Date: Fri, 27 Sep 2024 12:14:48 -0400 Subject: [PATCH 014/155] fix(platform): Fix NPM security vulnerabilities upgrade next 14.2.4 -> 14.2.13 (#8198) Co-authored-by: Michael Sheinman Co-authored-by: Zamil Majdy --- autogpt_platform/frontend/package.json | 2 +- autogpt_platform/frontend/yarn.lock | 1116 ++++++++++++++---------- 2 files changed, 680 insertions(+), 438 deletions(-) diff --git a/autogpt_platform/frontend/package.json b/autogpt_platform/frontend/package.json index 0945f7fb8f..4997672640 100644 --- a/autogpt_platform/frontend/package.json +++ b/autogpt_platform/frontend/package.json @@ -48,7 +48,7 @@ "dotenv": "^16.4.5", "lucide-react": "^0.407.0", "moment": "^2.30.1", - "next": "14.2.4", + "next": "^14.2.13", "next-themes": "^0.3.0", "react": "^18", "react-day-picker": "^8.10.1", diff --git a/autogpt_platform/frontend/yarn.lock b/autogpt_platform/frontend/yarn.lock index 0be4d073a5..ce8fea9970 100644 --- a/autogpt_platform/frontend/yarn.lock +++ b/autogpt_platform/frontend/yarn.lock @@ -28,7 +28,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz" integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== -"@babel/core@^7.18.5": +"@babel/core@^7.0.0", "@babel/core@^7.18.5": version "7.25.2" resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== @@ -288,12 +288,20 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -301,10 +309,10 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@next/env@14.2.4": - version "14.2.4" - resolved "https://registry.npmjs.org/@next/env/-/env-14.2.4.tgz" - integrity sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg== +"@next/env@14.2.13": + version "14.2.13" + resolved "https://registry.npmjs.org/@next/env/-/env-14.2.13.tgz" + integrity sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw== "@next/eslint-plugin-next@14.2.4": version "14.2.4" @@ -313,50 +321,10 @@ dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.2.4": - version "14.2.4" - resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz" - integrity sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg== - -"@next/swc-darwin-x64@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz#46dedb29ec5503bf171a72a3ecb8aac6e738e9d6" - integrity sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg== - -"@next/swc-linux-arm64-gnu@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz#c9697ab9eb422bd1d7ffd0eb0779cc2aefa9d4a1" - integrity sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ== - -"@next/swc-linux-arm64-musl@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz#cbbceb2008571c743b5a310a488d2e166d200a75" - integrity sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A== - -"@next/swc-linux-x64-gnu@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz#d79184223f857bacffb92f643cb2943a43632568" - integrity sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q== - -"@next/swc-linux-x64-musl@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz#6b6c3e5ac02ca5e63394d280ec8ee607491902df" - integrity sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ== - -"@next/swc-win32-arm64-msvc@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz#dbad3906e870dba84c5883d9d4c4838472e0697f" - integrity sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A== - -"@next/swc-win32-ia32-msvc@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz#6074529b91ba49132922ce89a2e16d25d2ec235d" - integrity sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag== - -"@next/swc-win32-x64-msvc@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz#e65a1c6539a671f97bb86d5183d6e3a1733c29c7" - integrity sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg== +"@next/swc-darwin-arm64@14.2.13": + version "14.2.13" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.13.tgz" + integrity sha512-IkAmQEa2Htq+wHACBxOsslt+jMoV3msvxCn0WFSfJSkv/scy+i/EukBKNad36grRxywaXUYJc9mxEGkeIs8Bzg== "@next/third-parties@^14.2.5": version "14.2.6" @@ -373,7 +341,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -400,7 +368,7 @@ dependencies: "@opentelemetry/api" "^1.0.0" -"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.8", "@opentelemetry/api@^1.9.0": +"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.1.0", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.7.0", "@opentelemetry/api@^1.8", "@opentelemetry/api@^1.9.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0": version "1.9.0" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== @@ -410,13 +378,22 @@ resolved "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz" integrity sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg== -"@opentelemetry/core@1.26.0", "@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.25.1", "@opentelemetry/core@^1.8.0": +"@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.25.1", "@opentelemetry/core@^1.8.0", "@opentelemetry/core@1.26.0": version "1.26.0" resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz" integrity sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ== dependencies: "@opentelemetry/semantic-conventions" "1.27.0" +"@opentelemetry/instrumentation-amqplib@^0.42.0": + version "0.42.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.42.0.tgz" + integrity sha512-fiuU6OKsqHJiydHWgTRQ7MnIrJ2lEqsdgFtNIH4LbAUJl/5XmrIeoDzDnox+hfkgWK65jsleFuQDtYb5hW1koQ== + dependencies: + "@opentelemetry/core" "^1.8.0" + "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/semantic-conventions" "^1.27.0" + "@opentelemetry/instrumentation-connect@0.39.0": version "0.39.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.39.0.tgz" @@ -427,6 +404,13 @@ "@opentelemetry/semantic-conventions" "^1.27.0" "@types/connect" "3.4.36" +"@opentelemetry/instrumentation-dataloader@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.12.0.tgz" + integrity sha512-pnPxatoFE0OXIZDQhL2okF//dmbiWFzcSc8pUg9TqofCLYZySSxDCgQc69CJBo5JnI3Gz1KP+mOjS4WAeRIH4g== + dependencies: + "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/instrumentation-express@0.42.0": version "0.42.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.42.0.tgz" @@ -530,15 +514,6 @@ "@opentelemetry/instrumentation" "^0.53.0" "@opentelemetry/semantic-conventions" "^1.27.0" -"@opentelemetry/instrumentation-mysql2@0.41.0": - version "0.41.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz" - integrity sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g== - dependencies: - "@opentelemetry/instrumentation" "^0.53.0" - "@opentelemetry/semantic-conventions" "^1.27.0" - "@opentelemetry/sql-common" "^0.40.1" - "@opentelemetry/instrumentation-mysql@0.41.0": version "0.41.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.41.0.tgz" @@ -548,6 +523,15 @@ "@opentelemetry/semantic-conventions" "^1.27.0" "@types/mysql" "2.15.26" +"@opentelemetry/instrumentation-mysql2@0.41.0": + version "0.41.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz" + integrity sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g== + dependencies: + "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/semantic-conventions" "^1.27.0" + "@opentelemetry/sql-common" "^0.40.1" + "@opentelemetry/instrumentation-nestjs-core@0.40.0": version "0.40.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.40.0.tgz" @@ -584,18 +568,6 @@ "@opentelemetry/core" "^1.8.0" "@opentelemetry/instrumentation" "^0.53.0" -"@opentelemetry/instrumentation@0.53.0", "@opentelemetry/instrumentation@^0.53.0": - version "0.53.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz" - integrity sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A== - dependencies: - "@opentelemetry/api-logs" "0.53.0" - "@types/shimmer" "^1.2.0" - import-in-the-middle "^1.8.1" - require-in-the-middle "^7.1.1" - semver "^7.5.2" - shimmer "^1.2.1" - "@opentelemetry/instrumentation@^0.49 || ^0.50 || ^0.51 || ^0.52.0": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz" @@ -608,12 +580,24 @@ semver "^7.5.2" shimmer "^1.2.1" +"@opentelemetry/instrumentation@^0.53.0", "@opentelemetry/instrumentation@0.53.0": + version "0.53.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz" + integrity sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A== + dependencies: + "@opentelemetry/api-logs" "0.53.0" + "@types/shimmer" "^1.2.0" + import-in-the-middle "^1.8.1" + require-in-the-middle "^7.1.1" + semver "^7.5.2" + shimmer "^1.2.1" + "@opentelemetry/redis-common@^0.36.2": version "0.36.2" resolved "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz" integrity sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g== -"@opentelemetry/resources@1.26.0", "@opentelemetry/resources@^1.26.0": +"@opentelemetry/resources@^1.26.0", "@opentelemetry/resources@1.26.0": version "1.26.0" resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz" integrity sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw== @@ -638,7 +622,7 @@ "@opentelemetry/resources" "1.26.0" "@opentelemetry/semantic-conventions" "1.27.0" -"@opentelemetry/semantic-conventions@1.27.0", "@opentelemetry/semantic-conventions@^1.27.0": +"@opentelemetry/semantic-conventions@^1.27.0", "@opentelemetry/semantic-conventions@1.27.0": version "1.27.0" resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz" integrity sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg== @@ -655,9 +639,9 @@ resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@playwright/test@^1.47.1": +"@playwright/test@^1.41.2", "@playwright/test@^1.47.1": version "1.47.1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.47.1.tgz#568a46229a5aef54b74977297a7946bb5ac4b67b" + resolved "https://registry.npmjs.org/@playwright/test/-/test-1.47.1.tgz" integrity sha512-dbWpcNQZ5nj16m+A5UNScYx7HX5trIy7g4phrcitn+Nk83S32EBX/CLU4hiF4RGKX/yRc93AAqtfaXB7JWBd4Q== dependencies: playwright "1.47.1" @@ -767,6 +751,26 @@ resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz" integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== +"@radix-ui/react-dialog@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz" + integrity sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-focus-guards" "1.1.0" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.7" + "@radix-ui/react-dialog@1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz" @@ -788,26 +792,6 @@ aria-hidden "^1.1.1" react-remove-scroll "2.5.5" -"@radix-ui/react-dialog@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz" - integrity sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-focus-guards" "1.1.0" - "@radix-ui/react-focus-scope" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.7" - "@radix-ui/react-direction@1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz" @@ -1080,6 +1064,13 @@ dependencies: "@radix-ui/react-primitive" "2.0.0" +"@radix-ui/react-slot@^1.1.0", "@radix-ui/react-slot@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz" + integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-slot@1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz" @@ -1088,13 +1079,6 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.1" -"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz" - integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-switch@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz" @@ -1250,11 +1234,6 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rollup/rollup-linux-x64-gnu@^4.9.5": - version "4.22.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz#70116ae6c577fe367f58559e2cffb5641a1dd9d0" - integrity sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg== - "@rushstack/eslint-patch@^1.3.3": version "1.10.4" resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz" @@ -1265,61 +1244,61 @@ resolved "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.3.0.tgz" integrity sha512-lHKK8M5CTcpFj2hZDB3wIjb0KAbEOgDmiJGDv1WBRfQgRm/a8/XMEkG/N1iM01xgbUDsPQwi42D+dFo1XPAKew== -"@sentry-internal/browser-utils@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.30.0.tgz" - integrity sha512-pwX+awNWaxSOAsBLVLqc1+Hw+Fm1Nci9mbKFA6Ed5YzCG049PnBVQwugpmx2dcyyCqJpORhcIqb9jHdCkYmCiA== +"@sentry-internal/browser-utils@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.32.0.tgz" + integrity sha512-DpUGhk5O1OVjT0fo9wsbEdO1R/S9gGBRDtn9+FFVeRtieJHwXpeZiLK+tZhTOvaILmtSoTPUEY3L5sK4j5Xq9g== dependencies: - "@sentry/core" "8.30.0" - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" + "@sentry/core" "8.32.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" -"@sentry-internal/feedback@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.30.0.tgz" - integrity sha512-ParFRxQY6helxkwUDmro77Wc5uSIC6rZos88jYMrYwFmoTJaNWf4lDzPyECfdSiSYyzSMZk4dorSUN85Ul7DCg== +"@sentry-internal/feedback@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.32.0.tgz" + integrity sha512-XB7hiVJQW1tNzpoXIHbvm3rjipIt7PZiJJtFg2vxaqu/FzdgOcYqQiwIKivJVAKuRZ9rIeJtK1jdXQFOc/TRJA== dependencies: - "@sentry/core" "8.30.0" - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" + "@sentry/core" "8.32.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" -"@sentry-internal/replay-canvas@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.30.0.tgz" - integrity sha512-y/QqcvchhtMlVA6eOZicIfTxtZarazQZJuFW0018ynPxBTiuuWSxMCLqduulXUYsFejfD8/eKHb3BpCIFdDYjg== +"@sentry-internal/replay-canvas@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.32.0.tgz" + integrity sha512-oBbhtDBkD+5z/T0NVJ5VenBWAid/S9QdVrod/UqxVqU7F8N+E9/INFQI48zCWr4iVlUMcszJPDElvJEsMDvvBQ== dependencies: - "@sentry-internal/replay" "8.30.0" - "@sentry/core" "8.30.0" - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" + "@sentry-internal/replay" "8.32.0" + "@sentry/core" "8.32.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" -"@sentry-internal/replay@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.30.0.tgz" - integrity sha512-/KFre+BrovPCiovgAu5N1ErJtkDVzkJA5hV3Jw011AlxRWxrmPwu6+9sV9/rn3tqYAGyq6IggYqeIOHhLh1Ihg== +"@sentry-internal/replay@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.32.0.tgz" + integrity sha512-yiEUnn2yyo1AIQIFNeRX3tdK8fmyKIkxdFS1WiVQmeYI/hFwYBTZPly0FcO/g3xnRMSA2tvrS+hZEaaXfK4WhA== dependencies: - "@sentry-internal/browser-utils" "8.30.0" - "@sentry/core" "8.30.0" - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" + "@sentry-internal/browser-utils" "8.32.0" + "@sentry/core" "8.32.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" "@sentry/babel-plugin-component-annotate@2.22.3": version "2.22.3" resolved "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.3.tgz" integrity sha512-OlHA+i+vnQHRIdry4glpiS/xTOtgjmpXOt6IBOUqynx5Jd/iK1+fj+t8CckqOx9wRacO/hru2wfW/jFq0iViLg== -"@sentry/browser@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry/browser/-/browser-8.30.0.tgz" - integrity sha512-M+tKqawH9S3CqlAIcqdZcHbcsNQkEa9MrPqPCYvXco3C4LRpNizJP2XwBiGQY2yK+fOSvbaWpPtlI938/wuRZQ== +"@sentry/browser@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry/browser/-/browser-8.32.0.tgz" + integrity sha512-AEKFj64g4iYwEMRvVcxiY0FswmClRXCP1IEvCqujn8OBS8AjMOr1z/RwYieEs0D90yNNB3YEqF8adrKENblJmw== dependencies: - "@sentry-internal/browser-utils" "8.30.0" - "@sentry-internal/feedback" "8.30.0" - "@sentry-internal/replay" "8.30.0" - "@sentry-internal/replay-canvas" "8.30.0" - "@sentry/core" "8.30.0" - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" + "@sentry-internal/browser-utils" "8.32.0" + "@sentry-internal/feedback" "8.32.0" + "@sentry-internal/replay" "8.32.0" + "@sentry-internal/replay-canvas" "8.32.0" + "@sentry/core" "8.32.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" "@sentry/bundler-plugin-core@2.22.3": version "2.22.3" @@ -1340,36 +1319,6 @@ resolved "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.36.1.tgz" integrity sha512-JOHQjVD8Kqxm1jUKioAP5ohLOITf+Dh6+DBz4gQjCNdotsvNW5m63TKROwq2oB811p+Jzv5304ujmN4cAqW1Ww== -"@sentry/cli-linux-arm64@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.36.1.tgz#ff449d7e7e715166257998c02cf635ca02acbadd" - integrity sha512-R//3ZEkbzvoStr3IA7nxBZNiBYyxOljOqAhgiTnejXHmnuwDzM3TBA2n5vKPE/kBFxboEBEw0UTzTIRb1T0bgw== - -"@sentry/cli-linux-arm@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.36.1.tgz#1ae5d335a1b4cd217a34c2bd6c6f5e0670136eb3" - integrity sha512-gvEOKN0fWL2AVqUBKHNXPRZfJNvKTs8kQhS8cQqahZGgZHiPCI4BqW45cKMq+ZTt1UUbLmt6khx5Dz7wi+0i5A== - -"@sentry/cli-linux-i686@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.36.1.tgz#112b9e26357e918cbbba918114ec8cdab07cdf60" - integrity sha512-R7sW5Vk/HacVy2YgQoQB+PwccvFYf2CZVPSFSFm2z7MEfNe77UYHWUq+sjJ4vxWG6HDWGVmaX0fjxyDkE01JRA== - -"@sentry/cli-linux-x64@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.36.1.tgz#c3e5bdb0c9a4bb44c83927c62a3cd7e006709bf7" - integrity sha512-UMr3ik8ksA7zQfbzsfwCb+ztenLnaeAbX94Gp+bzANZwPfi/vVHf2bLyqsBs4OyVt9SPlN1bbM/RTGfMjZ3JOw== - -"@sentry/cli-win32-i686@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.36.1.tgz#819573320e885e1dbf59b0a01d3bd370c84c1708" - integrity sha512-CflvhnvxPEs5GWQuuDtYSLqPrBaPbcSJFlBuUIb+8WNzRxvVfjgw1qzfZmkQqABqiy/YEsEekllOoMFZAvCcVA== - -"@sentry/cli-win32-x64@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.36.1.tgz#80779b4bffb4e2e32944eae72c60e6f40151b4dc" - integrity sha512-wWqht2xghcK3TGnooHZSzA3WSjdtno/xFjZLvWmw38rblGwgKMxLZnlxV6uDyS+OJ6CbfDTlCRay/0TIqA0N8g== - "@sentry/cli@^2.33.1": version "2.36.1" resolved "https://registry.npmjs.org/@sentry/cli/-/cli-2.36.1.tgz" @@ -1389,45 +1338,48 @@ "@sentry/cli-win32-i686" "2.36.1" "@sentry/cli-win32-x64" "2.36.1" -"@sentry/core@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry/core/-/core-8.30.0.tgz" - integrity sha512-CJ/FuWLw0QEKGKXGL/nm9eaOdajEcmPekLuHAuOCxID7N07R9l9laz3vFbAkUZ97GGDv3sYrJZgywfY3Moropg== +"@sentry/core@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry/core/-/core-8.32.0.tgz" + integrity sha512-+xidTr0lZ0c755tq4k75dXPEb8PA+qvIefW3U9+dQMORLokBrYoKYMf5zZTG2k/OfSJS6OSxatUj36NFuCs3aA== dependencies: - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" "@sentry/nextjs@^8": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-8.30.0.tgz" - integrity sha512-835H7/ERIGvxE2m9cYqB5Mmd4PfLPlVQdyJAEL3br7fpl5mp3A3JtA3AiZ98smpVW/rUkLHGOWziRb6uTgJSXA== + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-8.32.0.tgz" + integrity sha512-rnnSsKFd4u9TXGr0XVQ7lEl/PkTfNyJ4kxwu9gW+OJjzmmjzIAC4RyY4YQTR1+p/q9QrruWrXLEsuCPqAHfqNw== dependencies: "@opentelemetry/instrumentation-http" "0.53.0" "@opentelemetry/semantic-conventions" "^1.27.0" "@rollup/plugin-commonjs" "26.0.1" - "@sentry/core" "8.30.0" - "@sentry/node" "8.30.0" - "@sentry/opentelemetry" "8.30.0" - "@sentry/react" "8.30.0" - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" - "@sentry/vercel-edge" "8.30.0" + "@sentry-internal/browser-utils" "8.32.0" + "@sentry/core" "8.32.0" + "@sentry/node" "8.32.0" + "@sentry/opentelemetry" "8.32.0" + "@sentry/react" "8.32.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" + "@sentry/vercel-edge" "8.32.0" "@sentry/webpack-plugin" "2.22.3" chalk "3.0.0" resolve "1.22.8" - rollup "3.29.4" + rollup "3.29.5" stacktrace-parser "^0.1.10" -"@sentry/node@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry/node/-/node-8.30.0.tgz" - integrity sha512-Tog0Ag7sU3lNj4cPUZy1KRJXyYXZlWiwlk34KYNNxAk0vDiK6W0bF8mvS+aaUukgb7FO5A0eu9l+VApdBJOr3Q== +"@sentry/node@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry/node/-/node-8.32.0.tgz" + integrity sha512-a2PoFA9j/HmJVGF/zXJhLP6QhRHGye/2EznQdHOELsH1BkeMgBaXl7D52r2E/b7qki647lXrdbspB6jid8NycA== dependencies: "@opentelemetry/api" "^1.9.0" "@opentelemetry/context-async-hooks" "^1.25.1" "@opentelemetry/core" "^1.25.1" "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/instrumentation-amqplib" "^0.42.0" "@opentelemetry/instrumentation-connect" "0.39.0" + "@opentelemetry/instrumentation-dataloader" "0.12.0" "@opentelemetry/instrumentation-express" "0.42.0" "@opentelemetry/instrumentation-fastify" "0.39.0" "@opentelemetry/instrumentation-fs" "0.15.0" @@ -1450,52 +1402,52 @@ "@opentelemetry/sdk-trace-base" "^1.26.0" "@opentelemetry/semantic-conventions" "^1.27.0" "@prisma/instrumentation" "5.19.1" - "@sentry/core" "8.30.0" - "@sentry/opentelemetry" "8.30.0" - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" + "@sentry/core" "8.32.0" + "@sentry/opentelemetry" "8.32.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" import-in-the-middle "^1.11.0" -"@sentry/opentelemetry@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.30.0.tgz" - integrity sha512-6mCIP2zvxAiEsNEoF8kv+UUD4XGWSKJU6RY5BF1U26HLitXv1fNPtzaTR96Ehv9h0zktjLfqfpVUZ7DGkdBvLA== +"@sentry/opentelemetry@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.32.0.tgz" + integrity sha512-YCD8EnwJJ2ab3zWWtu5VrvHP/6Ss6GGQH0TYx2cfeGG3c0wTA/5zYx9JR4i3hUtOh1pifN34HlY0yyQHD4yctg== dependencies: - "@sentry/core" "8.30.0" - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" + "@sentry/core" "8.32.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" -"@sentry/react@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry/react/-/react-8.30.0.tgz" - integrity sha512-ktQjXs87jdsxW0YrHci3sb6zcSzhMECWnrTVU/KGZF8UoDsk4P4xRCknijd2SSmDIjSkwzUAANR43UkCi4BTQg== +"@sentry/react@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry/react/-/react-8.32.0.tgz" + integrity sha512-YljqK+k80XOvyXjK2p2neTncRcSuwlpL7qHtNgwR1MHx18FEi7HXlnm13J4g3kxao4ORMxlCXCEPNXlLT+vqQg== dependencies: - "@sentry/browser" "8.30.0" - "@sentry/core" "8.30.0" - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" + "@sentry/browser" "8.32.0" + "@sentry/core" "8.32.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" hoist-non-react-statics "^3.3.2" -"@sentry/types@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry/types/-/types-8.30.0.tgz" - integrity sha512-kgWW2BCjBmVlSQRG32GonHEVyeDbys74xf9mLPvynwHTgw3+NUlNAlEdu05xnb2ow4bCTHfbkS5G1zRgyv5k4Q== +"@sentry/types@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry/types/-/types-8.32.0.tgz" + integrity sha512-hxckvN2MzS5SgGDgVQ0/QpZXk13Vrq4BtZLwXhPhyeTmZtUiUfWvcL5TFQqLinfKdTKPe9q2MxeAJ0D4LalhMg== -"@sentry/utils@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry/utils/-/utils-8.30.0.tgz" - integrity sha512-wZxU2HWlzsnu8214Xy7S7cRIuD6h8Z5DnnkojJfX0i0NLooepZQk2824el1Q13AakLb7/S8CHSHXOMnCtoSduw== +"@sentry/utils@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-8.32.0.tgz" + integrity sha512-t1WVERhgmYURxbBj9J4/H2P2X+VKqm7B3ce9iQyrZbdf5NekhcU4jHIecPUWCPHjQkFIqkVTorqeBmDTlg/UmQ== dependencies: - "@sentry/types" "8.30.0" + "@sentry/types" "8.32.0" -"@sentry/vercel-edge@8.30.0": - version "8.30.0" - resolved "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-8.30.0.tgz" - integrity sha512-0R0HWmPZwIOunj4JQoOT9FexhesAVNpMkM2mezP7QlVGGBQA39s9j8+o658Ymh8xzKo1ZTg4pHjoySLPhrN1JA== +"@sentry/vercel-edge@8.32.0": + version "8.32.0" + resolved "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-8.32.0.tgz" + integrity sha512-HxvQWQMjNsLPkYU0vArzjqh+p/vyw9CXyIruu3D89VQU0krL1JFhhhHWZj1UIb7MVTzNO4oq4HeldbOkI0AepA== dependencies: - "@sentry/core" "8.30.0" - "@sentry/types" "8.30.0" - "@sentry/utils" "8.30.0" + "@sentry/core" "8.32.0" + "@sentry/types" "8.32.0" + "@sentry/utils" "8.32.0" "@sentry/webpack-plugin@2.22.3": version "2.22.3" @@ -1520,7 +1472,7 @@ dependencies: "@supabase/node-fetch" "^2.6.14" -"@supabase/node-fetch@2.6.15", "@supabase/node-fetch@^2.6.14": +"@supabase/node-fetch@^2.6.14", "@supabase/node-fetch@2.6.15": version "2.6.15" resolved "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz" integrity sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ== @@ -1560,7 +1512,7 @@ dependencies: "@supabase/node-fetch" "^2.6.14" -"@supabase/supabase-js@^2.45.0": +"@supabase/supabase-js@^2.43.4", "@supabase/supabase-js@^2.45.0": version "2.45.1" resolved "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.45.1.tgz" integrity sha512-/PVe3lXmalazD8BGMIoI7+ttvT1mLXy13lNcoAPtjP1TDDY83g8csZbVR6l+0/RZtvJxl3LGXfTJT4bjWgC5Nw== @@ -1696,7 +1648,7 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0": +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -1708,6 +1660,11 @@ dependencies: "@types/unist" "*" +"@types/json-schema@^7.0.8": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" @@ -1746,16 +1703,7 @@ dependencies: "@types/pg" "*" -"@types/pg@*": - version "8.11.9" - resolved "https://registry.npmjs.org/@types/pg/-/pg-8.11.9.tgz" - integrity sha512-M4mYeJZRBD9lCBCGa72F44uKSV9eJrAFfjlPJagdA6pgIr2OPJULFB7nqnZzOdqXG0qzHlgtZKzTdIgbmHitSg== - dependencies: - "@types/node" "*" - pg-protocol "*" - pg-types "^4.0.1" - -"@types/pg@8.6.1": +"@types/pg@*", "@types/pg@8.6.1": version "8.6.1" resolved "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz" integrity sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w== @@ -1774,7 +1722,7 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@^18": +"@types/react-dom@*", "@types/react-dom@^18": version "18.3.0" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== @@ -1788,7 +1736,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18": +"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^18", "@types/react@>=16.8", "@types/react@>=18": version "18.3.4" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz" integrity sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw== @@ -1869,6 +1817,137 @@ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + "@xyflow/react@^12.1.0": version "12.1.1" resolved "https://registry.npmjs.org/@xyflow/react/-/react-12.1.1.tgz" @@ -1901,7 +1980,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: version "8.12.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -1913,6 +1992,11 @@ agent-base@6: dependencies: debug "4" +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -1923,6 +2007,16 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^8.17.1: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" @@ -2154,7 +2248,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.23.1: +browserslist@^4.21.10, browserslist@^4.23.1, "browserslist@>= 4.21.0": version "4.23.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz" integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== @@ -2164,6 +2258,11 @@ browserslist@^4.23.1: node-releases "^2.0.18" update-browserslist-db "^1.1.0" +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + busboy@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" @@ -2192,12 +2291,7 @@ camelcase-css@^2.0.1: resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -caniuse-lite@^1.0.30001579: - version "1.0.30001651" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz" - integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg== - -caniuse-lite@^1.0.30001646: +caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646: version "1.0.30001659" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001659.tgz" integrity sha512-Qxxyfv3RdHAfJcXelgf0hU4DFUVXBGTjqrBUZLUh8AtlGnsDo+CnncYtTd95+ZKfnANUOzxyIQCuU/UeBZBYoA== @@ -2207,14 +2301,6 @@ ccount@^2.0.0: resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chalk@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -2232,6 +2318,14 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + character-entities-html4@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" @@ -2267,6 +2361,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chrome-trace-event@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== + cjs-module-lexer@^1.2.2: version "1.4.1" resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz" @@ -2289,16 +2388,16 @@ client-only@0.0.1: resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -clsx@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" - integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== - clsx@^2.0.0, clsx@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== +clsx@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + cmdk@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz" @@ -2321,21 +2420,26 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + comma-separated-tokens@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^4.0.0: version "4.1.1" resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" @@ -2380,7 +2484,7 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: +d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3": version "3.2.4" resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== @@ -2397,7 +2501,7 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== -"d3-drag@2 - 3", d3-drag@^3.0.0: +d3-drag@^3.0.0, "d3-drag@2 - 3": version "3.0.0" resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== @@ -2405,7 +2509,7 @@ csstype@^3.0.2: d3-dispatch "1 - 3" d3-selection "3" -"d3-ease@1 - 3", d3-ease@^3.0.1: +d3-ease@^3.0.1, "d3-ease@1 - 3": version "3.0.1" resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== @@ -2415,7 +2519,7 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== -"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: +d3-interpolate@^3.0.1, "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3": version "3.0.1" resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== @@ -2438,7 +2542,7 @@ d3-scale@^4.0.2: d3-time "2.1.1 - 3" d3-time-format "2 - 4" -"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: +d3-selection@^3.0.0, "d3-selection@2 - 3", d3-selection@3: version "3.0.0" resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== @@ -2457,14 +2561,14 @@ d3-shape@^3.1.0: dependencies: d3-time "1 - 3" -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: +d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3": version "3.1.0" resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" -"d3-timer@1 - 3", d3-timer@^3.0.1: +d3-timer@^3.0.1, "d3-timer@1 - 3": version "3.0.1" resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== @@ -2523,18 +2627,11 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -date-fns@^3.6.0: +"date-fns@^2.28.0 || ^3.0.0", date-fns@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz" integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== -debug@4, debug@^4.1.0, debug@^4.3.5: - version "4.3.7" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -2542,12 +2639,12 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.6" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== +debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@4: + version "4.3.7" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" decimal.js-light@^2.4.1: version "2.5.1" @@ -2694,7 +2791,7 @@ emoji-regex@^9.2.2: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -enhanced-resolve@^5.12.0: +enhanced-resolve@^5.12.0, enhanced-resolve@^5.17.1: version "5.17.1" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz" integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== @@ -2801,6 +2898,11 @@ es-iterator-helpers@^1.0.19: iterator.prototype "^1.1.2" safe-array-concat "^1.1.2" +es-module-lexer@^1.2.1: + version "1.5.4" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== + es-object-atoms@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" @@ -2892,7 +2994,7 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" -eslint-plugin-import@^2.28.1: +eslint-plugin-import@*, eslint-plugin-import@^2.28.1: version "2.29.1" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== @@ -2974,12 +3076,20 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8, eslint@^8.56.0: version "8.57.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== @@ -3046,6 +3156,11 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" @@ -3071,6 +3186,11 @@ eventemitter3@^4.0.1: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + exenv@^1.2.0: version "1.2.2" resolved "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz" @@ -3180,16 +3300,11 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@2.3.2: +fsevents@~2.3.2, fsevents@2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -3247,7 +3362,7 @@ get-tsconfig@^4.5.0: dependencies: resolve-pkg-maps "^1.0.0" -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3261,18 +3376,19 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@10.3.10, glob@^10.3.10: - version "10.3.10" - resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" + is-glob "^4.0.1" -glob@^10.4.1: +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^10.3.10, glob@^10.4.1: version "10.4.5" resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== @@ -3306,6 +3422,17 @@ glob@^9.3.2: minipass "^4.2.4" path-scurry "^1.6.1" +glob@10.3.10: + version "10.3.10" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -3345,7 +3472,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.2.11, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4: 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== @@ -3463,9 +3590,9 @@ import-fresh@^3.2.1: resolve-from "^4.0.0" import-in-the-middle@^1.11.0, import-in-the-middle@^1.8.1: - version "1.11.0" - resolved "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.0.tgz" - integrity sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q== + version "1.11.1" + resolved "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.1.tgz" + integrity sha512-lGdg70ECFGv/OHQXL/IPhcxkFPeQ7YA4zborlA54XHVr58oM50QNxItRiayHMqj1MspC5Y9zaHf+QHod/gq7Ug== dependencies: acorn "^8.8.2" acorn-import-attributes "^1.9.5" @@ -3780,6 +3907,15 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jiti@^1.21.0: version "1.21.6" resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz" @@ -3807,6 +3943,11 @@ json-buffer@3.0.1: resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -3886,6 +4027,11 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -3932,13 +4078,6 @@ lucide-react@^0.407.0: resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.407.0.tgz" integrity sha512-+dRIu9Sry+E8wPF9+sY5eKld2omrU4X5IKXxrgqBt+o11IIHVU0QOfNoVWFuj0ZRDrxr4Wci26o2mKZqLGE0lA== -magic-string@0.30.8: - version "0.30.8" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz" - integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - magic-string@^0.30.3: version "0.30.11" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz" @@ -3946,6 +4085,13 @@ magic-string@^0.30.3: dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" +magic-string@0.30.8: + version "0.30.8" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + mdast-util-from-markdown@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz" @@ -4051,6 +4197,11 @@ mdast-util-to-string@^4.0.0: dependencies: "@types/mdast" "^4.0.0" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" @@ -4251,19 +4402,24 @@ micromark@^4.0.0: micromark-util-types "^2.0.0" micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.7" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - brace-expansion "^2.0.1" + mime-db "1.52.0" minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" @@ -4279,13 +4435,27 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1, minimatch@^9.0.4: +minimatch@^9.0.1: version "9.0.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" @@ -4311,12 +4481,7 @@ moment@^2.30.1: resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.3: +ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -4340,17 +4505,22 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + next-themes@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz" integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== -next@14.2.4: - version "14.2.4" - resolved "https://registry.npmjs.org/next/-/next-14.2.4.tgz" - integrity sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ== +"next@^13.0.0 || ^14.0.0", "next@^13.2.0 || ^14.0 || ^15.0.0-rc.0", next@^14.2.13: + version "14.2.13" + resolved "https://registry.npmjs.org/next/-/next-14.2.13.tgz" + integrity sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg== dependencies: - "@next/env" "14.2.4" + "@next/env" "14.2.13" "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -4358,15 +4528,15 @@ next@14.2.4: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.4" - "@next/swc-darwin-x64" "14.2.4" - "@next/swc-linux-arm64-gnu" "14.2.4" - "@next/swc-linux-arm64-musl" "14.2.4" - "@next/swc-linux-x64-gnu" "14.2.4" - "@next/swc-linux-x64-musl" "14.2.4" - "@next/swc-win32-arm64-msvc" "14.2.4" - "@next/swc-win32-ia32-msvc" "14.2.4" - "@next/swc-win32-x64-msvc" "14.2.4" + "@next/swc-darwin-arm64" "14.2.13" + "@next/swc-darwin-x64" "14.2.13" + "@next/swc-linux-arm64-gnu" "14.2.13" + "@next/swc-linux-arm64-musl" "14.2.13" + "@next/swc-linux-x64-gnu" "14.2.13" + "@next/swc-linux-x64-musl" "14.2.13" + "@next/swc-win32-arm64-msvc" "14.2.13" + "@next/swc-win32-ia32-msvc" "14.2.13" + "@next/swc-win32-x64-msvc" "14.2.13" node-fetch@^2.6.7: version "2.7.0" @@ -4460,11 +4630,6 @@ object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: define-properties "^1.2.1" es-object-atoms "^1.0.0" -obuf@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - once@^1.3.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" @@ -4562,15 +4727,10 @@ pg-int8@1.0.1: resolved "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-numeric@1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz" - integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== - pg-protocol@*: - version "1.6.1" - resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz" - integrity sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg== + version "1.7.0" + resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz" + integrity sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ== pg-types@^2.2.0: version "2.2.0" @@ -4583,19 +4743,6 @@ pg-types@^2.2.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg-types@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz" - integrity sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng== - dependencies: - pg-int8 "1.0.1" - pg-numeric "1.0.2" - postgres-array "~3.0.1" - postgres-bytea "~3.0.0" - postgres-date "~2.1.0" - postgres-interval "^3.0.0" - postgres-range "^1.1.1" - picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" @@ -4618,12 +4765,12 @@ pirates@^4.0.1: playwright-core@1.47.1: version "1.47.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.47.1.tgz#bb45bdfb0d48412c535501aa3805867282857df8" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.1.tgz" integrity sha512-i1iyJdLftqtt51mEk6AhYFaAJCDx0xQ/O5NU8EKaWFgMjItPVma542Nh/Aq8aLCjIJSzjaiEQGW/nyqLkGF1OQ== playwright@1.47.1: version "1.47.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.47.1.tgz#cdc1116f5265b8d2ff7be0d8942d49900634dc6c" + resolved "https://registry.npmjs.org/playwright/-/playwright-1.47.1.tgz" integrity sha512-SUEKi6947IqYbKxRiqnbUobVZY4bF1uu+ZnZNJX9DfU1tlf2UhWfvVjLf01pQx9URsOr18bFVUKXmanYWhbfkw== dependencies: playwright-core "1.47.1" @@ -4679,6 +4826,15 @@ postcss-value-parser@^4.0.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@^8, postcss@^8.0.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9: + version "8.4.41" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + postcss@8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" @@ -4688,47 +4844,21 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8, postcss@^8.4.23: - version "8.4.41" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz" - integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" - postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== -postgres-array@~3.0.1: - version "3.0.2" - resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz" - integrity sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog== - postgres-bytea@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz" integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== -postgres-bytea@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz" - integrity sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw== - dependencies: - obuf "~1.1.2" - postgres-date@~1.0.4: version "1.0.7" resolved "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz" integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== -postgres-date@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz" - integrity sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA== - postgres-interval@^1.1.0: version "1.2.0" resolved "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz" @@ -4736,16 +4866,6 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -postgres-interval@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz" - integrity sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw== - -postgres-range@^1.1.1: - version "1.1.4" - resolved "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz" - integrity sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w== - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -4756,7 +4876,7 @@ prettier-plugin-tailwindcss@^0.6.6: resolved "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.6.tgz" integrity sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng== -prettier@^3.3.3: +prettier@^3.0, prettier@^3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== @@ -4795,12 +4915,19 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + react-day-picker@^8.10.1: version "8.10.1" resolved "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz" integrity sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA== -react-dom@^18: +"react-dom@^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8 || ^17 || ^18", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", react-dom@^18, react-dom@^18.0.0, react-dom@^18.2.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=17: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -4808,7 +4935,7 @@ react-dom@^18: loose-envify "^1.1.0" scheduler "^0.23.2" -react-hook-form@^7.52.1: +react-hook-form@^7.0.0, react-hook-form@^7.52.1: version "7.52.2" resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.52.2.tgz" integrity sha512-pqfPEbERnxxiNMPd0bzmt1tuaPcVccywFDpyk2uV5xCIBphHV5T8SVnX9/o3kplPE1zzKt77+YIoq+EMwJp56A== @@ -4919,7 +5046,7 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^18: +react@*, "react@^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.14.0 || 17.x || 18.x || 19.x", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.x || ^17.x || ^18.x", react@^18, react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=17, react@>=18: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -5034,7 +5161,7 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@1.22.8, resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.22.8: +resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.22.8, resolve@1.22.8: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -5064,10 +5191,10 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup@3.29.4: - version "3.29.4" - resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz" - integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== +rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.68.0||^3.0.0||^4.0.0, rollup@3.29.5: + version "3.29.5" + resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz" + integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w== optionalDependencies: fsevents "~2.3.2" @@ -5088,6 +5215,11 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" @@ -5104,6 +5236,15 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" +schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" @@ -5114,6 +5255,13 @@ semver@^7.5.2, semver@^7.5.4: resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" @@ -5187,6 +5335,19 @@ source-map-js@^1.0.2, source-map-js@^1.2.0: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" @@ -5211,7 +5372,16 @@ streamsearch@^1.1.0: resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5299,7 +5469,14 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -5364,6 +5541,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -5379,7 +5563,7 @@ tailwindcss-animate@^1.0.7: resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== -tailwindcss@^3.4.1: +tailwindcss@^3.4.1, "tailwindcss@>=3.0.0 || insiders": version "3.4.10" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz" integrity sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w== @@ -5407,11 +5591,32 @@ tailwindcss@^3.4.1: resolve "^1.22.2" sucrase "^3.32.0" -tapable@^2.2.0: +tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.26.0: + version "5.34.0" + resolved "https://registry.npmjs.org/terser/-/terser-5.34.0.tgz" + integrity sha512-y5NUX+U9HhVsK/zihZwoq4r9dICLyV2jXGOriDAVOeKhq3LKVjgJbGO90FisozXLlJfvjHqgckGmJFBb9KYoWQ== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -5554,7 +5759,7 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5: +typescript@^5, typescript@^5.0.0, typescript@>=3.3.1, typescript@>=4.2.0: version "5.5.4" resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== @@ -5737,6 +5942,14 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -5752,6 +5965,35 @@ webpack-virtual-modules@^0.5.0: resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz" integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== +webpack@^5.1.0, webpack@>=4.40.0, webpack@5.94.0: + version "5.94.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz" + integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== + dependencies: + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-attributes "^1.9.5" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" From d7e59966efbb8a20a73855d203c6cdc8e83cf923 Mon Sep 17 00:00:00 2001 From: Bently Date: Fri, 27 Sep 2024 21:29:59 +0100 Subject: [PATCH 015/155] Feat(Builder): Add Google Maps Search Block (#8162) * Feat(Builder): Add Google Maps Search Block * format * Updates to google maps search block * fixes * format + updates again * fix for pytest * format again * updates based on new comments * fix for format? --------- Co-authored-by: Zamil Majdy --- autogpt_platform/backend/.env.example | 2 + .../backend/backend/blocks/google_maps.py | 127 ++++++++++++++++++ .../backend/backend/util/settings.py | 2 + autogpt_platform/backend/poetry.lock | 15 ++- autogpt_platform/backend/pyproject.toml | 1 + 5 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 autogpt_platform/backend/backend/blocks/google_maps.py diff --git a/autogpt_platform/backend/.env.example b/autogpt_platform/backend/.env.example index fed9a309d2..9cc3b9b6a6 100644 --- a/autogpt_platform/backend/.env.example +++ b/autogpt_platform/backend/.env.example @@ -74,6 +74,8 @@ SMTP_PASSWORD= MEDIUM_API_KEY= MEDIUM_AUTHOR_ID= +# Google Maps +GOOGLE_MAPS_API_KEY= # Logging Configuration LOG_LEVEL=INFO diff --git a/autogpt_platform/backend/backend/blocks/google_maps.py b/autogpt_platform/backend/backend/blocks/google_maps.py new file mode 100644 index 0000000000..4edd74113d --- /dev/null +++ b/autogpt_platform/backend/backend/blocks/google_maps.py @@ -0,0 +1,127 @@ +import googlemaps +from pydantic import BaseModel + +from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema +from backend.data.model import BlockSecret, SchemaField, SecretField + + +class Place(BaseModel): + name: str + address: str + phone: str + rating: float + reviews: int + website: str + + +class GoogleMapsSearchBlock(Block): + class Input(BlockSchema): + api_key: BlockSecret = SecretField( + key="google_maps_api_key", + description="Google Maps API Key", + ) + query: str = SchemaField( + description="Search query for local businesses", + placeholder="e.g., 'restaurants in New York'", + ) + radius: int = SchemaField( + description="Search radius in meters (max 50000)", + default=5000, + ge=1, + le=50000, + ) + max_results: int = SchemaField( + description="Maximum number of results to return (max 60)", + default=20, + ge=1, + le=60, + ) + + class Output(BlockSchema): + place: Place = SchemaField(description="Place found") + error: str = SchemaField(description="Error message if the search failed") + + def __init__(self): + super().__init__( + id="f47ac10b-58cc-4372-a567-0e02b2c3d479", + description="This block searches for local businesses using Google Maps API.", + categories={BlockCategory.SEARCH}, + input_schema=GoogleMapsSearchBlock.Input, + output_schema=GoogleMapsSearchBlock.Output, + test_input={ + "api_key": "your_test_api_key", + "query": "restaurants in new york", + "radius": 5000, + "max_results": 5, + }, + test_output=[ + ( + "place", + { + "name": "Test Restaurant", + "address": "123 Test St, New York, NY 10001", + "phone": "+1 (555) 123-4567", + "rating": 4.5, + "reviews": 100, + "website": "https://testrestaurant.com", + }, + ), + ], + test_mock={ + "search_places": lambda *args, **kwargs: [ + { + "name": "Test Restaurant", + "address": "123 Test St, New York, NY 10001", + "phone": "+1 (555) 123-4567", + "rating": 4.5, + "reviews": 100, + "website": "https://testrestaurant.com", + } + ] + }, + ) + + def run(self, input_data: Input, **kwargs) -> BlockOutput: + try: + places = self.search_places( + input_data.api_key.get_secret_value(), + input_data.query, + input_data.radius, + input_data.max_results, + ) + for place in places: + yield "place", place + except Exception as e: + yield "error", str(e) + + def search_places(self, api_key, query, radius, max_results): + client = googlemaps.Client(key=api_key) + return self._search_places(client, query, radius, max_results) + + def _search_places(self, client, query, radius, max_results): + results = [] + next_page_token = None + while len(results) < max_results: + response = client.places( + query=query, + radius=radius, + page_token=next_page_token, + ) + for place in response["results"]: + if len(results) >= max_results: + break + place_details = client.place(place["place_id"])["result"] + results.append( + Place( + name=place_details.get("name", ""), + address=place_details.get("formatted_address", ""), + phone=place_details.get("formatted_phone_number", ""), + rating=place_details.get("rating", 0), + reviews=place_details.get("user_ratings_total", 0), + website=place_details.get("website", ""), + ) + ) + next_page_token = response.get("next_page_token") + if not next_page_token: + break + return results diff --git a/autogpt_platform/backend/backend/util/settings.py b/autogpt_platform/backend/backend/util/settings.py index 83f82ee10f..d4bdc0479d 100644 --- a/autogpt_platform/backend/backend/util/settings.py +++ b/autogpt_platform/backend/backend/util/settings.py @@ -216,6 +216,8 @@ class Secrets(UpdateTrackingModel["Secrets"], BaseSettings): sentry_dsn: str = Field(default="", description="Sentry DSN") + google_maps_api_key: str = Field(default="", description="Google Maps API Key") + # Add more secret fields as needed model_config = SettingsConfigDict( diff --git a/autogpt_platform/backend/poetry.lock b/autogpt_platform/backend/poetry.lock index e76165a144..b6b9047a2c 100644 --- a/autogpt_platform/backend/poetry.lock +++ b/autogpt_platform/backend/poetry.lock @@ -989,6 +989,19 @@ protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4 [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] +[[package]] +name = "googlemaps" +version = "4.10.0" +description = "Python client library for Google Maps Platform" +optional = false +python-versions = ">=3.5" +files = [ + {file = "googlemaps-4.10.0.tar.gz", hash = "sha256:3055fcbb1aa262a9159b589b5e6af762b10e80634ae11c59495bd44867e47d88"}, +] + +[package.dependencies] +requests = ">=2.20.0,<3.0" + [[package]] name = "gotrue" version = "2.8.1" @@ -3623,4 +3636,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "311c527a1d1947af049dac27c7a2b2f49d7fa4cdede52ef436422a528b0ad866" +content-hash = "f42fdf521b0476048626238ee631b618a71ed079c369c28035a899f2252369c9" diff --git a/autogpt_platform/backend/pyproject.toml b/autogpt_platform/backend/pyproject.toml index c7c3be2005..3a58cfa75c 100644 --- a/autogpt_platform/backend/pyproject.toml +++ b/autogpt_platform/backend/pyproject.toml @@ -44,6 +44,7 @@ tenacity = "^8.3.0" uvicorn = { extras = ["standard"], version = "^0.30.1" } websockets = "^12.0" youtube-transcript-api = "^0.6.2" +googlemaps = "^4.10.0" [tool.poetry.group.dev.dependencies] poethepoet = "^0.26.1" From 3ac0e2d1d383f03a3fc4febbf40fb764a364ffbc Mon Sep 17 00:00:00 2001 From: Michael Sheinman Date: Sat, 28 Sep 2024 15:52:28 -0400 Subject: [PATCH 016/155] fix(platform) Fix stuck tutorial bug on add block step (#8213) --- autogpt_platform/frontend/src/components/tutorial.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/autogpt_platform/frontend/src/components/tutorial.ts b/autogpt_platform/frontend/src/components/tutorial.ts index 3282d06bf3..24a4e66004 100644 --- a/autogpt_platform/frontend/src/components/tutorial.ts +++ b/autogpt_platform/frontend/src/components/tutorial.ts @@ -182,7 +182,7 @@ export const startTutorial = ( tour.addStep({ id: "scroll-block-menu", title: "Scroll Down or Search", - text: 'Scroll down or search in the blocks menu for the "Calculator Block" and press the "+" to add the block.', + text: 'Scroll down or search in the blocks menu for the "Calculator Block" and press the block to add it.', attachTo: { element: '[data-id="blocks-control-popover-content"]', on: "right", @@ -191,12 +191,11 @@ export const startTutorial = ( beforeShowPromise: () => waitForElement('[data-id="blocks-control-popover-content"]').then(() => { disableOtherBlocks( - '[data-id="add-block-button-b1ab9b19-67a6-406d-abf5-2dba76d00c79"]', + '[data-id="block-card-b1ab9b19-67a6-406d-abf5-2dba76d00c79"]', ); }), advanceOn: { - selector: - '[data-id="add-block-button-b1ab9b19-67a6-406d-abf5-2dba76d00c79"]', + selector: '[data-id="block-card-b1ab9b19-67a6-406d-abf5-2dba76d00c79"]', event: "click", }, when: { From 22fb9bc635443a8448739050e35100d37c416001 Mon Sep 17 00:00:00 2001 From: ymrohit <34777717+ymrohit@users.noreply.github.com> Date: Sun, 29 Sep 2024 22:24:42 +0100 Subject: [PATCH 017/155] Added Replicate Flux Blocks for image generation (#8216) * Added Replicate Flux Blocks * updated poetry lock file for replicate * Refactor ReplicateFluxAdvancedModelBlock to use an enum for replicate_model_name rather than free strings. * Refactor ReplicateFluxAdvancedModelBlock to use an enum for output_format instead of free strings * Refactor ReplicateFluxAdvancedModelBlock to stop requiring people to type a random seed * Refactor ReplicateFluxAdvancedModelBlock to stop requiring people to type a random seed * run format * poetry run format * Delete ReplicateFluxBasicModelBlock * Mark model name as not advanced * tweak input order * Fix test --------- Co-authored-by: Toran Bruce Richards --- autogpt_platform/backend/.env.example | 3 + .../backend/blocks/replicate_flux_advanced.py | 204 ++++ .../backend/backend/util/settings.py | 1 + autogpt_platform/backend/poetry.lock | 909 +++++++++--------- autogpt_platform/backend/pyproject.toml | 1 + 5 files changed, 679 insertions(+), 439 deletions(-) create mode 100644 autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py diff --git a/autogpt_platform/backend/.env.example b/autogpt_platform/backend/.env.example index 9cc3b9b6a6..8419c8f5df 100644 --- a/autogpt_platform/backend/.env.example +++ b/autogpt_platform/backend/.env.example @@ -77,6 +77,9 @@ MEDIUM_AUTHOR_ID= # Google Maps GOOGLE_MAPS_API_KEY= +# Replicate +REPLICATE_API_KEY= + # Logging Configuration LOG_LEVEL=INFO ENABLE_CLOUD_LOGGING=false diff --git a/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py b/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py new file mode 100644 index 0000000000..1ce25c443b --- /dev/null +++ b/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py @@ -0,0 +1,204 @@ +import os +from enum import Enum + +import replicate + +from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema +from backend.data.model import BlockSecret, SchemaField, SecretField + + +# Model name enum +class ReplicateFluxModelName(str, Enum): + FLUX_SCHNELL = ("Flux Schnell",) + FLUX_PRO = ("Flux Pro",) + FLUX_DEV = ("Flux Dev",) + + @property + def api_name(self): + api_names = { + ReplicateFluxModelName.FLUX_SCHNELL: "black-forest-labs/flux-schnell", + ReplicateFluxModelName.FLUX_PRO: "black-forest-labs/flux-pro", + ReplicateFluxModelName.FLUX_DEV: "black-forest-labs/flux-dev", + } + return api_names[self] + + +# Image type Enum +class ImageType(str, Enum): + WEBP = "webp" + JPG = "jpg" + PNG = "png" + + +class ReplicateFluxAdvancedModelBlock(Block): + class Input(BlockSchema): + api_key: BlockSecret = SecretField( + key="replicate_api_key", + description="Replicate API Key", + ) + prompt: str = SchemaField( + description="Text prompt for image generation", + placeholder="e.g., 'A futuristic cityscape at sunset'", + title="Prompt", + ) + replicate_model_name: ReplicateFluxModelName = SchemaField( + description="The name of the Image Generation Model, i.e Flux Schnell", + default=ReplicateFluxModelName.FLUX_SCHNELL, + title="Image Generation Model", + advanced=False, + ) + seed: int | None = SchemaField( + description="Random seed. Set for reproducible generation", + default=None, + title="Seed", + ) + steps: int = SchemaField( + description="Number of diffusion steps", + default=25, + title="Steps", + ) + guidance: float = SchemaField( + description=( + "Controls the balance between adherence to the text prompt and image quality/diversity. " + "Higher values make the output more closely match the prompt but may reduce overall image quality." + ), + default=3, + title="Guidance", + ) + interval: float = SchemaField( + description=( + "Interval is a setting that increases the variance in possible outputs. " + "Setting this value low will ensure strong prompt following with more consistent outputs." + ), + default=2, + title="Interval", + ) + aspect_ratio: str = SchemaField( + description="Aspect ratio for the generated image", + default="1:1", + title="Aspect Ratio", + placeholder="Choose from: 1:1, 16:9, 2:3, 3:2, 4:5, 5:4, 9:16", + ) + output_format: ImageType = SchemaField( + description="File format of the output image", + default=ImageType.WEBP, + title="Output Format", + ) + output_quality: int = SchemaField( + description=( + "Quality when saving the output images, from 0 to 100. " + "Not relevant for .png outputs" + ), + default=80, + title="Output Quality", + ) + safety_tolerance: int = SchemaField( + description="Safety tolerance, 1 is most strict and 5 is most permissive", + default=2, + title="Safety Tolerance", + ) + + class Output(BlockSchema): + result: str = SchemaField(description="Generated output") + error: str = SchemaField(description="Error message if the model run failed") + + def __init__(self): + super().__init__( + id="90f8c45e-e983-4644-aa0b-b4ebe2f531bc", + description="This block runs Flux models on Replicate with advanced settings.", + categories={BlockCategory.AI}, + input_schema=ReplicateFluxAdvancedModelBlock.Input, + output_schema=ReplicateFluxAdvancedModelBlock.Output, + test_input={ + "api_key": "test_api_key", + "replicate_model_name": ReplicateFluxModelName.FLUX_SCHNELL, + "prompt": "A beautiful landscape painting of a serene lake at sunrise", + "seed": None, + "steps": 25, + "guidance": 3.0, + "interval": 2.0, + "aspect_ratio": "1:1", + "output_format": ImageType.PNG, + "output_quality": 80, + "safety_tolerance": 2, + }, + test_output=[ + ( + "result", + "https://replicate.com/output/generated-image-url.jpg", + ), + ], + test_mock={ + "run_model": lambda api_key, model_name, prompt, seed, steps, guidance, interval, aspect_ratio, output_format, output_quality, safety_tolerance: "https://replicate.com/output/generated-image-url.jpg", + }, + ) + + def run(self, input_data: Input, **kwargs) -> BlockOutput: + # If the seed is not provided, generate a random seed + seed = input_data.seed + if seed is None: + seed = int.from_bytes(os.urandom(4), "big") + + try: + # Run the model using the provided inputs + result = self.run_model( + api_key=input_data.api_key.get_secret_value(), + model_name=input_data.replicate_model_name.api_name, + prompt=input_data.prompt, + seed=seed, + steps=input_data.steps, + guidance=input_data.guidance, + interval=input_data.interval, + aspect_ratio=input_data.aspect_ratio, + output_format=input_data.output_format, + output_quality=input_data.output_quality, + safety_tolerance=input_data.safety_tolerance, + ) + yield "result", result + except Exception as e: + yield "error", str(e) + + def run_model( + self, + api_key, + model_name, + prompt, + seed, + steps, + guidance, + interval, + aspect_ratio, + output_format, + output_quality, + safety_tolerance, + ): + # Initialize Replicate client with the API key + client = replicate.Client(api_token=api_key) + + # Run the model with additional parameters + output = client.run( + f"{model_name}", + input={ + "prompt": prompt, + "seed": seed, + "steps": steps, + "guidance": guidance, + "interval": interval, + "aspect_ratio": aspect_ratio, + "output_format": output_format, + "output_quality": output_quality, + "safety_tolerance": safety_tolerance, + }, + ) + + # Check if output is a list or a string and extract accordingly; otherwise, assign a default message + if isinstance(output, list) and len(output) > 0: + result_url = output[0] # If output is a list, get the first element + elif isinstance(output, str): + result_url = output # If output is a string, use it directly + else: + result_url = ( + "No output received" # Fallback message if output is not as expected + ) + + return result_url diff --git a/autogpt_platform/backend/backend/util/settings.py b/autogpt_platform/backend/backend/util/settings.py index d4bdc0479d..c76399eba6 100644 --- a/autogpt_platform/backend/backend/util/settings.py +++ b/autogpt_platform/backend/backend/util/settings.py @@ -218,6 +218,7 @@ class Secrets(UpdateTrackingModel["Secrets"], BaseSettings): google_maps_api_key: str = Field(default="", description="Google Maps API Key") + replicate_api_key: str = Field(default="", description="Replicate API Key") # Add more secret fields as needed model_config = SettingsConfigDict( diff --git a/autogpt_platform/backend/poetry.lock b/autogpt_platform/backend/poetry.lock index b6b9047a2c..aa61694b8e 100644 --- a/autogpt_platform/backend/poetry.lock +++ b/autogpt_platform/backend/poetry.lock @@ -17,113 +17,113 @@ yarl = "*" [[package]] name = "aiohappyeyeballs" -version = "2.4.0" +version = "2.4.2" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd"}, - {file = "aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2"}, + {file = "aiohappyeyeballs-2.4.2-py3-none-any.whl", hash = "sha256:8522691d9a154ba1145b157d6d5c15e5c692527ce6a53c5e5f9876977f6dab2f"}, + {file = "aiohappyeyeballs-2.4.2.tar.gz", hash = "sha256:4ca893e6c5c1f5bf3888b04cb5a3bee24995398efef6e0b9f747b5e89d84fd74"}, ] [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.8" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:18a01eba2574fb9edd5f6e5fb25f66e6ce061da5dab5db75e13fe1558142e0a3"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:94fac7c6e77ccb1ca91e9eb4cb0ac0270b9fb9b289738654120ba8cebb1189c6"}, - {file = "aiohttp-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f1f1c75c395991ce9c94d3e4aa96e5c59c8356a15b1c9231e783865e2772699"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7acae3cf1a2a2361ec4c8e787eaaa86a94171d2417aae53c0cca6ca3118ff6"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94c4381ffba9cc508b37d2e536b418d5ea9cfdc2848b9a7fea6aebad4ec6aac1"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c31ad0c0c507894e3eaa843415841995bf8de4d6b2d24c6e33099f4bc9fc0d4f"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0912b8a8fadeb32ff67a3ed44249448c20148397c1ed905d5dac185b4ca547bb"}, - {file = "aiohttp-3.10.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d93400c18596b7dc4794d48a63fb361b01a0d8eb39f28800dc900c8fbdaca91"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3c5e0d764a5c9aa5a62d99728c56d455310bcc288a79cab10157b3af426f"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d742c36ed44f2798c8d3f4bc511f479b9ceef2b93f348671184139e7d708042c"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:814375093edae5f1cb31e3407997cf3eacefb9010f96df10d64829362ae2df69"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8224f98be68a84b19f48e0bdc14224b5a71339aff3a27df69989fa47d01296f3"}, - {file = "aiohttp-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9a487ef090aea982d748b1b0d74fe7c3950b109df967630a20584f9a99c0683"}, - {file = "aiohttp-3.10.5-cp310-cp310-win32.whl", hash = "sha256:d9ef084e3dc690ad50137cc05831c52b6ca428096e6deb3c43e95827f531d5ef"}, - {file = "aiohttp-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:66bf9234e08fe561dccd62083bf67400bdbf1c67ba9efdc3dac03650e97c6088"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf"}, - {file = "aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277"}, - {file = "aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058"}, - {file = "aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072"}, - {file = "aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a"}, - {file = "aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f"}, - {file = "aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91"}, - {file = "aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6"}, - {file = "aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12"}, - {file = "aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77"}, - {file = "aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa"}, - {file = "aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5"}, - {file = "aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987"}, - {file = "aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04"}, - {file = "aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f6f18898ace4bcd2d41a122916475344a87f1dfdec626ecde9ee802a711bc569"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5ede29d91a40ba22ac1b922ef510aab871652f6c88ef60b9dcdf773c6d32ad7a"}, - {file = "aiohttp-3.10.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:673f988370f5954df96cc31fd99c7312a3af0a97f09e407399f61583f30da9bc"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58718e181c56a3c02d25b09d4115eb02aafe1a732ce5714ab70326d9776457c3"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b38b1570242fbab8d86a84128fb5b5234a2f70c2e32f3070143a6d94bc854cf"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:074d1bff0163e107e97bd48cad9f928fa5a3eb4b9d33366137ffce08a63e37fe"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd31f176429cecbc1ba499d4aba31aaccfea488f418d60376b911269d3b883c5"}, - {file = "aiohttp-3.10.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7384d0b87d4635ec38db9263e6a3f1eb609e2e06087f0aa7f63b76833737b471"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8989f46f3d7ef79585e98fa991e6ded55d2f48ae56d2c9fa5e491a6e4effb589"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c83f7a107abb89a227d6c454c613e7606c12a42b9a4ca9c5d7dad25d47c776ae"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cde98f323d6bf161041e7627a5fd763f9fd829bcfcd089804a5fdce7bb6e1b7d"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:676f94c5480d8eefd97c0c7e3953315e4d8c2b71f3b49539beb2aa676c58272f"}, - {file = "aiohttp-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d21ac12dc943c68135ff858c3a989f2194a709e6e10b4c8977d7fcd67dfd511"}, - {file = "aiohttp-3.10.5-cp38-cp38-win32.whl", hash = "sha256:17e997105bd1a260850272bfb50e2a328e029c941c2708170d9d978d5a30ad9a"}, - {file = "aiohttp-3.10.5-cp38-cp38-win_amd64.whl", hash = "sha256:1c19de68896747a2aa6257ae4cf6ef59d73917a36a35ee9d0a6f48cff0f94db8"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7e2fe37ac654032db1f3499fe56e77190282534810e2a8e833141a021faaab0e"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5bf3ead3cb66ab990ee2561373b009db5bc0e857549b6c9ba84b20bc462e172"}, - {file = "aiohttp-3.10.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1b2c16a919d936ca87a3c5f0e43af12a89a3ce7ccbce59a2d6784caba945b68b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad146dae5977c4dd435eb31373b3fe9b0b1bf26858c6fc452bf6af394067e10b"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c5c6fa16412b35999320f5c9690c0f554392dc222c04e559217e0f9ae244b92"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95c4dc6f61d610bc0ee1edc6f29d993f10febfe5b76bb470b486d90bbece6b22"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da452c2c322e9ce0cfef392e469a26d63d42860f829026a63374fde6b5c5876f"}, - {file = "aiohttp-3.10.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:898715cf566ec2869d5cb4d5fb4be408964704c46c96b4be267442d265390f32"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:391cc3a9c1527e424c6865e087897e766a917f15dddb360174a70467572ac6ce"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:380f926b51b92d02a34119d072f178d80bbda334d1a7e10fa22d467a66e494db"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce91db90dbf37bb6fa0997f26574107e1b9d5ff939315247b7e615baa8ec313b"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9093a81e18c45227eebe4c16124ebf3e0d893830c6aca7cc310bfca8fe59d857"}, - {file = "aiohttp-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ee40b40aa753d844162dcc80d0fe256b87cba48ca0054f64e68000453caead11"}, - {file = "aiohttp-3.10.5-cp39-cp39-win32.whl", hash = "sha256:03f2645adbe17f274444953bdea69f8327e9d278d961d85657cb0d06864814c1"}, - {file = "aiohttp-3.10.5-cp39-cp39-win_amd64.whl", hash = "sha256:d17920f18e6ee090bdd3d0bfffd769d9f2cb4c8ffde3eb203777a3895c128862"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a1ba7bc139592339ddeb62c06486d0fa0f4ca61216e14137a40d626c81faf10c"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85e4d7bd05d18e4b348441e7584c681eff646e3bf38f68b2626807f3add21aa2"}, + {file = "aiohttp-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69de056022e7abf69cb9fec795515973cc3eeaff51e3ea8d72a77aa933a91c52"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3587506898d4a404b33bd19689286ccf226c3d44d7a73670c8498cd688e42c"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe285a697c851734285369614443451462ce78aac2b77db23567507484b1dc6f"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10c7932337285a6bfa3a5fe1fd4da90b66ebfd9d0cbd1544402e1202eb9a8c3e"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd9716ef0224fe0d0336997eb242f40619f9f8c5c57e66b525a1ebf9f1d8cebe"}, + {file = "aiohttp-3.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceacea31f8a55cdba02bc72c93eb2e1b77160e91f8abd605969c168502fd71eb"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9721554bfa9e15f6e462da304374c2f1baede3cb06008c36c47fa37ea32f1dc4"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:22cdeb684d8552490dd2697a5138c4ecb46f844892df437aaf94f7eea99af879"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e56bb7e31c4bc79956b866163170bc89fd619e0581ce813330d4ea46921a4881"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3a95d2686bc4794d66bd8de654e41b5339fab542b2bca9238aa63ed5f4f2ce82"}, + {file = "aiohttp-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d82404a0e7b10e0d7f022cf44031b78af8a4f99bd01561ac68f7c24772fed021"}, + {file = "aiohttp-3.10.8-cp310-cp310-win32.whl", hash = "sha256:4e10b04542d27e21538e670156e88766543692a0a883f243ba8fad9ddea82e53"}, + {file = "aiohttp-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:680dbcff5adc7f696ccf8bf671d38366a1f620b5616a1d333d0cb33956065395"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:33a68011a38020ed4ff41ae0dbf4a96a202562ecf2024bdd8f65385f1d07f6ef"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c7efa6616a95e3bd73b8a69691012d2ef1f95f9ea0189e42f338fae080c2fc6"}, + {file = "aiohttp-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddb9b9764cfb4459acf01c02d2a59d3e5066b06a846a364fd1749aa168efa2be"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7f270f4ca92760f98a42c45a58674fff488e23b144ec80b1cc6fa2effed377"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6984dda9d79064361ab58d03f6c1e793ea845c6cfa89ffe1a7b9bb400dfd56bd"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f6d47e392c27206701565c8df4cac6ebed28fdf6dcaea5b1eea7a4631d8e6db"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a72f89aea712c619b2ca32c6f4335c77125ede27530ad9705f4f349357833695"}, + {file = "aiohttp-3.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36074b26f3263879ba8e4dbd33db2b79874a3392f403a70b772701363148b9f"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e32148b4a745e70a255a1d44b5664de1f2e24fcefb98a75b60c83b9e260ddb5b"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5aa1a073514cf59c81ad49a4ed9b5d72b2433638cd53160fd2f3a9cfa94718db"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3a79200a9d5e621c4623081ddb25380b713c8cf5233cd11c1aabad990bb9381"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e45fdfcb2d5bcad83373e4808825b7512953146d147488114575780640665027"}, + {file = "aiohttp-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f78e2a78432c537ae876a93013b7bc0027ba5b93ad7b3463624c4b6906489332"}, + {file = "aiohttp-3.10.8-cp311-cp311-win32.whl", hash = "sha256:f8179855a4e4f3b931cb1764ec87673d3fbdcca2af496c8d30567d7b034a13db"}, + {file = "aiohttp-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:ef9b484604af05ca745b6108ca1aaa22ae1919037ae4f93aaf9a37ba42e0b835"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ab2d6523575fc98896c80f49ac99e849c0b0e69cc80bf864eed6af2ae728a52b"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f5d5d5401744dda50b943d8764508d0e60cc2d3305ac1e6420935861a9d544bc"}, + {file = "aiohttp-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de23085cf90911600ace512e909114385026b16324fa203cc74c81f21fd3276a"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4618f0d2bf523043866a9ff8458900d8eb0a6d4018f251dae98e5f1fb699f3a8"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21c1925541ca84f7b5e0df361c0a813a7d6a56d3b0030ebd4b220b8d232015f9"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:497a7d20caea8855c5429db3cdb829385467217d7feb86952a6107e033e031b9"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c887019dbcb4af58a091a45ccf376fffe800b5531b45c1efccda4bedf87747ea"}, + {file = "aiohttp-3.10.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40d2d719c3c36a7a65ed26400e2b45b2d9ed7edf498f4df38b2ae130f25a0d01"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57359785f27394a8bcab0da6dcd46706d087dfebf59a8d0ad2e64a4bc2f6f94f"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a961ee6f2cdd1a2be4735333ab284691180d40bad48f97bb598841bfcbfb94ec"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe3d79d6af839ffa46fdc5d2cf34295390894471e9875050eafa584cb781508d"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a281cba03bdaa341c70b7551b2256a88d45eead149f48b75a96d41128c240b3"}, + {file = "aiohttp-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6769d71bfb1ed60321363a9bc05e94dcf05e38295ef41d46ac08919e5b00d19"}, + {file = "aiohttp-3.10.8-cp312-cp312-win32.whl", hash = "sha256:a3081246bab4d419697ee45e555cef5cd1def7ac193dff6f50be761d2e44f194"}, + {file = "aiohttp-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:ab1546fc8e00676febc81c548a876c7bde32f881b8334b77f84719ab2c7d28dc"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1a012677b8e0a39e181e218de47d6741c5922202e3b0b65e412e2ce47c39337"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2df786c96c57cd6b87156ba4c5f166af7b88f3fc05f9d592252fdc83d8615a3c"}, + {file = "aiohttp-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8885ca09d3a9317219c0831276bfe26984b17b2c37b7bf70dd478d17092a4772"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dbf252ac19860e0ab56cd480d2805498f47c5a2d04f5995d8d8a6effd04b48c"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2036479b6b94afaaca7d07b8a68dc0e67b0caf5f6293bb6a5a1825f5923000"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:365783e1b7c40b59ed4ce2b5a7491bae48f41cd2c30d52647a5b1ee8604c68ad"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270e653b5a4b557476a1ed40e6b6ce82f331aab669620d7c95c658ef976c9c5e"}, + {file = "aiohttp-3.10.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8960fabc20bfe4fafb941067cda8e23c8c17c98c121aa31c7bf0cdab11b07842"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f21e8f2abed9a44afc3d15bba22e0dfc71e5fa859bea916e42354c16102b036f"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fecd55e7418fabd297fd836e65cbd6371aa4035a264998a091bbf13f94d9c44d"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:badb51d851358cd7535b647bb67af4854b64f3c85f0d089c737f75504d5910ec"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e860985f30f3a015979e63e7ba1a391526cdac1b22b7b332579df7867848e255"}, + {file = "aiohttp-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71462f8eeca477cbc0c9700a9464e3f75f59068aed5e9d4a521a103692da72dc"}, + {file = "aiohttp-3.10.8-cp313-cp313-win32.whl", hash = "sha256:177126e971782769b34933e94fddd1089cef0fe6b82fee8a885e539f5b0f0c6a"}, + {file = "aiohttp-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:98a4eb60e27033dee9593814ca320ee8c199489fbc6b2699d0f710584db7feb7"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ffef3d763e4c8fc97e740da5b4d0f080b78630a3914f4e772a122bbfa608c1db"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:597128cb7bc5f068181b49a732961f46cb89f85686206289d6ccb5e27cb5fbe2"}, + {file = "aiohttp-3.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f23a6c1d09de5de89a33c9e9b229106cb70dcfdd55e81a3a3580eaadaa32bc92"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da57af0c54a302b7c655fa1ccd5b1817a53739afa39924ef1816e7b7c8a07ccb"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e7a6af57091056a79a35104d6ec29d98ec7f1fb7270ad9c6fff871b678d1ff8"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32710d6b3b6c09c60c794d84ca887a3a2890131c0b02b3cefdcc6709a2260a7c"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b91f4f62ad39a8a42d511d66269b46cb2fb7dea9564c21ab6c56a642d28bff5"}, + {file = "aiohttp-3.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:471a8c47344b9cc309558b3fcc469bd2c12b49322b4b31eb386c4a2b2d44e44a"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fc0e7f91705445d79beafba9bb3057dd50830e40fe5417017a76a214af54e122"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:85431c9131a9a0f65260dc7a65c800ca5eae78c4c9931618f18c8e0933a0e0c1"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:b91557ee0893da52794b25660d4f57bb519bcad8b7df301acd3898f7197c5d81"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:4954e6b06dd0be97e1a5751fc606be1f9edbdc553c5d9b57d72406a8fbd17f9d"}, + {file = "aiohttp-3.10.8-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a087c84b4992160ffef7afd98ef24177c8bd4ad61c53607145a8377457385100"}, + {file = "aiohttp-3.10.8-cp38-cp38-win32.whl", hash = "sha256:e1f0f7b27171b2956a27bd8f899751d0866ddabdd05cbddf3520f945130a908c"}, + {file = "aiohttp-3.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:c4916070e12ae140110aa598031876c1bf8676a36a750716ea0aa5bd694aa2e7"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5284997e3d88d0dfb874c43e51ae8f4a6f4ca5b90dcf22995035187253d430db"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9443d9ebc5167ce1fbb552faf2d666fb22ef5716a8750be67efd140a7733738c"}, + {file = "aiohttp-3.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b667e2a03407d79a76c618dc30cedebd48f082d85880d0c9c4ec2faa3e10f43e"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98fae99d5c2146f254b7806001498e6f9ffb0e330de55a35e72feb7cb2fa399b"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8296edd99d0dd9d0eb8b9e25b3b3506eef55c1854e9cc230f0b3f885f680410b"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ce46dfb49cfbf9e92818be4b761d4042230b1f0e05ffec0aad15b3eb162b905"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c38cfd355fd86c39b2d54651bd6ed7d63d4fe3b5553f364bae3306e2445f847"}, + {file = "aiohttp-3.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:713dff3f87ceec3bde4f3f484861464e722cf7533f9fa6b824ec82bb5a9010a7"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21a72f4a9c69a8567a0aca12042f12bba25d3139fd5dd8eeb9931f4d9e8599cd"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6d1ad868624f6cea77341ef2877ad4e71f7116834a6cd7ec36ec5c32f94ee6ae"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a78ba86d5a08207d1d1ad10b97aed6ea48b374b3f6831d02d0b06545ac0f181e"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:aff048793d05e1ce05b62e49dccf81fe52719a13f4861530706619506224992b"}, + {file = "aiohttp-3.10.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d088ca05381fd409793571d8e34eca06daf41c8c50a05aeed358d2d340c7af81"}, + {file = "aiohttp-3.10.8-cp39-cp39-win32.whl", hash = "sha256:ee97c4e54f457c366e1f76fbbf3e8effee9de57dae671084a161c00f481106ce"}, + {file = "aiohttp-3.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:d95ae4420669c871667aad92ba8cce6251d61d79c1a38504621094143f94a8b4"}, + {file = "aiohttp-3.10.8.tar.gz", hash = "sha256:21f8225f7dc187018e8433c9326be01477fb2810721e048b33ac49091b19fb4a"}, ] [package.dependencies] @@ -133,7 +133,7 @@ async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +yarl = ">=1.12.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -204,13 +204,13 @@ vertex = ["google-auth (>=2,<3)"] [[package]] name = "anyio" -version = "4.4.0" +version = "4.6.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, + {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, ] [package.dependencies] @@ -220,9 +220,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "apscheduler" @@ -636,18 +636,18 @@ sgmllib3k = "*" [[package]] name = "filelock" -version = "3.16.0" +version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.16.0-py3-none-any.whl", hash = "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609"}, - {file = "filelock-3.16.0.tar.gz", hash = "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec"}, + {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, + {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.1.1)", "pytest (>=8.3.2)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.3)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4.1)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] typing = ["typing-extensions (>=4.12.2)"] [[package]] @@ -793,13 +793,13 @@ tqdm = ["tqdm"] [[package]] name = "google-api-core" -version = "2.19.2" +version = "2.20.0" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ - {file = "google_api_core-2.19.2-py3-none-any.whl", hash = "sha256:53ec0258f2837dd53bbd3d3df50f5359281b3cc13f800c941dd15a9b5a415af4"}, - {file = "google_api_core-2.19.2.tar.gz", hash = "sha256:ca07de7e8aa1c98a8bfca9321890ad2340ef7f2eb136e558cee68f24b94b0a8f"}, + {file = "google_api_core-2.20.0-py3-none-any.whl", hash = "sha256:ef0591ef03c30bb83f79b3d0575c3f31219001fc9c5cf37024d08310aeffed8a"}, + {file = "google_api_core-2.20.0.tar.gz", hash = "sha256:f74dff1889ba291a4b76c5079df0711810e2d9da81abfdc99957bc961c1eb28f"}, ] [package.dependencies] @@ -824,13 +824,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.145.0" +version = "2.147.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "google_api_python_client-2.145.0-py2.py3-none-any.whl", hash = "sha256:d74da1358f3f2d63daf3c6f26bd96d89652051183bc87cf10a56ceb2a70beb50"}, - {file = "google_api_python_client-2.145.0.tar.gz", hash = "sha256:8b84dde11aaccadc127e4846f5cd932331d804ea324e353131595e3f25376e97"}, + {file = "google_api_python_client-2.147.0-py2.py3-none-any.whl", hash = "sha256:c6ecfa193c695baa41e84562d8f8f244fcd164419eca3fc9fd7565646668f9b2"}, + {file = "google_api_python_client-2.147.0.tar.gz", hash = "sha256:e864c2cf61d34c00f05278b8bdb72b93b6fa34f0de9ead51d20435f3b65f91be"}, ] [package.dependencies] @@ -842,13 +842,13 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.34.0" +version = "2.35.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google_auth-2.34.0-py2.py3-none-any.whl", hash = "sha256:72fd4733b80b6d777dcde515628a9eb4a577339437012874ea286bca7261ee65"}, - {file = "google_auth-2.34.0.tar.gz", hash = "sha256:8eb87396435c19b20d32abd2f984e31c191a15284af72eb922f10e5bde9c04cc"}, + {file = "google_auth-2.35.0-py2.py3-none-any.whl", hash = "sha256:25df55f327ef021de8be50bad0dfd4a916ad0de96da86cd05661c9297723ad3f"}, + {file = "google_auth-2.35.0.tar.gz", hash = "sha256:f4c64ed4e01e8e8b646ef34c018f8bf3338df0c8e37d8b3bba40e7f574a3278a"}, ] [package.dependencies] @@ -1004,13 +1004,13 @@ requests = ">=2.20.0,<3.0" [[package]] name = "gotrue" -version = "2.8.1" +version = "2.9.0" description = "Python Client Library for Supabase Auth" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "gotrue-2.8.1-py3-none-any.whl", hash = "sha256:97dff077d71cca629f046c35ba34fae132b69c55fe271651766ddcf6d8132468"}, - {file = "gotrue-2.8.1.tar.gz", hash = "sha256:644d0096c4c390f7e36d9cb05271a7091c01e7dc6d506eb117b8fe8fc48eb8d9"}, + {file = "gotrue-2.9.0-py3-none-any.whl", hash = "sha256:9a6448479329771752cb93be65bc95f06f17d9262e814a95d03b218cf5dce87a"}, + {file = "gotrue-2.9.0.tar.gz", hash = "sha256:c50e75bd01b82a388eed6a921a1c373a7157fd405df2221a8532193a39df4159"}, ] [package.dependencies] @@ -1054,76 +1054,85 @@ protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4 [[package]] name = "grpcio" -version = "1.66.1" +version = "1.66.2" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.66.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492"}, - {file = "grpcio-1.66.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac"}, - {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60"}, - {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f"}, - {file = "grpcio-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083"}, - {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a"}, - {file = "grpcio-1.66.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d"}, - {file = "grpcio-1.66.1-cp310-cp310-win32.whl", hash = "sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c"}, - {file = "grpcio-1.66.1-cp310-cp310-win_amd64.whl", hash = "sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858"}, - {file = "grpcio-1.66.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a"}, - {file = "grpcio-1.66.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26"}, - {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df"}, - {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22"}, - {file = "grpcio-1.66.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1"}, - {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e"}, - {file = "grpcio-1.66.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd"}, - {file = "grpcio-1.66.1-cp311-cp311-win32.whl", hash = "sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791"}, - {file = "grpcio-1.66.1-cp311-cp311-win_amd64.whl", hash = "sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb"}, - {file = "grpcio-1.66.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a"}, - {file = "grpcio-1.66.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9"}, - {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d"}, - {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0"}, - {file = "grpcio-1.66.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761"}, - {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815"}, - {file = "grpcio-1.66.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524"}, - {file = "grpcio-1.66.1-cp312-cp312-win32.whl", hash = "sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759"}, - {file = "grpcio-1.66.1-cp312-cp312-win_amd64.whl", hash = "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734"}, - {file = "grpcio-1.66.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2"}, - {file = "grpcio-1.66.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce"}, - {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c"}, - {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b"}, - {file = "grpcio-1.66.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef"}, - {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb"}, - {file = "grpcio-1.66.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d"}, - {file = "grpcio-1.66.1-cp38-cp38-win32.whl", hash = "sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3"}, - {file = "grpcio-1.66.1-cp38-cp38-win_amd64.whl", hash = "sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce"}, - {file = "grpcio-1.66.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503"}, - {file = "grpcio-1.66.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e"}, - {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0"}, - {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44"}, - {file = "grpcio-1.66.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e"}, - {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb"}, - {file = "grpcio-1.66.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c"}, - {file = "grpcio-1.66.1-cp39-cp39-win32.whl", hash = "sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45"}, - {file = "grpcio-1.66.1-cp39-cp39-win_amd64.whl", hash = "sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8"}, - {file = "grpcio-1.66.1.tar.gz", hash = "sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2"}, + {file = "grpcio-1.66.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:fe96281713168a3270878255983d2cb1a97e034325c8c2c25169a69289d3ecfa"}, + {file = "grpcio-1.66.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:73fc8f8b9b5c4a03e802b3cd0c18b2b06b410d3c1dcbef989fdeb943bd44aff7"}, + {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:03b0b307ba26fae695e067b94cbb014e27390f8bc5ac7a3a39b7723fed085604"}, + {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d69ce1f324dc2d71e40c9261d3fdbe7d4c9d60f332069ff9b2a4d8a257c7b2b"}, + {file = "grpcio-1.66.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05bc2ceadc2529ab0b227b1310d249d95d9001cd106aa4d31e8871ad3c428d73"}, + {file = "grpcio-1.66.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ac475e8da31484efa25abb774674d837b343afb78bb3bcdef10f81a93e3d6bf"}, + {file = "grpcio-1.66.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0be4e0490c28da5377283861bed2941d1d20ec017ca397a5df4394d1c31a9b50"}, + {file = "grpcio-1.66.2-cp310-cp310-win32.whl", hash = "sha256:4e504572433f4e72b12394977679161d495c4c9581ba34a88d843eaf0f2fbd39"}, + {file = "grpcio-1.66.2-cp310-cp310-win_amd64.whl", hash = "sha256:2018b053aa15782db2541ca01a7edb56a0bf18c77efed975392583725974b249"}, + {file = "grpcio-1.66.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:2335c58560a9e92ac58ff2bc5649952f9b37d0735608242973c7a8b94a6437d8"}, + {file = "grpcio-1.66.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45a3d462826f4868b442a6b8fdbe8b87b45eb4f5b5308168c156b21eca43f61c"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a9539f01cb04950fd4b5ab458e64a15f84c2acc273670072abe49a3f29bbad54"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce89f5876662f146d4c1f695dda29d4433a5d01c8681fbd2539afff535da14d4"}, + {file = "grpcio-1.66.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25a14af966438cddf498b2e338f88d1c9706f3493b1d73b93f695c99c5f0e2a"}, + {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6001e575b8bbd89eee11960bb640b6da6ae110cf08113a075f1e2051cc596cae"}, + {file = "grpcio-1.66.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ea1d062c9230278793820146c95d038dc0f468cbdd172eec3363e42ff1c7d01"}, + {file = "grpcio-1.66.2-cp311-cp311-win32.whl", hash = "sha256:38b68498ff579a3b1ee8f93a05eb48dc2595795f2f62716e797dc24774c1aaa8"}, + {file = "grpcio-1.66.2-cp311-cp311-win_amd64.whl", hash = "sha256:6851de821249340bdb100df5eacfecfc4e6075fa85c6df7ee0eb213170ec8e5d"}, + {file = "grpcio-1.66.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:802d84fd3d50614170649853d121baaaa305de7b65b3e01759247e768d691ddf"}, + {file = "grpcio-1.66.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80fd702ba7e432994df208f27514280b4b5c6843e12a48759c9255679ad38db8"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:12fda97ffae55e6526825daf25ad0fa37483685952b5d0f910d6405c87e3adb6"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:950da58d7d80abd0ea68757769c9db0a95b31163e53e5bb60438d263f4bed7b7"}, + {file = "grpcio-1.66.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e636ce23273683b00410f1971d209bf3689238cf5538d960adc3cdfe80dd0dbd"}, + {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a917d26e0fe980b0ac7bfcc1a3c4ad6a9a4612c911d33efb55ed7833c749b0ee"}, + {file = "grpcio-1.66.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:49f0ca7ae850f59f828a723a9064cadbed90f1ece179d375966546499b8a2c9c"}, + {file = "grpcio-1.66.2-cp312-cp312-win32.whl", hash = "sha256:31fd163105464797a72d901a06472860845ac157389e10f12631025b3e4d0453"}, + {file = "grpcio-1.66.2-cp312-cp312-win_amd64.whl", hash = "sha256:ff1f7882e56c40b0d33c4922c15dfa30612f05fb785074a012f7cda74d1c3679"}, + {file = "grpcio-1.66.2-cp313-cp313-linux_armv7l.whl", hash = "sha256:3b00efc473b20d8bf83e0e1ae661b98951ca56111feb9b9611df8efc4fe5d55d"}, + {file = "grpcio-1.66.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1caa38fb22a8578ab8393da99d4b8641e3a80abc8fd52646f1ecc92bcb8dee34"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c408f5ef75cfffa113cacd8b0c0e3611cbfd47701ca3cdc090594109b9fcbaed"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c806852deaedee9ce8280fe98955c9103f62912a5b2d5ee7e3eaa284a6d8d8e7"}, + {file = "grpcio-1.66.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f145cc21836c332c67baa6fc81099d1d27e266401565bf481948010d6ea32d46"}, + {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:73e3b425c1e155730273f73e419de3074aa5c5e936771ee0e4af0814631fb30a"}, + {file = "grpcio-1.66.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c509a4f78114cbc5f0740eb3d7a74985fd2eff022971bc9bc31f8bc93e66a3b"}, + {file = "grpcio-1.66.2-cp313-cp313-win32.whl", hash = "sha256:20657d6b8cfed7db5e11b62ff7dfe2e12064ea78e93f1434d61888834bc86d75"}, + {file = "grpcio-1.66.2-cp313-cp313-win_amd64.whl", hash = "sha256:fb70487c95786e345af5e854ffec8cb8cc781bcc5df7930c4fbb7feaa72e1cdf"}, + {file = "grpcio-1.66.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:a18e20d8321c6400185b4263e27982488cb5cdd62da69147087a76a24ef4e7e3"}, + {file = "grpcio-1.66.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:02697eb4a5cbe5a9639f57323b4c37bcb3ab2d48cec5da3dc2f13334d72790dd"}, + {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:99a641995a6bc4287a6315989ee591ff58507aa1cbe4c2e70d88411c4dcc0839"}, + {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ed71e81782966ffead60268bbda31ea3f725ebf8aa73634d5dda44f2cf3fb9c"}, + {file = "grpcio-1.66.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd27c24a4cc5e195a7f56cfd9312e366d5d61b86e36d46bbe538457ea6eb8dd"}, + {file = "grpcio-1.66.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d9a9724a156c8ec6a379869b23ba3323b7ea3600851c91489b871e375f710bc8"}, + {file = "grpcio-1.66.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d8d4732cc5052e92cea2f78b233c2e2a52998ac40cd651f40e398893ad0d06ec"}, + {file = "grpcio-1.66.2-cp38-cp38-win32.whl", hash = "sha256:7b2c86457145ce14c38e5bf6bdc19ef88e66c5fee2c3d83285c5aef026ba93b3"}, + {file = "grpcio-1.66.2-cp38-cp38-win_amd64.whl", hash = "sha256:e88264caad6d8d00e7913996030bac8ad5f26b7411495848cc218bd3a9040b6c"}, + {file = "grpcio-1.66.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:c400ba5675b67025c8a9f48aa846f12a39cf0c44df5cd060e23fda5b30e9359d"}, + {file = "grpcio-1.66.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:66a0cd8ba6512b401d7ed46bb03f4ee455839957f28b8d61e7708056a806ba6a"}, + {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:06de8ec0bd71be123eec15b0e0d457474931c2c407869b6c349bd9bed4adbac3"}, + {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb57870449dfcfac428afbb5a877829fcb0d6db9d9baa1148705739e9083880e"}, + {file = "grpcio-1.66.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b672abf90a964bfde2d0ecbce30f2329a47498ba75ce6f4da35a2f4532b7acbc"}, + {file = "grpcio-1.66.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ad2efdbe90c73b0434cbe64ed372e12414ad03c06262279b104a029d1889d13e"}, + {file = "grpcio-1.66.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9c3a99c519f4638e700e9e3f83952e27e2ea10873eecd7935823dab0c1c9250e"}, + {file = "grpcio-1.66.2-cp39-cp39-win32.whl", hash = "sha256:78fa51ebc2d9242c0fc5db0feecc57a9943303b46664ad89921f5079e2e4ada7"}, + {file = "grpcio-1.66.2-cp39-cp39-win_amd64.whl", hash = "sha256:728bdf36a186e7f51da73be7f8d09457a03061be848718d0edf000e709418987"}, + {file = "grpcio-1.66.2.tar.gz", hash = "sha256:563588c587b75c34b928bc428548e5b00ea38c46972181a4d8b75ba7e3f24231"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.66.1)"] +protobuf = ["grpcio-tools (>=1.66.2)"] [[package]] name = "grpcio-status" -version = "1.66.1" +version = "1.66.2" description = "Status proto mapping for gRPC" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio_status-1.66.1-py3-none-any.whl", hash = "sha256:cf9ed0b4a83adbe9297211c95cb5488b0cd065707e812145b842c85c4782ff02"}, - {file = "grpcio_status-1.66.1.tar.gz", hash = "sha256:b3f7d34ccc46d83fea5261eea3786174459f763c31f6e34f1d24eba6d515d024"}, + {file = "grpcio_status-1.66.2-py3-none-any.whl", hash = "sha256:e5fe189f6897d12aa9cd74408a17ca41e44fad30871cf84f5cbd17bd713d2455"}, + {file = "grpcio_status-1.66.2.tar.gz", hash = "sha256:fb55cbb5c2e67062f7a4d5c99e489d074fb57e98678d5c3c6692a2d74d89e9ae"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.66.1" +grpcio = ">=1.66.2" protobuf = ">=5.26.1,<6.0dev" [[package]] @@ -1274,13 +1283,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" -version = "0.24.6" +version = "0.25.1" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.24.6-py3-none-any.whl", hash = "sha256:a990f3232aa985fe749bc9474060cbad75e8b2f115f6665a9fda5b9c97818970"}, - {file = "huggingface_hub-0.24.6.tar.gz", hash = "sha256:cc2579e761d070713eaa9c323e3debe39d5b464ae3a7261c39a9195b27bb8000"}, + {file = "huggingface_hub-0.25.1-py3-none-any.whl", hash = "sha256:a5158ded931b3188f54ea9028097312cb0acd50bffaaa2612014c3c526b44972"}, + {file = "huggingface_hub-0.25.1.tar.gz", hash = "sha256:9ff7cb327343211fbd06e2b149b8f362fd1e389454f3f14c6db75a4999ee20ff"}, ] [package.dependencies] @@ -1319,15 +1328,18 @@ files = [ [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "importlib-metadata" version = "8.4.0" @@ -1743,13 +1755,13 @@ httpx = ">=0.27.0,<0.28.0" [[package]] name = "openai" -version = "1.44.1" +version = "1.50.2" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.44.1-py3-none-any.whl", hash = "sha256:07e2c2758d1c94151c740b14dab638ba0d04bcb41a2e397045c90e7661cdf741"}, - {file = "openai-1.44.1.tar.gz", hash = "sha256:e0ffdab601118329ea7529e684b606a72c6c9d4f05be9ee1116255fcf5593874"}, + {file = "openai-1.50.2-py3-none-any.whl", hash = "sha256:822dd2051baa3393d0d5406990611975dd6f533020dc9375a34d4fe67e8b75f7"}, + {file = "openai-1.50.2.tar.gz", hash = "sha256:3987ae027152fc8bea745d60b02c8f4c4a76e1b5c70e73565fa556db6f78c9e6"}, ] [package.dependencies] @@ -1830,13 +1842,13 @@ files = [ [[package]] name = "platformdirs" -version = "4.3.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.3.2-py3-none-any.whl", hash = "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617"}, - {file = "platformdirs-4.3.2.tar.gz", hash = "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] @@ -1982,22 +1994,22 @@ testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "5.28.1" +version = "5.28.2" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.28.1-cp310-abi3-win32.whl", hash = "sha256:fc063acaf7a3d9ca13146fefb5b42ac94ab943ec6e978f543cd5637da2d57957"}, - {file = "protobuf-5.28.1-cp310-abi3-win_amd64.whl", hash = "sha256:4c7f5cb38c640919791c9f74ea80c5b82314c69a8409ea36f2599617d03989af"}, - {file = "protobuf-5.28.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4304e4fceb823d91699e924a1fdf95cde0e066f3b1c28edb665bda762ecde10f"}, - {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:0dfd86d2b5edf03d91ec2a7c15b4e950258150f14f9af5f51c17fa224ee1931f"}, - {file = "protobuf-5.28.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:51f09caab818707ab91cf09cc5c156026599cf05a4520779ccbf53c1b352fb25"}, - {file = "protobuf-5.28.1-cp38-cp38-win32.whl", hash = "sha256:1b04bde117a10ff9d906841a89ec326686c48ececeb65690f15b8cabe7149495"}, - {file = "protobuf-5.28.1-cp38-cp38-win_amd64.whl", hash = "sha256:cabfe43044ee319ad6832b2fda332646f9ef1636b0130186a3ae0a52fc264bb4"}, - {file = "protobuf-5.28.1-cp39-cp39-win32.whl", hash = "sha256:4b4b9a0562a35773ff47a3df823177ab71a1f5eb1ff56d8f842b7432ecfd7fd2"}, - {file = "protobuf-5.28.1-cp39-cp39-win_amd64.whl", hash = "sha256:f24e5d70e6af8ee9672ff605d5503491635f63d5db2fffb6472be78ba62efd8f"}, - {file = "protobuf-5.28.1-py3-none-any.whl", hash = "sha256:c529535e5c0effcf417682563719e5d8ac8d2b93de07a56108b4c2d436d7a29a"}, - {file = "protobuf-5.28.1.tar.gz", hash = "sha256:42597e938f83bb7f3e4b35f03aa45208d49ae8d5bcb4bc10b9fc825e0ab5e423"}, + {file = "protobuf-5.28.2-cp310-abi3-win32.whl", hash = "sha256:eeea10f3dc0ac7e6b4933d32db20662902b4ab81bf28df12218aa389e9c2102d"}, + {file = "protobuf-5.28.2-cp310-abi3-win_amd64.whl", hash = "sha256:2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132"}, + {file = "protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7"}, + {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f"}, + {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f"}, + {file = "protobuf-5.28.2-cp38-cp38-win32.whl", hash = "sha256:87317e9bcda04a32f2ee82089a204d3a2f0d3c8aeed16568c7daf4756e4f1fe0"}, + {file = "protobuf-5.28.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0ea0123dac3399a2eeb1a1443d82b7afc9ff40241433296769f7da42d142ec3"}, + {file = "protobuf-5.28.2-cp39-cp39-win32.whl", hash = "sha256:ca53faf29896c526863366a52a8f4d88e69cd04ec9571ed6082fa117fac3ab36"}, + {file = "protobuf-5.28.2-cp39-cp39-win_amd64.whl", hash = "sha256:8ddc60bf374785fb7cb12510b267f59067fa10087325b8e1855b898a0d81d276"}, + {file = "protobuf-5.28.2-py3-none-any.whl", hash = "sha256:52235802093bd8a2811abbe8bf0ab9c5f54cca0a751fdd3f6ac2a21438bffece"}, + {file = "protobuf-5.28.2.tar.gz", hash = "sha256:59379674ff119717404f7454647913787034f03fe7049cbef1d74a97bb4593f0"}, ] [[package]] @@ -2066,18 +2078,18 @@ files = [ [[package]] name = "pydantic" -version = "2.9.1" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, - {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.3" +pydantic-core = "2.23.4" typing-extensions = [ {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, {version = ">=4.6.1", markers = "python_version < \"3.13\""}, @@ -2089,100 +2101,100 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.3" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, - {file = "pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, - {file = "pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, - {file = "pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, - {file = "pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, - {file = "pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, - {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, - {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, - {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, - {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, - {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, - {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, - {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, - {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, - {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, - {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, - {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, - {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, - {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, - {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, - {file = "pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, - {file = "pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, - {file = "pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, - {file = "pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, - {file = "pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, - {file = "pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, - {file = "pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, - {file = "pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, - {file = "pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, - {file = "pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, - {file = "pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, - {file = "pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, - {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -2252,21 +2264,23 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyright" -version = "1.1.380" +version = "1.1.382.post1" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.380-py3-none-any.whl", hash = "sha256:a6404392053d8848bacc7aebcbd9d318bb46baf1a1a000359305481920f43879"}, - {file = "pyright-1.1.380.tar.gz", hash = "sha256:e6ceb1a5f7e9f03106e0aa1d6fbb4d97735a5e7ffb59f3de6b2db590baf935b2"}, + {file = "pyright-1.1.382.post1-py3-none-any.whl", hash = "sha256:21a4749dd1740e209f88d3a601e9f40748670d39481ea32b9d77edf7f3f1fb2e"}, + {file = "pyright-1.1.382.post1.tar.gz", hash = "sha256:66a5d4e83be9452853d73e9dd9e95ba0ac3061845270e4e331d0070a597d3445"}, ] [package.dependencies] nodeenv = ">=1.6.0" +typing-extensions = ">=4.1" [package.extras] -all = ["twine (>=3.4.1)"] +all = ["nodejs-wheel-binaries", "twine (>=3.4.1)"] dev = ["twine (>=3.4.1)"] +nodejs = ["nodejs-wheel-binaries"] [[package]] name = "pyro5" @@ -2440,38 +2454,38 @@ files = [ [[package]] name = "realtime" -version = "2.0.2" +version = "2.0.5" description = "" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "realtime-2.0.2-py3-none-any.whl", hash = "sha256:2634c915bc38807f2013f21e8bcc4d2f79870dfd81460ddb9393883d0489928a"}, - {file = "realtime-2.0.2.tar.gz", hash = "sha256:519da9325b3b8102139d51785013d592f6b2403d81fa21d838a0b0234723ed7d"}, + {file = "realtime-2.0.5-py3-none-any.whl", hash = "sha256:f9ec2d762794709e37a8e2745c8dfd86eac4870678808f09676c8f2b7bfa6bbc"}, + {file = "realtime-2.0.5.tar.gz", hash = "sha256:133828fbc2cc2325fb015fe071c6da9fb488819cac96d85ed297045c715b35f5"}, ] [package.dependencies] -aiohttp = ">=3.10.2,<4.0.0" +aiohttp = ">=3.10.6,<4.0.0" python-dateutil = ">=2.8.1,<3.0.0" typing-extensions = ">=4.12.2,<5.0.0" -websockets = ">=11,<13" +websockets = ">=11,<14" [[package]] name = "redis" -version = "5.0.8" +version = "5.1.0" description = "Python client for Redis database and key-value store" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, - {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, + {file = "redis-5.1.0-py3-none-any.whl", hash = "sha256:fd4fccba0d7f6aa48c58a78d76ddb4afc698f5da4a2c1d03d916e4fd7ab88cdd"}, + {file = "redis-5.1.0.tar.gz", hash = "sha256:b756df1e4a3858fcc0ef861f3fc53623a96c41e2b1f5304e09e0fe758d333d40"}, ] [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] -hiredis = ["hiredis (>1.0.0)"] -ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] [[package]] name = "referencing" @@ -2488,6 +2502,23 @@ files = [ attrs = ">=22.2.0" rpds-py = ">=0.7.0" +[[package]] +name = "replicate" +version = "0.34.1" +description = "Python client for Replicate" +optional = false +python-versions = ">=3.8" +files = [ + {file = "replicate-0.34.1-py3-none-any.whl", hash = "sha256:beeebbdd83dca46eee960c383dfd8dcc48d7922d9fe9e613f242cc69ed522f2f"}, + {file = "replicate-0.34.1.tar.gz", hash = "sha256:57cf80c7f4d7f6ae503b1bef400f57c26d494724002d7e9a8750d01394dcfc76"}, +] + +[package.dependencies] +httpx = ">=0.21.0,<1" +packaging = "*" +pydantic = ">1.10.7" +typing-extensions = ">=4.5.0" + [[package]] name = "requests" version = "2.32.3" @@ -3039,13 +3070,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] @@ -3097,13 +3128,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -3184,41 +3215,41 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" [[package]] name = "watchdog" -version = "5.0.2" +version = "5.0.3" description = "Filesystem events monitoring" optional = false python-versions = ">=3.9" files = [ - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5"}, - {file = "watchdog-5.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e"}, - {file = "watchdog-5.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7"}, - {file = "watchdog-5.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee"}, - {file = "watchdog-5.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f"}, - {file = "watchdog-5.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b"}, - {file = "watchdog-5.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab"}, - {file = "watchdog-5.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b"}, - {file = "watchdog-5.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941"}, - {file = "watchdog-5.0.2-py3-none-win32.whl", hash = "sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb"}, - {file = "watchdog-5.0.2-py3-none-win_amd64.whl", hash = "sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73"}, - {file = "watchdog-5.0.2-py3-none-win_ia64.whl", hash = "sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769"}, - {file = "watchdog-5.0.2.tar.gz", hash = "sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, ] [package.extras] @@ -3497,103 +3528,103 @@ files = [ [[package]] name = "yarl" -version = "1.11.1" +version = "1.13.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:400cd42185f92de559d29eeb529e71d80dfbd2f45c36844914a4a34297ca6f00"}, - {file = "yarl-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8258c86f47e080a258993eed877d579c71da7bda26af86ce6c2d2d072c11320d"}, - {file = "yarl-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2164cd9725092761fed26f299e3f276bb4b537ca58e6ff6b252eae9631b5c96e"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08ea567c16f140af8ddc7cb58e27e9138a1386e3e6e53982abaa6f2377b38cc"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:768ecc550096b028754ea28bf90fde071c379c62c43afa574edc6f33ee5daaec"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2909fa3a7d249ef64eeb2faa04b7957e34fefb6ec9966506312349ed8a7e77bf"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01a8697ec24f17c349c4f655763c4db70eebc56a5f82995e5e26e837c6eb0e49"}, - {file = "yarl-1.11.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e286580b6511aac7c3268a78cdb861ec739d3e5a2a53b4809faef6b49778eaff"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4179522dc0305c3fc9782549175c8e8849252fefeb077c92a73889ccbcd508ad"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:27fcb271a41b746bd0e2a92182df507e1c204759f460ff784ca614e12dd85145"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f61db3b7e870914dbd9434b560075e0366771eecbe6d2b5561f5bc7485f39efd"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c92261eb2ad367629dc437536463dc934030c9e7caca861cc51990fe6c565f26"}, - {file = "yarl-1.11.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d95b52fbef190ca87d8c42f49e314eace4fc52070f3dfa5f87a6594b0c1c6e46"}, - {file = "yarl-1.11.1-cp310-cp310-win32.whl", hash = "sha256:489fa8bde4f1244ad6c5f6d11bb33e09cf0d1d0367edb197619c3e3fc06f3d91"}, - {file = "yarl-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:476e20c433b356e16e9a141449f25161e6b69984fb4cdbd7cd4bd54c17844998"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:946eedc12895873891aaceb39bceb484b4977f70373e0122da483f6c38faaa68"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21a7c12321436b066c11ec19c7e3cb9aec18884fe0d5b25d03d756a9e654edfe"}, - {file = "yarl-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c35f493b867912f6fda721a59cc7c4766d382040bdf1ddaeeaa7fa4d072f4675"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25861303e0be76b60fddc1250ec5986c42f0a5c0c50ff57cc30b1be199c00e63"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4b53f73077e839b3f89c992223f15b1d2ab314bdbdf502afdc7bb18e95eae27"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:327c724b01b8641a1bf1ab3b232fb638706e50f76c0b5bf16051ab65c868fac5"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4307d9a3417eea87715c9736d050c83e8c1904e9b7aada6ce61b46361b733d92"}, - {file = "yarl-1.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a28bed68ab8fb7e380775f0029a079f08a17799cb3387a65d14ace16c12e2b"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:067b961853c8e62725ff2893226fef3d0da060656a9827f3f520fb1d19b2b68a"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8215f6f21394d1f46e222abeb06316e77ef328d628f593502d8fc2a9117bde83"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:498442e3af2a860a663baa14fbf23fb04b0dd758039c0e7c8f91cb9279799bff"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:69721b8effdb588cb055cc22f7c5105ca6fdaa5aeb3ea09021d517882c4a904c"}, - {file = "yarl-1.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e969fa4c1e0b1a391f3fcbcb9ec31e84440253325b534519be0d28f4b6b533e"}, - {file = "yarl-1.11.1-cp311-cp311-win32.whl", hash = "sha256:7d51324a04fc4b0e097ff8a153e9276c2593106a811704025bbc1d6916f45ca6"}, - {file = "yarl-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:15061ce6584ece023457fb8b7a7a69ec40bf7114d781a8c4f5dcd68e28b5c53b"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a4264515f9117be204935cd230fb2a052dd3792789cc94c101c535d349b3dab0"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f41fa79114a1d2eddb5eea7b912d6160508f57440bd302ce96eaa384914cd265"}, - {file = "yarl-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02da8759b47d964f9173c8675710720b468aa1c1693be0c9c64abb9d8d9a4867"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9361628f28f48dcf8b2f528420d4d68102f593f9c2e592bfc842f5fb337e44fd"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b91044952da03b6f95fdba398d7993dd983b64d3c31c358a4c89e3c19b6f7aef"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74db2ef03b442276d25951749a803ddb6e270d02dda1d1c556f6ae595a0d76a8"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e975a2211952a8a083d1b9d9ba26472981ae338e720b419eb50535de3c02870"}, - {file = "yarl-1.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aef97ba1dd2138112890ef848e17d8526fe80b21f743b4ee65947ea184f07a2"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a7915ea49b0c113641dc4d9338efa9bd66b6a9a485ffe75b9907e8573ca94b84"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:504cf0d4c5e4579a51261d6091267f9fd997ef58558c4ffa7a3e1460bd2336fa"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3de5292f9f0ee285e6bd168b2a77b2a00d74cbcfa420ed078456d3023d2f6dff"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34e1e30f1774fa35d37202bbeae62423e9a79d78d0874e5556a593479fdf239"}, - {file = "yarl-1.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66b63c504d2ca43bf7221a1f72fbe981ff56ecb39004c70a94485d13e37ebf45"}, - {file = "yarl-1.11.1-cp312-cp312-win32.whl", hash = "sha256:a28b70c9e2213de425d9cba5ab2e7f7a1c8ca23a99c4b5159bf77b9c31251447"}, - {file = "yarl-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:17b5a386d0d36fb828e2fb3ef08c8829c1ebf977eef88e5367d1c8c94b454639"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1fa2e7a406fbd45b61b4433e3aa254a2c3e14c4b3186f6e952d08a730807fa0c"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:750f656832d7d3cb0c76be137ee79405cc17e792f31e0a01eee390e383b2936e"}, - {file = "yarl-1.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b8486f322d8f6a38539136a22c55f94d269addb24db5cb6f61adc61eabc9d93"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fce4da3703ee6048ad4138fe74619c50874afe98b1ad87b2698ef95bf92c96d"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed653638ef669e0efc6fe2acb792275cb419bf9cb5c5049399f3556995f23c7"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18ac56c9dd70941ecad42b5a906820824ca72ff84ad6fa18db33c2537ae2e089"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:688654f8507464745ab563b041d1fb7dab5d9912ca6b06e61d1c4708366832f5"}, - {file = "yarl-1.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4973eac1e2ff63cf187073cd4e1f1148dcd119314ab79b88e1b3fad74a18c9d5"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:964a428132227edff96d6f3cf261573cb0f1a60c9a764ce28cda9525f18f7786"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6d23754b9939cbab02c63434776df1170e43b09c6a517585c7ce2b3d449b7318"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2dc4250fe94d8cd864d66018f8344d4af50e3758e9d725e94fecfa27588ff82"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09696438cb43ea6f9492ef237761b043f9179f455f405279e609f2bc9100212a"}, - {file = "yarl-1.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:999bfee0a5b7385a0af5ffb606393509cfde70ecca4f01c36985be6d33e336da"}, - {file = "yarl-1.11.1-cp313-cp313-win32.whl", hash = "sha256:ce928c9c6409c79e10f39604a7e214b3cb69552952fbda8d836c052832e6a979"}, - {file = "yarl-1.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:501c503eed2bb306638ccb60c174f856cc3246c861829ff40eaa80e2f0330367"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dae7bd0daeb33aa3e79e72877d3d51052e8b19c9025ecf0374f542ea8ec120e4"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3ff6b1617aa39279fe18a76c8d165469c48b159931d9b48239065767ee455b2b"}, - {file = "yarl-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3257978c870728a52dcce8c2902bf01f6c53b65094b457bf87b2644ee6238ddc"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f351fa31234699d6084ff98283cb1e852270fe9e250a3b3bf7804eb493bd937"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aef1b64da41d18026632d99a06b3fefe1d08e85dd81d849fa7c96301ed22f1b"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7175a87ab8f7fbde37160a15e58e138ba3b2b0e05492d7351314a250d61b1591"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba444bdd4caa2a94456ef67a2f383710928820dd0117aae6650a4d17029fa25e"}, - {file = "yarl-1.11.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ea9682124fc062e3d931c6911934a678cb28453f957ddccf51f568c2f2b5e05"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8418c053aeb236b20b0ab8fa6bacfc2feaaf7d4683dd96528610989c99723d5f"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:61a5f2c14d0a1adfdd82258f756b23a550c13ba4c86c84106be4c111a3a4e413"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f3a6d90cab0bdf07df8f176eae3a07127daafcf7457b997b2bf46776da2c7eb7"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:077da604852be488c9a05a524068cdae1e972b7dc02438161c32420fb4ec5e14"}, - {file = "yarl-1.11.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:15439f3c5c72686b6c3ff235279630d08936ace67d0fe5c8d5bbc3ef06f5a420"}, - {file = "yarl-1.11.1-cp38-cp38-win32.whl", hash = "sha256:238a21849dd7554cb4d25a14ffbfa0ef380bb7ba201f45b144a14454a72ffa5a"}, - {file = "yarl-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:67459cf8cf31da0e2cbdb4b040507e535d25cfbb1604ca76396a3a66b8ba37a6"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:884eab2ce97cbaf89f264372eae58388862c33c4f551c15680dd80f53c89a269"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a336eaa7ee7e87cdece3cedb395c9657d227bfceb6781295cf56abcd3386a26"}, - {file = "yarl-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87f020d010ba80a247c4abc335fc13421037800ca20b42af5ae40e5fd75e7909"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:637c7ddb585a62d4469f843dac221f23eec3cbad31693b23abbc2c366ad41ff4"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48dfd117ab93f0129084577a07287376cc69c08138694396f305636e229caa1a"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e0ae31fb5ccab6eda09ba1494e87eb226dcbd2372dae96b87800e1dcc98804"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f46f81501160c28d0c0b7333b4f7be8983dbbc161983b6fb814024d1b4952f79"}, - {file = "yarl-1.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04293941646647b3bfb1719d1d11ff1028e9c30199509a844da3c0f5919dc520"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:250e888fa62d73e721f3041e3a9abf427788a1934b426b45e1b92f62c1f68366"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e8f63904df26d1a66aabc141bfd258bf738b9bc7bc6bdef22713b4f5ef789a4c"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:aac44097d838dda26526cffb63bdd8737a2dbdf5f2c68efb72ad83aec6673c7e"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:267b24f891e74eccbdff42241c5fb4f974de2d6271dcc7d7e0c9ae1079a560d9"}, - {file = "yarl-1.11.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6907daa4b9d7a688063ed098c472f96e8181733c525e03e866fb5db480a424df"}, - {file = "yarl-1.11.1-cp39-cp39-win32.whl", hash = "sha256:14438dfc5015661f75f85bc5adad0743678eefee266ff0c9a8e32969d5d69f74"}, - {file = "yarl-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:94d0caaa912bfcdc702a4204cd5e2bb01eb917fc4f5ea2315aa23962549561b0"}, - {file = "yarl-1.11.1-py3-none-any.whl", hash = "sha256:72bf26f66456baa0584eff63e44545c9f0eaed9b73cb6601b647c91f14c11f38"}, - {file = "yarl-1.11.1.tar.gz", hash = "sha256:1bb2d9e212fb7449b8fb73bc461b51eaa17cc8430b4a87d87be7b25052d92f53"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, + {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, + {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, + {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, + {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, + {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, + {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, + {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, + {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, + {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, + {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, + {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, + {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, + {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, + {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, + {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, + {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, + {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, + {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, + {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, + {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, + {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, + {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, + {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, + {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, + {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, + {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, + {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, + {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, + {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, + {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, + {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, + {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, ] [package.dependencies] @@ -3616,13 +3647,13 @@ requests = "*" [[package]] name = "zipp" -version = "3.20.1" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, - {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] @@ -3636,4 +3667,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "f42fdf521b0476048626238ee631b618a71ed079c369c28035a899f2252369c9" +content-hash = "3ab370b624b486517a2fbcdc17fb294fbd76b3ec6659c5b471c57bfd738e7277" diff --git a/autogpt_platform/backend/pyproject.toml b/autogpt_platform/backend/pyproject.toml index 3a58cfa75c..0662a33f11 100644 --- a/autogpt_platform/backend/pyproject.toml +++ b/autogpt_platform/backend/pyproject.toml @@ -45,6 +45,7 @@ uvicorn = { extras = ["standard"], version = "^0.30.1" } websockets = "^12.0" youtube-transcript-api = "^0.6.2" googlemaps = "^4.10.0" +replicate = "^0.34.1" [tool.poetry.group.dev.dependencies] poethepoet = "^0.26.1" From 9dc7bb8497511b89d4d81e8a4a7148046f0331b1 Mon Sep 17 00:00:00 2001 From: Toran Bruce Richards Date: Mon, 30 Sep 2024 10:54:40 +0100 Subject: [PATCH 018/155] Remove fluxdev from AI Generation block due to licence restrictions. (#8222) --- .../backend/backend/blocks/replicate_flux_advanced.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py b/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py index 1ce25c443b..14be6f2c03 100644 --- a/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py +++ b/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py @@ -11,14 +11,12 @@ from backend.data.model import BlockSecret, SchemaField, SecretField class ReplicateFluxModelName(str, Enum): FLUX_SCHNELL = ("Flux Schnell",) FLUX_PRO = ("Flux Pro",) - FLUX_DEV = ("Flux Dev",) @property def api_name(self): api_names = { ReplicateFluxModelName.FLUX_SCHNELL: "black-forest-labs/flux-schnell", ReplicateFluxModelName.FLUX_PRO: "black-forest-labs/flux-pro", - ReplicateFluxModelName.FLUX_DEV: "black-forest-labs/flux-dev", } return api_names[self] From 0cf3b9f48bfc968e39af5cf88215f45926750b4f Mon Sep 17 00:00:00 2001 From: Toran Bruce Richards Date: Mon, 30 Sep 2024 12:31:47 +0100 Subject: [PATCH 019/155] feat(blocks): Add shortform video block (#8217) * feat(blocks): Add AIShortformVideoCreatorBlock - Added a new block called AIShortformVideoCreatorBlock to create shortform videos using revid.ai. - The block takes input parameters such as script, background music, and voice ID. - It uses the revid.ai API to create the video and waits for completion using a webhook proxy service. - Once the video is ready, it returns the URL of the created video. - This block takes anywhere from 5 seconds to several minutes to complete depending on the length of the video. Add revid.ai API key to Secrets - Added a new field in the Secrets class to store the revid.ai API key. * refactor(blocks): Remove unused webhook code in AIShortformVideoCreatorBlock * Add background music track options. * Add preset voice options * Add generation preset and visual style configuration options. * Remove "morpher" video type due to long generation times and low quality. Plus extend timeout cut-off. * Add audio track configuration options. * refactor AudioTrack selection into single class * format * Add test mocks * run format --- .../blocks/ai_shortform_video_block.py | 307 ++++++++++++++++++ .../backend/backend/util/settings.py | 1 + 2 files changed, 308 insertions(+) create mode 100644 autogpt_platform/backend/backend/blocks/ai_shortform_video_block.py diff --git a/autogpt_platform/backend/backend/blocks/ai_shortform_video_block.py b/autogpt_platform/backend/backend/blocks/ai_shortform_video_block.py new file mode 100644 index 0000000000..f4f12c9fe1 --- /dev/null +++ b/autogpt_platform/backend/backend/blocks/ai_shortform_video_block.py @@ -0,0 +1,307 @@ +import logging +import time +from enum import Enum +from typing import Optional + +import requests +from pydantic import Field + +from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema +from backend.data.model import BlockSecret, SchemaField, SecretField + + +class AudioTrack(str, Enum): + OBSERVER = ("Observer",) + FUTURISTIC_BEAT = ("Futuristic Beat",) + SCIENCE_DOCUMENTARY = ("Science Documentary",) + HOTLINE = ("Hotline",) + BLADERUNNER_2049 = ("Bladerunner 2049",) + A_FUTURE = ("A Future",) + ELYSIAN_EMBERS = ("Elysian Embers",) + INSPIRING_CINEMATIC = ("Inspiring Cinematic",) + BLADERUNNER_REMIX = ("Bladerunner Remix",) + IZZAMUZZIC = ("Izzamuzzic",) + NAS = ("Nas",) + PARIS_ELSE = ("Paris - Else",) + SNOWFALL = ("Snowfall",) + BURLESQUE = ("Burlesque",) + CORNY_CANDY = ("Corny Candy",) + HIGHWAY_NOCTURNE = ("Highway Nocturne",) + I_DONT_THINK_SO = ("I Don't Think So",) + LOSING_YOUR_MARBLES = ("Losing Your Marbles",) + REFRESHER = ("Refresher",) + TOURIST = ("Tourist",) + TWIN_TYCHES = ("Twin Tyches",) + + @property + def audio_url(self): + audio_urls = { + AudioTrack.OBSERVER: "https://cdn.tfrv.xyz/audio/observer.mp3", + AudioTrack.FUTURISTIC_BEAT: "https://cdn.tfrv.xyz/audio/_futuristic-beat.mp3", + AudioTrack.SCIENCE_DOCUMENTARY: "https://cdn.tfrv.xyz/audio/_science-documentary.mp3", + AudioTrack.HOTLINE: "https://cdn.tfrv.xyz/audio/_hotline.mp3", + AudioTrack.BLADERUNNER_2049: "https://cdn.tfrv.xyz/audio/_bladerunner-2049.mp3", + AudioTrack.A_FUTURE: "https://cdn.tfrv.xyz/audio/a-future.mp3", + AudioTrack.ELYSIAN_EMBERS: "https://cdn.tfrv.xyz/audio/elysian-embers.mp3", + AudioTrack.INSPIRING_CINEMATIC: "https://cdn.tfrv.xyz/audio/inspiring-cinematic-ambient.mp3", + AudioTrack.BLADERUNNER_REMIX: "https://cdn.tfrv.xyz/audio/bladerunner-remix.mp3", + AudioTrack.IZZAMUZZIC: "https://cdn.tfrv.xyz/audio/_izzamuzzic.mp3", + AudioTrack.NAS: "https://cdn.tfrv.xyz/audio/_nas.mp3", + AudioTrack.PARIS_ELSE: "https://cdn.tfrv.xyz/audio/_paris-else.mp3", + AudioTrack.SNOWFALL: "https://cdn.tfrv.xyz/audio/_snowfall.mp3", + AudioTrack.BURLESQUE: "https://cdn.tfrv.xyz/audio/burlesque.mp3", + AudioTrack.CORNY_CANDY: "https://cdn.tfrv.xyz/audio/corny-candy.mp3", + AudioTrack.HIGHWAY_NOCTURNE: "https://cdn.tfrv.xyz/audio/highway-nocturne.mp3", + AudioTrack.I_DONT_THINK_SO: "https://cdn.tfrv.xyz/audio/i-dont-think-so.mp3", + AudioTrack.LOSING_YOUR_MARBLES: "https://cdn.tfrv.xyz/audio/losing-your-marbles.mp3", + AudioTrack.REFRESHER: "https://cdn.tfrv.xyz/audio/refresher.mp3", + AudioTrack.TOURIST: "https://cdn.tfrv.xyz/audio/tourist.mp3", + AudioTrack.TWIN_TYCHES: "https://cdn.tfrv.xyz/audio/twin-tynches.mp3", + } + return audio_urls[self] + + +class GenerationPreset(str, Enum): + LEONARDO = ("Default",) + ANIME = ("Anime",) + REALISM = ("Realist",) + ILLUSTRATION = ("Illustration",) + SKETCH_COLOR = ("Sketch Color",) + SKETCH_BW = ("Sketch B&W",) + PIXAR = ("Pixar",) + INK = ("Japanese Ink",) + RENDER_3D = ("3D Render",) + LEGO = ("Lego",) + SCIFI = ("Sci-Fi",) + RECRO_CARTOON = ("Retro Cartoon",) + PIXEL_ART = ("Pixel Art",) + CREATIVE = ("Creative",) + PHOTOGRAPHY = ("Photography",) + RAYTRACED = ("Raytraced",) + ENVIRONMENT = ("Environment",) + FANTASY = ("Fantasy",) + ANIME_SR = ("Anime Realism",) + MOVIE = ("Movie",) + STYLIZED_ILLUSTRATION = ("Stylized Illustration",) + MANGA = ("Manga",) + + +class Voice(str, Enum): + LILY = "Lily" + DANIEL = "Daniel" + BRIAN = "Brian" + JESSICA = "Jessica" + CHARLOTTE = "Charlotte" + CALLUM = "Callum" + + @property + def voice_id(self): + voice_id_map = { + Voice.LILY: "pFZP5JQG7iQjIQuC4Bku", + Voice.DANIEL: "onwK4e9ZLuTAKqWW03F9", + Voice.BRIAN: "nPczCjzI2devNBz1zQrb", + Voice.JESSICA: "cgSgspJ2msm6clMCkdW9", + Voice.CHARLOTTE: "XB0fDUnXU5powFXDhCwa", + Voice.CALLUM: "N2lVS1w4EtoT3dr4eOWO", + } + return voice_id_map[self] + + def __str__(self): + return self.value + + +class VisualMediaType(str, Enum): + STOCK_VIDEOS = ("stockVideo",) + MOVING_AI_IMAGES = ("movingImage",) + AI_VIDEO = ("aiVideo",) + + +logger = logging.getLogger(__name__) + + +class AIShortformVideoCreatorBlock(Block): + class Input(BlockSchema): + api_key: BlockSecret = SecretField( + key="revid_api_key", + description="Your revid.ai API key", + placeholder="Enter your revid.ai API key", + ) + script: str = SchemaField( + description="""1. Use short and punctuated sentences\n\n2. Use linebreaks to create a new clip\n\n3. Text outside of brackets is spoken by the AI, and [text between brackets] will be used to guide the visual generation. For example, [close-up of a cat] will show a close-up of a cat.""", + placeholder="[close-up of a cat] Meow!", + ) + ratio: str = Field(description="Aspect ratio of the video", default="9 / 16") + resolution: str = Field(description="Resolution of the video", default="720p") + frame_rate: int = Field(description="Frame rate of the video", default=60) + generation_preset: GenerationPreset = SchemaField( + description="Generation preset for visual style - only effects AI generated visuals", + default=GenerationPreset.LEONARDO, + placeholder=GenerationPreset.LEONARDO, + ) + background_music: AudioTrack = SchemaField( + description="Background music track", + default=AudioTrack.HIGHWAY_NOCTURNE, + placeholder=AudioTrack.HIGHWAY_NOCTURNE, + ) + voice: Voice = SchemaField( + description="AI voice to use for narration", + default=Voice.LILY, + placeholder=Voice.LILY, + ) + video_style: VisualMediaType = SchemaField( + description="Type of visual media to use for the video", + default=VisualMediaType.STOCK_VIDEOS, + placeholder=VisualMediaType.STOCK_VIDEOS, + ) + + class Output(BlockSchema): + video_url: str = Field(description="The URL of the created video") + error: Optional[str] = Field(description="Error message if the request failed") + + def __init__(self): + super().__init__( + id="361697fb-0c4f-4feb-aed3-8320c88c771b", + description="Creates a shortform video using revid.ai", + categories={BlockCategory.SOCIAL, BlockCategory.AI}, + input_schema=AIShortformVideoCreatorBlock.Input, + output_schema=AIShortformVideoCreatorBlock.Output, + test_input={ + "api_key": "test_api_key", + "script": "[close-up of a cat] Meow!", + "ratio": "9 / 16", + "resolution": "720p", + "frame_rate": 60, + "generation_preset": GenerationPreset.LEONARDO, + "background_music": AudioTrack.HIGHWAY_NOCTURNE, + "voice": Voice.LILY, + "video_style": VisualMediaType.STOCK_VIDEOS, + }, + test_output=( + "video_url", + "https://example.com/video.mp4", + ), + test_mock={ + "create_webhook": lambda: ( + "test_uuid", + "https://webhook.site/test_uuid", + ), + "create_video": lambda api_key, payload: {"pid": "test_pid"}, + "wait_for_video": lambda api_key, pid, webhook_token, max_wait_time=1000: "https://example.com/video.mp4", + }, + ) + + def create_webhook(self): + url = "https://webhook.site/token" + headers = {"Accept": "application/json", "Content-Type": "application/json"} + response = requests.post(url, headers=headers) + response.raise_for_status() + webhook_data = response.json() + return webhook_data["uuid"], f"https://webhook.site/{webhook_data['uuid']}" + + def create_video(self, api_key: str, payload: dict) -> dict: + url = "https://www.revid.ai/api/public/v2/render" + headers = {"key": api_key} + response = requests.post(url, json=payload, headers=headers) + logger.debug( + f"API Response Status Code: {response.status_code}, Content: {response.text}" + ) + response.raise_for_status() + return response.json() + + def check_video_status(self, api_key: str, pid: str) -> dict: + url = f"https://www.revid.ai/api/public/v2/status?pid={pid}" + headers = {"key": api_key} + response = requests.get(url, headers=headers) + response.raise_for_status() + return response.json() + + def wait_for_video( + self, api_key: str, pid: str, webhook_token: str, max_wait_time: int = 1000 + ) -> str: + start_time = time.time() + while time.time() - start_time < max_wait_time: + status = self.check_video_status(api_key, pid) + logger.debug(f"Video status: {status}") + + if status.get("status") == "ready" and "videoUrl" in status: + return status["videoUrl"] + elif status.get("status") == "error": + error_message = status.get("error", "Unknown error occurred") + logger.error(f"Video creation failed: {error_message}") + raise ValueError(f"Video creation failed: {error_message}") + elif status.get("status") in ["FAILED", "CANCELED"]: + logger.error(f"Video creation failed: {status.get('message')}") + raise ValueError(f"Video creation failed: {status.get('message')}") + + time.sleep(10) + + logger.error("Video creation timed out") + raise TimeoutError("Video creation timed out") + + def run(self, input_data: Input, **kwargs) -> BlockOutput: + try: + # Create a new Webhook.site URL + webhook_token, webhook_url = self.create_webhook() + logger.debug(f"Webhook URL: {webhook_url}") + + audio_url = input_data.background_music.audio_url + + payload = { + "frameRate": input_data.frame_rate, + "resolution": input_data.resolution, + "frameDurationMultiplier": 18, + "webhook": webhook_url, + "creationParams": { + "mediaType": input_data.video_style, + "captionPresetName": "Wrap 1", + "selectedVoice": input_data.voice.voice_id, + "hasEnhancedGeneration": True, + "generationPreset": input_data.generation_preset.name, + "selectedAudio": input_data.background_music, + "origin": "/create", + "inputText": input_data.script, + "flowType": "text-to-video", + "slug": "create-tiktok-video", + "hasToGenerateVoice": True, + "hasToTranscript": False, + "hasToSearchMedia": True, + "hasAvatar": False, + "hasWebsiteRecorder": False, + "hasTextSmallAtBottom": False, + "ratio": input_data.ratio, + "sourceType": "contentScraping", + "selectedStoryStyle": {"value": "custom", "label": "Custom"}, + "hasToGenerateVideos": input_data.video_style + != VisualMediaType.STOCK_VIDEOS, + "audioUrl": audio_url, + }, + } + + logger.debug("Creating video...") + response = self.create_video(input_data.api_key.get_secret_value(), payload) + pid = response.get("pid") + + if not pid: + logger.error( + f"Failed to create video: No project ID returned. API Response: {response}" + ) + yield "error", "Failed to create video: No project ID returned" + else: + logger.debug( + f"Video created with project ID: {pid}. Waiting for completion..." + ) + video_url = self.wait_for_video( + input_data.api_key.get_secret_value(), pid, webhook_token + ) + logger.debug(f"Video ready: {video_url}") + yield "video_url", video_url + + except requests.RequestException as e: + logger.exception("Error creating video") + yield "error", f"Error creating video: {str(e)}" + except ValueError as e: + logger.exception("Error in video creation process") + yield "error", str(e) + except TimeoutError as e: + logger.exception("Video creation timed out") + yield "error", str(e) diff --git a/autogpt_platform/backend/backend/util/settings.py b/autogpt_platform/backend/backend/util/settings.py index c76399eba6..c5cfdc6602 100644 --- a/autogpt_platform/backend/backend/util/settings.py +++ b/autogpt_platform/backend/backend/util/settings.py @@ -206,6 +206,7 @@ class Secrets(UpdateTrackingModel["Secrets"], BaseSettings): medium_api_key: str = Field(default="", description="Medium API key") medium_author_id: str = Field(default="", description="Medium author ID") did_api_key: str = Field(default="", description="D-ID API Key") + revid_api_key: str = Field(default="", description="revid.ai API key") discord_bot_token: str = Field(default="", description="Discord bot token") From 210c140a0f56148f7f1ca50bcc9969c95fcd6925 Mon Sep 17 00:00:00 2001 From: Toran Bruce Richards Date: Mon, 30 Sep 2024 14:05:26 +0100 Subject: [PATCH 020/155] feat(blocks): Add AI List Generator block (#8221) Add AIListGeneratorBlock class --- .../backend/backend/blocks/llm.py | 231 ++++++++++++++++++ 1 file changed, 231 insertions(+) diff --git a/autogpt_platform/backend/backend/blocks/llm.py b/autogpt_platform/backend/backend/blocks/llm.py index f510d680f5..868244cd8e 100644 --- a/autogpt_platform/backend/backend/blocks/llm.py +++ b/autogpt_platform/backend/backend/blocks/llm.py @@ -1,3 +1,4 @@ +import ast import logging from enum import Enum from json import JSONDecodeError @@ -209,6 +210,7 @@ class AIStructuredResponseGeneratorBlock(Block): raise ValueError(f"Unsupported LLM provider: {provider}") def run(self, input_data: Input, **kwargs) -> BlockOutput: + logger.debug(f"Calling LLM with input data: {input_data}") prompt = [] def trim_prompt(s: str) -> str: @@ -622,3 +624,232 @@ class AIConversationBlock(Block): yield "response", response except Exception as e: yield "error", f"Error calling LLM: {str(e)}" + + +class AIListGeneratorBlock(Block): + class Input(BlockSchema): + focus: str | None = SchemaField( + description="The focus of the list to generate.", + placeholder="The top 5 most interesting news stories in the data.", + default=None, + advanced=False, + ) + source_data: str | None = SchemaField( + description="The data to generate the list from.", + placeholder="News Today: Humans land on Mars: Today humans landed on mars. -- AI wins Nobel Prize: AI wins Nobel Prize for solving world hunger. -- New AI Model: A new AI model has been released.", + default=None, + advanced=False, + ) + model: LlmModel = SchemaField( + title="LLM Model", + default=LlmModel.GPT4_TURBO, + description="The language model to use for generating the list.", + advanced=True, + ) + api_key: BlockSecret = SecretField(value="") + max_retries: int = SchemaField( + default=3, + description="Maximum number of retries for generating a valid list.", + ge=1, + le=5, + ) + + class Output(BlockSchema): + generated_list: List[str] = SchemaField(description="The generated list.") + list_item: str = SchemaField( + description="Each individual item in the list.", + ) + error: str = SchemaField( + description="Error message if the list generation failed." + ) + + def __init__(self): + super().__init__( + id="9c0b0450-d199-458b-a731-072189dd6593", + description="Generate a Python list based on the given prompt using a Large Language Model (LLM).", + categories={BlockCategory.AI, BlockCategory.TEXT}, + input_schema=AIListGeneratorBlock.Input, + output_schema=AIListGeneratorBlock.Output, + test_input={ + "focus": "planets", + "source_data": ( + "Zylora Prime is a glowing jungle world with bioluminescent plants, " + "while Kharon-9 is a harsh desert planet with underground cities. " + "Vortexia's constant storms power floating cities, and Oceara is a water-covered world home to " + "intelligent marine life. On icy Draknos, ancient ruins lie buried beneath its frozen landscape, " + "drawing explorers to uncover its mysteries. Each planet showcases the limitless possibilities of " + "fictional worlds." + ), + "model": LlmModel.GPT4_TURBO, + "api_key": "test_api_key", + "max_retries": 3, + }, + test_output=[ + ( + "generated_list", + ["Zylora Prime", "Kharon-9", "Vortexia", "Oceara", "Draknos"], + ), + ("list_item", "Zylora Prime"), + ("list_item", "Kharon-9"), + ("list_item", "Vortexia"), + ("list_item", "Oceara"), + ("list_item", "Draknos"), + ], + test_mock={ + "llm_call": lambda input_data: { + "response": "['Zylora Prime', 'Kharon-9', 'Vortexia', 'Oceara', 'Draknos']" + }, + }, + ) + + @staticmethod + def llm_call( + input_data: AIStructuredResponseGeneratorBlock.Input, + ) -> dict[str, str]: + llm_block = AIStructuredResponseGeneratorBlock() + for output_name, output_data in llm_block.run(input_data): + if output_name == "response": + logger.debug(f"Received response from LLM: {output_data}") + return output_data + raise ValueError("Failed to get a response from the LLM.") + + @staticmethod + def string_to_list(string): + """ + Converts a string representation of a list into an actual Python list object. + """ + logger.debug(f"Converting string to list. Input string: {string}") + try: + # Use ast.literal_eval to safely evaluate the string + python_list = ast.literal_eval(string) + if isinstance(python_list, list): + logger.debug(f"Successfully converted string to list: {python_list}") + return python_list + else: + logger.error(f"The provided string '{string}' is not a valid list") + raise ValueError(f"The provided string '{string}' is not a valid list.") + except (SyntaxError, ValueError) as e: + logger.error(f"Failed to convert string to list: {e}") + raise ValueError("Invalid list format. Could not convert to list.") + + def run(self, input_data: Input, **kwargs) -> BlockOutput: + logger.debug(f"Starting AIListGeneratorBlock.run with input data: {input_data}") + + # Check for API key + api_key_check = ( + input_data.api_key.get_secret_value() + or LlmApiKeys[input_data.model.metadata.provider].get_secret_value() + ) + if not api_key_check: + logger.error("No LLM API key provided.") + yield "error", "No LLM API key provided." + return + + # Prepare the system prompt + sys_prompt = """You are a Python list generator. Your task is to generate a Python list based on the user's prompt. + |Respond ONLY with a valid python list. + |The list can contain strings, numbers, or nested lists as appropriate. + |Do not include any explanations or additional text. + + |Valid Example string formats: + + |Example 1: + |``` + |['1', '2', '3', '4'] + |``` + + |Example 2: + |``` + |[['1', '2'], ['3', '4'], ['5', '6']] + |``` + + |Example 3: + |``` + |['1', ['2', '3'], ['4', ['5', '6']]] + |``` + + |Example 4: + |``` + |['a', 'b', 'c'] + |``` + + |Example 5: + |``` + |['1', '2.5', 'string', 'True', ['False', 'None']] + |``` + + |Do not include any explanations or additional text, just respond with the list in the format specified above. + """ + # If a focus is provided, add it to the prompt + if input_data.focus: + prompt = f"Generate a list with the following focus:\n\n\n{input_data.focus}" + else: + # If there's source data + if input_data.source_data: + prompt = "Extract the main focus of the source data to a list.\ni.e if the source data is a news website, the focus would be the news stories rather than the social links in the footer." + else: + # No focus or source data provided, generat a random list + prompt = "Generate a random list." + + # If the source data is provided, add it to the prompt + if input_data.source_data: + prompt += f"\n\nUse the following source data to generate the list from:\n\n\n\n{input_data.source_data}\n\nDo not invent fictional data that is not present in the source data." + # Else, tell the LLM to synthesize the data + else: + prompt += "\n\nInvent the data to generate the list from." + + for attempt in range(input_data.max_retries): + try: + logger.debug("Calling LLM") + llm_response = self.llm_call( + AIStructuredResponseGeneratorBlock.Input( + sys_prompt=sys_prompt, + prompt=prompt, + api_key=input_data.api_key, + model=input_data.model, + expected_format={}, # Do not use structured response + ) + ) + + logger.debug(f"LLM response: {llm_response}") + + # Extract Response string + response_string = llm_response["response"] + logger.debug(f"Response string: {response_string}") + + # Convert the string to a Python list + logger.debug("Converting string to Python list") + parsed_list = self.string_to_list(response_string) + logger.debug(f"Parsed list: {parsed_list}") + + # If we reach here, we have a valid Python list + logger.debug("Successfully generated a valid Python list") + yield "generated_list", parsed_list + + # Yield each item in the list + for item in parsed_list: + yield "list_item", item + return + + except Exception as e: + logger.error(f"Error in attempt {attempt + 1}: {str(e)}") + if attempt == input_data.max_retries - 1: + logger.error( + f"Failed to generate a valid Python list after {input_data.max_retries} attempts" + ) + yield "error", f"Failed to generate a valid Python list after {input_data.max_retries} attempts. Last error: {str(e)}" + else: + # Add a retry prompt + logger.debug("Preparing retry prompt") + prompt = f""" + The previous attempt failed due to `{e}` + Generate a valid Python list based on the original prompt. + Remember to respond ONLY with a valid Python list as per the format specified earlier. + Original prompt: + ```{prompt}``` + + Respond only with the list in the format specified with no commentary or apologies. + """ + logger.debug(f"Retry prompt: {prompt}") + + logger.debug("AIListGeneratorBlock.run completed") From a8e5a0d98e8e902b43ec365ba377381317c4e873 Mon Sep 17 00:00:00 2001 From: Toran Bruce Richards Date: Mon, 30 Sep 2024 14:25:03 +0100 Subject: [PATCH 021/155] tweak(Blocks): Simplify iteration block to output list items (#8219) Refactor iteration block to support iterating over dictionaries and to return individual list items. --- .../backend/backend/blocks/iteration.py | 49 ++++++++++++------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/autogpt_platform/backend/backend/blocks/iteration.py b/autogpt_platform/backend/backend/blocks/iteration.py index f863521c83..05ca5f5ed7 100644 --- a/autogpt_platform/backend/backend/blocks/iteration.py +++ b/autogpt_platform/backend/backend/blocks/iteration.py @@ -1,37 +1,52 @@ -from typing import Any, List, Tuple +from typing import Any from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema from backend.data.model import SchemaField -class ListIteratorBlock(Block): +class StepThroughItemsBlock(Block): class Input(BlockSchema): - items: List[Any] = SchemaField( - description="The list of items to iterate over", - placeholder="[1, 2, 3, 4, 5]", + items: list | dict = SchemaField( + description="The list or dictionary of items to iterate over", + placeholder="[1, 2, 3, 4, 5] or {'key1': 'value1', 'key2': 'value2'}", ) class Output(BlockSchema): - item: Tuple[int, Any] = SchemaField( - description="A tuple with the index and current item in the iteration" + item: Any = SchemaField(description="The current item in the iteration") + key: Any = SchemaField( + description="The key or index of the current item in the iteration", ) def __init__(self): super().__init__( id="f8e7d6c5-b4a3-2c1d-0e9f-8g7h6i5j4k3l", - input_schema=ListIteratorBlock.Input, - output_schema=ListIteratorBlock.Output, - description="Iterates over a list of items and outputs each item with its index.", + input_schema=StepThroughItemsBlock.Input, + output_schema=StepThroughItemsBlock.Output, categories={BlockCategory.LOGIC}, - test_input={"items": [1, "two", {"three": 3}, [4, 5]]}, + description="Iterates over a list or dictionary and outputs each item.", + test_input={"items": [1, 2, 3, {"key1": "value1", "key2": "value2"}]}, test_output=[ - ("item", (0, 1)), - ("item", (1, "two")), - ("item", (2, {"three": 3})), - ("item", (3, [4, 5])), + ("item", 1), + ("key", 0), + ("item", 2), + ("key", 1), + ("item", 3), + ("key", 2), + ("item", {"key1": "value1", "key2": "value2"}), + ("key", 3), ], + test_mock={}, ) def run(self, input_data: Input, **kwargs) -> BlockOutput: - for index, item in enumerate(input_data.items): - yield "item", (index, item) + items = input_data.items + if isinstance(items, dict): + # If items is a dictionary, iterate over its values + for item in items.values(): + yield "item", item + yield "key", item + else: + # If items is a list, iterate over the list + for index, item in enumerate(items): + yield "item", item + yield "key", index From 1de99ca4df0e7be2b2afdc9cd8ebec34ada39b64 Mon Sep 17 00:00:00 2001 From: Toran Bruce Richards Date: Mon, 30 Sep 2024 19:48:07 +0100 Subject: [PATCH 022/155] tweak(blocks): Add option for simple raw content scraping to ExtractWebsiteContentBlock (#8228) Refactor search.py: Add option for raw content scraping in ExtractWebsiteContentBlock --- .../backend/backend/blocks/search.py | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/autogpt_platform/backend/backend/blocks/search.py b/autogpt_platform/backend/backend/blocks/search.py index 7414ca2f8a..e51ff4013a 100644 --- a/autogpt_platform/backend/backend/blocks/search.py +++ b/autogpt_platform/backend/backend/blocks/search.py @@ -4,7 +4,7 @@ from urllib.parse import quote import requests from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema -from backend.data.model import BlockSecret, SecretField +from backend.data.model import BlockSecret, SchemaField, SecretField class GetRequest: @@ -96,6 +96,12 @@ class SearchTheWebBlock(Block, GetRequest): class ExtractWebsiteContentBlock(Block, GetRequest): class Input(BlockSchema): url: str # The URL to scrape + raw_content: bool = SchemaField( + default=False, + title="Raw Content", + description="Whether to do a raw scrape of the content or use Jina-ai Reader to scrape the content", + advanced=True, + ) class Output(BlockSchema): content: str # The scraped content from the URL @@ -114,21 +120,18 @@ class ExtractWebsiteContentBlock(Block, GetRequest): ) def run(self, input_data: Input, **kwargs) -> BlockOutput: + if input_data.raw_content: + url = input_data.url + else: + url = f"https://r.jina.ai/{input_data.url}" + try: - # Prepend the Jina-ai Reader URL to the input URL - jina_url = f"https://r.jina.ai/{input_data.url}" - - # Make the request to Jina-ai Reader - response = self.get_request(jina_url, json=False) - - # Output the scraped content - yield "content", response - + content = self.get_request(url, json=False) + yield "content", content except requests.exceptions.HTTPError as http_err: yield "error", f"HTTP error occurred: {http_err}" - except requests.RequestException as e: - yield "error", f"Request to Jina-ai Reader failed: {e}" + yield "error", f"Request to URL failed: {e}" class GetWeatherInformationBlock(Block, GetRequest): From c64a2d4101ed6dbe830a18031c108774bf0865d2 Mon Sep 17 00:00:00 2001 From: Reinier van der Leer Date: Mon, 30 Sep 2024 21:52:05 +0200 Subject: [PATCH 023/155] dx(blocks): Auto-label block PRs (#8230) Automatically apply the `platform/blocks` label to PRs that change files in `backend/blocks/` --- .github/labeler.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/labeler.yml b/.github/labeler.yml index 9b843c2670..8d23469838 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -25,3 +25,8 @@ platform/frontend: platform/backend: - changed-files: - any-glob-to-any-file: autogpt_platform/backend/** + - all-globs-to-all-files: '!autogpt_platform/backend/backend/blocks/**' + +platform/blocks: +- changed-files: + - any-glob-to-any-file: autogpt_platform/backend/backend/blocks/** From a80b0de18da5c74aff1276b822582de777710a23 Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Tue, 1 Oct 2024 00:00:10 +0200 Subject: [PATCH 024/155] fix(platform): Fix unexpected closing block list on tutorial (#8233) --- .../frontend/src/components/Flow.tsx | 29 ++++++------------- .../frontend/src/components/NavBarButtons.tsx | 2 -- .../frontend/src/components/TallyPopup.tsx | 5 ++-- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/autogpt_platform/frontend/src/components/Flow.tsx b/autogpt_platform/frontend/src/components/Flow.tsx index 7d22be3923..3b24dc964d 100644 --- a/autogpt_platform/frontend/src/components/Flow.tsx +++ b/autogpt_platform/frontend/src/components/Flow.tsx @@ -38,7 +38,7 @@ import { IconUndo2, IconRedo2 } from "@/components/ui/icons"; import { startTutorial } from "./tutorial"; import useAgentGraph from "@/hooks/useAgentGraph"; import { v4 as uuidv4 } from "uuid"; -import { useRouter, usePathname } from "next/navigation"; +import { useRouter, usePathname, useSearchParams } from "next/navigation"; import RunnerUIWrapper, { RunnerUIWrapperRef, } from "@/components/RunnerUIWrapper"; @@ -91,13 +91,12 @@ const FlowEditor: React.FC<{ const router = useRouter(); const pathname = usePathname(); + const params = useSearchParams(); const initialPositionRef = useRef<{ [key: string]: { x: number; y: number }; }>({}); const isDragging = useRef(false); - // State to control if tutorial has started - const [tutorialStarted, setTutorialStarted] = useState(false); // State to control if blocks menu should be pinned open const [pinBlocksPopover, setPinBlocksPopover] = useState(false); @@ -105,27 +104,17 @@ const FlowEditor: React.FC<{ const { toast } = useToast(); - useEffect(() => { - const params = new URLSearchParams(window.location.search); + const TUTORIAL_STORAGE_KEY = "shepherd-tour"; - // If resetting tutorial + useEffect(() => { if (params.get("resetTutorial") === "true") { - localStorage.removeItem("shepherd-tour"); // Clear tutorial flag + localStorage.removeItem(TUTORIAL_STORAGE_KEY); router.push(pathname); - } else { - // Otherwise, start tutorial if conditions are met - const shouldStartTutorial = !localStorage.getItem("shepherd-tour"); - if ( - shouldStartTutorial && - availableNodes.length > 0 && - !tutorialStarted - ) { - startTutorial(setPinBlocksPopover); - setTutorialStarted(true); - localStorage.setItem("shepherd-tour", "yes"); - } + } else if (!localStorage.getItem(TUTORIAL_STORAGE_KEY)) { + startTutorial(setPinBlocksPopover); + localStorage.setItem(TUTORIAL_STORAGE_KEY, "yes"); } - }, [availableNodes, tutorialStarted, router, pathname]); + }, [availableNodes, router, pathname, params]); useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { diff --git a/autogpt_platform/frontend/src/components/NavBarButtons.tsx b/autogpt_platform/frontend/src/components/NavBarButtons.tsx index 5ca410e313..56c85598a1 100644 --- a/autogpt_platform/frontend/src/components/NavBarButtons.tsx +++ b/autogpt_platform/frontend/src/components/NavBarButtons.tsx @@ -31,8 +31,6 @@ export function NavBarButtons({ className }: { className?: string }) { const activeButton = buttons.find((button) => button.href === pathname); - console.log(">>>> ", activeButton); - return buttons.map((button) => ( { const [isFormVisible, setIsFormVisible] = useState(false); + const router = useRouter(); useEffect(() => { // Load Tally script @@ -42,8 +44,7 @@ const TallyPopupSimple = () => { } const resetTutorial = () => { - const url = `${window.location.origin}/build?resetTutorial=true`; - window.location.href = url; + router.push("/build?resetTutorial=true"); }; return ( From f6b5e13c2f76a9f8860abd16ba9efbec2e1e630a Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Tue, 1 Oct 2024 11:29:10 +0100 Subject: [PATCH 025/155] feat(prod,infra): Add prod values and clean up infra (#8238) add prod values and clean up infra --- .../templates/backendconfig.yaml | 26 ++++ .../templates/deployment-executor.yaml | 68 +++++++++++ .../autogpt-server/templates/deployment.yaml | 12 +- .../templates/service-executor.yaml | 19 +++ .../autogpt-server/templates/service.yaml | 8 +- .../infra/helm/autogpt-server/values.dev.yaml | 63 ++++++---- .../helm/autogpt-server/values.prod.yaml | 113 ++++++++++++++++++ .../infra/helm/autogpt-server/values.yaml | 27 +++-- 8 files changed, 294 insertions(+), 42 deletions(-) create mode 100644 autogpt_platform/infra/helm/autogpt-server/templates/backendconfig.yaml create mode 100644 autogpt_platform/infra/helm/autogpt-server/templates/deployment-executor.yaml create mode 100644 autogpt_platform/infra/helm/autogpt-server/templates/service-executor.yaml create mode 100644 autogpt_platform/infra/helm/autogpt-server/values.prod.yaml diff --git a/autogpt_platform/infra/helm/autogpt-server/templates/backendconfig.yaml b/autogpt_platform/infra/helm/autogpt-server/templates/backendconfig.yaml new file mode 100644 index 0000000000..da23ed215b --- /dev/null +++ b/autogpt_platform/infra/helm/autogpt-server/templates/backendconfig.yaml @@ -0,0 +1,26 @@ +apiVersion: cloud.google.com/v1 +kind: BackendConfig +metadata: + name: {{ include "autogpt-server.fullname" . }}-backend-config +spec: + customRequestHeaders: + headers: + - "Access-Control-Allow-Origin:{{ .Values.cors.allowOrigin }}" + - "Access-Control-Allow-Methods:{{ .Values.cors.allowMethods | join "," }}" + - "Access-Control-Allow-Headers:{{ .Values.cors.allowHeaders | join "," }}" + - "Access-Control-Max-Age:{{ .Values.cors.maxAge }}" + {{- if .Values.cors.allowCredentials }} + - "Access-Control-Allow-Credentials:true" + {{- end }} + customResponseHeaders: + headers: + - "Access-Control-Allow-Origin:{{ .Values.cors.allowOrigin }}" + - "Access-Control-Allow-Methods:{{ .Values.cors.allowMethods | join "," }}" + - "Access-Control-Allow-Headers:{{ .Values.cors.allowHeaders | join "," }}" + - "Access-Control-Max-Age:{{ .Values.cors.maxAge }}" + {{- if .Values.cors.allowCredentials }} + - "Access-Control-Allow-Credentials:true" + {{- end }} + timeoutSec: 1800 + connectionDraining: + drainingTimeoutSec: 1800 \ No newline at end of file diff --git a/autogpt_platform/infra/helm/autogpt-server/templates/deployment-executor.yaml b/autogpt_platform/infra/helm/autogpt-server/templates/deployment-executor.yaml new file mode 100644 index 0000000000..b8f239e7e2 --- /dev/null +++ b/autogpt_platform/infra/helm/autogpt-server/templates/deployment-executor.yaml @@ -0,0 +1,68 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "autogpt-server.fullname" . }}-executor + labels: + app.kubernetes.io/component: executor +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + app.kubernetes.io/component: executor + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + app.kubernetes.io/component: executor + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "autogpt-server.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + envFrom: + - configMapRef: + name: {{ include "autogpt-server.fullname" . }}-config + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + command: ["poetry", "run", "executor"] + ports: + - name: http + containerPort: {{ .Values.serviceExecutor.port }} + protocol: TCP + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.volumeMounts }} + volumeMounts: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.volumes }} + volumes: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/autogpt_platform/infra/helm/autogpt-server/templates/deployment.yaml b/autogpt_platform/infra/helm/autogpt-server/templates/deployment.yaml index 78b4aed66e..f706105f19 100644 --- a/autogpt_platform/infra/helm/autogpt-server/templates/deployment.yaml +++ b/autogpt_platform/infra/helm/autogpt-server/templates/deployment.yaml @@ -44,6 +44,9 @@ spec: - name: http containerPort: {{ .Values.service.port }} protocol: TCP + - name: pyro + containerPort: 8004 + protocol: TCP livenessProbe: {{- toYaml .Values.livenessProbe | nindent 12 }} readinessProbe: @@ -54,15 +57,6 @@ spec: volumeMounts: {{- toYaml . | nindent 12 }} {{- end }} - - name: cloud-sql-proxy - image: "{{ .Values.cloudSqlProxy.image.repository }}:{{ .Values.cloudSqlProxy.image.tag }}" - args: - - "--structured-logs" - {{- if .Values.cloudSqlProxy.usePrivateIp }} - - "--private-ip" - {{- end }} - - "--port={{ .Values.cloudSqlProxy.port }}" - - "{{ .Values.cloudSqlProxy.instanceConnectionName }}" {{- with .Values.volumes }} volumes: {{- toYaml . | nindent 8 }} diff --git a/autogpt_platform/infra/helm/autogpt-server/templates/service-executor.yaml b/autogpt_platform/infra/helm/autogpt-server/templates/service-executor.yaml new file mode 100644 index 0000000000..36ef560b22 --- /dev/null +++ b/autogpt_platform/infra/helm/autogpt-server/templates/service-executor.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "autogpt-server.fullname" . }}-executor + labels: + app.kubernetes.io/component: executor + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.serviceExecutor.type }} + ports: + - port: {{ .Values.serviceExecutor.port }} + targetPort: http + protocol: TCP + name: http + selector: + app.kubernetes.io/component: executor diff --git a/autogpt_platform/infra/helm/autogpt-server/templates/service.yaml b/autogpt_platform/infra/helm/autogpt-server/templates/service.yaml index 53d970dbc9..b944873174 100644 --- a/autogpt_platform/infra/helm/autogpt-server/templates/service.yaml +++ b/autogpt_platform/infra/helm/autogpt-server/templates/service.yaml @@ -15,5 +15,11 @@ spec: targetPort: http protocol: TCP name: http + {{- if .Values.service.pyroDaemonPort }} + - port: {{ .Values.service.pyroDaemonPort }} + targetPort: pyro + protocol: TCP + name: pyro + {{- end }} selector: - {{- include "autogpt-server.selectorLabels" . | nindent 4 }} + {{- include "autogpt-server.selectorLabels" . | nindent 4 }} \ No newline at end of file diff --git a/autogpt_platform/infra/helm/autogpt-server/values.dev.yaml b/autogpt_platform/infra/helm/autogpt-server/values.dev.yaml index 5d17aa4078..fa7de98731 100644 --- a/autogpt_platform/infra/helm/autogpt-server/values.dev.yaml +++ b/autogpt_platform/infra/helm/autogpt-server/values.dev.yaml @@ -12,10 +12,18 @@ serviceAccount: service: type: ClusterIP - port: 8000 - targetPort: 8000 + port: 8006 + pyroDaemonPort: 8004 annotations: cloud.google.com/neg: '{"ingress": true}' + beta.cloud.google.com/backend-config: '{"default": "autogpt-server-backend-config"}' + +serviceExecutor: + type: ClusterIP + port: 8002 + targetPort: 8002 + annotations: + beta.cloud.google.com/backend-config: '{"default": "autogpt-server-backend-config"}' ingress: enabled: true @@ -33,12 +41,12 @@ ingress: backend: service: name: autogpt-server - port: 8000 + port: 8006 defaultBackend: service: name: autogpt-server port: - number: 8000 + number: 8006 resources: requests: @@ -46,12 +54,12 @@ resources: memory: 256Mi limits: cpu: 2 - memory: 2Gi + memory: 10Gi livenessProbe: httpGet: path: /docs - port: 8000 + port: 8006 initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 @@ -59,7 +67,7 @@ livenessProbe: readinessProbe: httpGet: path: /docs - port: 8000 + port: 8006 initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 @@ -67,28 +75,39 @@ readinessProbe: domain: "dev-server.agpt.co" -cloudSqlProxy: - image: - repository: gcr.io/cloud-sql-connectors/cloud-sql-proxy - tag: 2.11.4 - instanceConnectionName: "agpt-dev:us-central1:agpt-server-dev" - port: 5432 - resources: - requests: - memory: "2Gi" - cpu: "1" +cors: + allowOrigin: "https://dev-builder.agpt.co" + allowMethods: + - "GET" + - "POST" + - "PUT" + - "DELETE" + - "OPTIONS" + allowHeaders: + - "Content-Type" + - "Authorization" + maxAge: 3600 + allowCredentials: true env: APP_ENV: "dev" PYRO_HOST: "0.0.0.0" - NUM_GRAPH_WORKERS: 100 - NUM_NODE_WORKERS: 5 + ENABLE_AUTH: "true" REDIS_HOST: "redis-dev-master.redis-dev.svc.cluster.local" REDIS_PORT: "6379" + OPENAI_API_KEY: "" + SUPABASE_JWT_SECRET: "" + REDIS_PASSWORD: "password" + NUM_GRAPH_WORKERS: 10 + NUM_NODE_WORKERS: 5 + DATABASE_URL: "" + SENTRY_DSN: "" + ENABLE_CREDIT: "true" BACKEND_CORS_ALLOW_ORIGINS: '["https://dev-builder.agpt.co"]' SUPABASE_SERVICE_ROLE_KEY: "" GITHUB_CLIENT_ID: "" GITHUB_CLIENT_SECRET: "" - FRONTEND_BASE_URL: "" - SUPABASE_URL: "" - SUPABASE_JWT_SECRET: "" + FRONTEND_BASE_URL: "https://dev-builder.agpt.co/" + SUPABASE_URL: "https://adfjtextkuilwuhzdjpf.supabase.co" + AGENTSERVER_HOST: "autogpt-server.dev-agpt.svc.cluster.local" + EXECUTIONMANAGER_HOST: "autogpt-server-executor.dev-agpt.svc.cluster.local" \ No newline at end of file diff --git a/autogpt_platform/infra/helm/autogpt-server/values.prod.yaml b/autogpt_platform/infra/helm/autogpt-server/values.prod.yaml new file mode 100644 index 0000000000..cafbe2f1dc --- /dev/null +++ b/autogpt_platform/infra/helm/autogpt-server/values.prod.yaml @@ -0,0 +1,113 @@ +# prod values, overwrite base values as needed. + +image: + repository: us-east1-docker.pkg.dev/agpt-prod/agpt-backend-prod/agpt-backend-prod + pullPolicy: Always + tag: "latest" + +serviceAccount: + annotations: + iam.gke.io/gcp-service-account: "prod-agpt-server-sa@agpt-prod.iam.gserviceaccount.com" + name: "prod-agpt-server-sa" + +service: + type: ClusterIP + port: 8006 + pyroDaemonPort: 8004 + annotations: + cloud.google.com/neg: '{"ingress": true}' + beta.cloud.google.com/backend-config: '{"default": "autogpt-server-backend-config"}' + +serviceExecutor: + type: ClusterIP + port: 8002 + targetPort: 8002 + annotations: + beta.cloud.google.com/backend-config: '{"default": "autogpt-server-backend-config"}' + +ingress: + enabled: true + className: "gce" + annotations: + kubernetes.io/ingress.class: gce + kubernetes.io/ingress.global-static-ip-name: "agpt-prod-agpt-backend-ip" + networking.gke.io/managed-certificates: "autogpt-server-cert" + networking.gke.io/v1beta1.FrontendConfig: "autogpt-server-frontend-config" + hosts: + - host: backend.agpt.co + paths: + - path: / + pathType: Prefix + backend: + service: + name: autogpt-server + port: 8006 + defaultBackend: + service: + name: autogpt-server + port: + number: 8006 + +resources: + requests: + cpu: 200m + memory: 256Mi + limits: + cpu: 2 + memory: 10Gi + +cors: + allowOrigin: "https://platform.agpt.co" + allowMethods: + - "GET" + - "POST" + - "PUT" + - "DELETE" + - "OPTIONS" + allowHeaders: + - "Content-Type" + - "Authorization" + maxAge: 3600 + allowCredentials: true + +livenessProbe: + httpGet: + path: /docs + port: 8006 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 +readinessProbe: + httpGet: + path: /docs + port: 8006 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + +domain: "backend.agpt.co" + +env: + APP_ENV: "prod" + PYRO_HOST: "0.0.0.0" + ENABLE_AUTH: "true" + REDIS_HOST: "redis-prod-master.redis-prod.svc.cluster.local" + REDIS_PORT: "6379" + OPENAI_API_KEY: "" + REDIS_PASSWORD: "" + NUM_GRAPH_WORKERS: 10 + NUM_NODE_WORKERS: 5 + ENABLE_CREDIT: "true" + BACKEND_CORS_ALLOW_ORIGINS: '["https://platform.agpt.co"]' + SUPABASE_JWT_SECRET: "" + DATABASE_URL: "" + SENTRY_DSN: "" + SUPABASE_SERVICE_ROLE_KEY: "" + FRONTEND_BASE_URL: "https://platform.agpt.co/" + SUPABASE_URL: "https://bgwpwdsxblryihinutbx.supabase.co" + AGENTSERVER_HOST: "autogpt-server.prod-agpt.svc.cluster.local" + EXECUTIONMANAGER_HOST: "autogpt-server-executor.prod-agpt.svc.cluster.local" + GITHUB_CLIENT_ID: "" + GITHUB_CLIENT_SECRET: "" diff --git a/autogpt_platform/infra/helm/autogpt-server/values.yaml b/autogpt_platform/infra/helm/autogpt-server/values.yaml index 3bdfd8515a..8296416ef7 100644 --- a/autogpt_platform/infra/helm/autogpt-server/values.yaml +++ b/autogpt_platform/infra/helm/autogpt-server/values.yaml @@ -45,17 +45,9 @@ resources: cpu: 100m memory: 128Mi limits: - cpu: 500m - memory: 512Mi + cpu: 1 + memory: 1Gi -livenessProbe: - httpGet: - path: / - port: http -readinessProbe: - httpGet: - path: / - port: http autoscaling: enabled: false @@ -75,6 +67,21 @@ affinity: {} domain: "" +cors: + allowOrigins: + - "https://dev-builder.agpt.co" + allowMethods: + - "GET" + - "POST" + - "PUT" + - "DELETE" + - "OPTIONS" + allowHeaders: + - "Content-Type" + - "Authorization" + maxAge: 3600 + allowCredentials: true + cloudSqlProxy: image: repository: gcr.io/cloud-sql-connectors/cloud-sql-proxy From 55803bcd540a3013127c3ac623554aebbfbef26f Mon Sep 17 00:00:00 2001 From: Nicholas Tindle Date: Tue, 1 Oct 2024 05:37:01 -0500 Subject: [PATCH 026/155] feat(frontend): push to cloud if needed for marketplace, and add a download agent button (#8196) * feat(frontend): push to cloud if needed for marketplace * fix(market): missing envar in the example :angry: * feat(frontend): download button functions * feat(frontend): styling and linting * feat(frontend): move to popup * feat(frontend): style fixes and link replacement * feat(infra): add variables * fix(frontend): merge * fix(frontend): linting * feat(frontend): pr changes * Update NavBar.tsx * fix(frontend): linting --------- Co-authored-by: Zamil Majdy Co-authored-by: Aarushi <50577581+aarushik93@users.noreply.github.com> --- autogpt_platform/docker-compose.platform.yml | 1 + autogpt_platform/frontend/.env.example | 3 + autogpt_platform/frontend/package.json | 2 +- .../frontend/src/components/NavBar.tsx | 5 +- .../frontend/src/components/NavBarButtons.tsx | 47 -- .../marketplace/AgentDetailContent.tsx | 123 ++- .../src/components/{ => nav}/CreditButton.tsx | 0 .../src/components/nav/MarketPopup.tsx | 27 + .../src/components/nav/NavBarButtons.tsx | 74 ++ autogpt_platform/frontend/src/lib/utils.ts | 11 + autogpt_platform/frontend/yarn.lock | 733 ++++++------------ .../helm/autogpt-builder/values.dev.yaml | 3 +- autogpt_platform/market/.env.example | 3 +- 13 files changed, 396 insertions(+), 636 deletions(-) delete mode 100644 autogpt_platform/frontend/src/components/NavBarButtons.tsx rename autogpt_platform/frontend/src/components/{ => nav}/CreditButton.tsx (100%) create mode 100644 autogpt_platform/frontend/src/components/nav/MarketPopup.tsx create mode 100644 autogpt_platform/frontend/src/components/nav/NavBarButtons.tsx diff --git a/autogpt_platform/docker-compose.platform.yml b/autogpt_platform/docker-compose.platform.yml index 8f0fda2aff..a0b8f670ac 100644 --- a/autogpt_platform/docker-compose.platform.yml +++ b/autogpt_platform/docker-compose.platform.yml @@ -207,6 +207,7 @@ services: # - NEXT_PUBLIC_AGPT_SERVER_URL=http://localhost:8006/api # - NEXT_PUBLIC_AGPT_WS_SERVER_URL=ws://localhost:8001/ws # - NEXT_PUBLIC_AGPT_MARKETPLACE_URL=http://localhost:8015/api/v1/market +# - NEXT_PUBLIC_BEHAVE_AS=LOCAL # ports: # - "3000:3000" # networks: diff --git a/autogpt_platform/frontend/.env.example b/autogpt_platform/frontend/.env.example index 34309245e3..0fe0b75402 100644 --- a/autogpt_platform/frontend/.env.example +++ b/autogpt_platform/frontend/.env.example @@ -13,3 +13,6 @@ NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAic ## Only used if you're using Supabase and OAuth AUTH_CALLBACK_URL=http://localhost:3000/auth/callback GA_MEASUREMENT_ID=G-FH2XK2W4GN + +# When running locally, set NEXT_PUBLIC_BEHAVE_AS=CLOUD to use the a locally hosted marketplace (as is typical in development, and the cloud deployment), otherwise set it to LOCAL to have the marketplace open in a new tab +NEXT_PUBLIC_BEHAVE_AS=LOCAL \ No newline at end of file diff --git a/autogpt_platform/frontend/package.json b/autogpt_platform/frontend/package.json index 4997672640..f9ba6ed2bf 100644 --- a/autogpt_platform/frontend/package.json +++ b/autogpt_platform/frontend/package.json @@ -66,7 +66,7 @@ }, "devDependencies": { "@playwright/test": "^1.47.1", - "@types/node": "^20", + "@types/node": "^22.7.3", "@types/react": "^18", "@types/react-dom": "^18", "@types/react-modal": "^3.16.3", diff --git a/autogpt_platform/frontend/src/components/NavBar.tsx b/autogpt_platform/frontend/src/components/NavBar.tsx index 667d653bff..815543189c 100644 --- a/autogpt_platform/frontend/src/components/NavBar.tsx +++ b/autogpt_platform/frontend/src/components/NavBar.tsx @@ -6,8 +6,9 @@ import Image from "next/image"; import getServerUser from "@/hooks/getServerUser"; import ProfileDropdown from "./ProfileDropdown"; import { IconCircleUser, IconMenu } from "@/components/ui/icons"; -import CreditButton from "@/components/CreditButton"; -import { NavBarButtons } from "./NavBarButtons"; +import CreditButton from "@/components/nav/CreditButton"; + +import { NavBarButtons } from "./nav/NavBarButtons"; export async function NavBar() { const isAvailable = Boolean( diff --git a/autogpt_platform/frontend/src/components/NavBarButtons.tsx b/autogpt_platform/frontend/src/components/NavBarButtons.tsx deleted file mode 100644 index 56c85598a1..0000000000 --- a/autogpt_platform/frontend/src/components/NavBarButtons.tsx +++ /dev/null @@ -1,47 +0,0 @@ -"use client"; - -import Link from "next/link"; -import { BsBoxes } from "react-icons/bs"; -import { LuLaptop } from "react-icons/lu"; -import { LuShoppingCart } from "react-icons/lu"; -import { cn } from "@/lib/utils"; -import { usePathname } from "next/navigation"; - -export function NavBarButtons({ className }: { className?: string }) { - "use client"; - - const pathname = usePathname(); - const buttons = [ - { - href: "/marketplace", - text: "Marketplace", - icon: , - }, - { - href: "/", - text: "Monitor", - icon: , - }, - { - href: "/build", - text: "Build", - icon: , - }, - ]; - - const activeButton = buttons.find((button) => button.href === pathname); - - return buttons.map((button) => ( - - {button.icon} {button.text} - - )); -} diff --git a/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx b/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx index 2a44456dca..ff4f398c98 100644 --- a/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx +++ b/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx @@ -1,81 +1,44 @@ "use client"; - -import { useState } from "react"; import Link from "next/link"; -import { - ArrowLeft, - Download, - Calendar, - Tag, - ChevronDown, - ChevronUp, -} from "lucide-react"; +import { ArrowLeft, Download, Calendar, Tag } from "lucide-react"; import { Button } from "@/components/ui/button"; import { AgentDetailResponse, InstallationLocation, } from "@/lib/marketplace-api"; -import dynamic from "next/dynamic"; -import { Node, Edge } from "@xyflow/react"; import MarketplaceAPI from "@/lib/marketplace-api"; import AutoGPTServerAPI, { GraphCreatable } from "@/lib/autogpt-server-api"; - -const ReactFlow = dynamic( - () => import("@xyflow/react").then((mod) => mod.ReactFlow), - { ssr: false }, -); -const Controls = dynamic( - () => import("@xyflow/react").then((mod) => mod.Controls), - { ssr: false }, -); -const Background = dynamic( - () => import("@xyflow/react").then((mod) => mod.Background), - { ssr: false }, -); - import "@xyflow/react/dist/style.css"; -import { beautifyString } from "@/lib/utils"; import { makeAnalyticsEvent } from "./actions"; -function convertGraphToReactFlow(graph: any): { nodes: Node[]; edges: Edge[] } { - const nodes: Node[] = graph.nodes.map((node: any) => { - let label = node.block_id || "Unknown"; - try { - label = beautifyString(label); - } catch (error) { - console.error("Error beautifying node label:", error); - } +async function downloadAgent(id: string): Promise { + const api = new MarketplaceAPI(); + try { + const file = await api.downloadAgentFile(id); + console.debug(`Agent file downloaded:`, file); - return { - id: node.id, - position: node.metadata.position || { x: 0, y: 0 }, - data: { - label, - blockId: node.block_id, - inputDefault: node.input_default || {}, - ...node, // Include all other node data - }, - type: "custom", - }; - }); + // Create a Blob from the file content + const blob = new Blob([file], { type: "application/json" }); - const edges: Edge[] = graph.links.map((link: any) => ({ - id: `${link.source_id}-${link.sink_id}`, - source: link.source_id, - target: link.sink_id, - sourceHandle: link.source_name, - targetHandle: link.sink_name, - type: "custom", - data: { - sourceId: link.source_id, - targetId: link.sink_id, - sourceName: link.source_name, - targetName: link.sink_name, - isStatic: link.is_static, - }, - })); + // Create a temporary URL for the Blob + const url = window.URL.createObjectURL(blob); - return { nodes, edges }; + // Create a temporary anchor element + const a = document.createElement("a"); + a.href = url; + a.download = `agent_${id}.json`; // Set the filename + + // Append the anchor to the body, click it, and remove it + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + + // Revoke the temporary URL + window.URL.revokeObjectURL(url); + } catch (error) { + console.error(`Error downloading agent:`, error); + throw error; + } } async function installGraph(id: string): Promise { @@ -84,12 +47,12 @@ async function installGraph(id: string): Promise { "http://localhost:8015/api/v1/market"; const api = new MarketplaceAPI(apiUrl); - const serverAPIUrl = process.env.AGPT_SERVER_API_URL; + const serverAPIUrl = process.env.NEXT_PUBLIC_AGPT_SERVER_API_URL; const serverAPI = new AutoGPTServerAPI(serverAPIUrl); try { - console.log(`Installing agent with id: ${id}`); + console.debug(`Installing agent with id: ${id}`); let agent = await api.downloadAgent(id); - console.log(`Agent downloaded:`, agent); + console.debug(`Agent downloaded:`, agent); const data: GraphCreatable = { id: agent.id, version: agent.version, @@ -109,7 +72,7 @@ async function installGraph(id: string): Promise { installation_location: InstallationLocation.CLOUD, }, }); - console.log(`Agent installed successfully`, result); + console.debug(`Agent installed successfully`, result); } catch (error) { console.error(`Error installing agent:`, error); throw error; @@ -117,9 +80,6 @@ async function installGraph(id: string): Promise { } function AgentDetailContent({ agent }: { agent: AgentDetailResponse }) { - const [isGraphExpanded, setIsGraphExpanded] = useState(false); - const { nodes, edges } = convertGraphToReactFlow(agent.graph); - return (
@@ -130,13 +90,22 @@ function AgentDetailContent({ agent }: { agent: AgentDetailResponse }) { Back to Marketplace - +
+ + +
diff --git a/autogpt_platform/frontend/src/components/CreditButton.tsx b/autogpt_platform/frontend/src/components/nav/CreditButton.tsx similarity index 100% rename from autogpt_platform/frontend/src/components/CreditButton.tsx rename to autogpt_platform/frontend/src/components/nav/CreditButton.tsx diff --git a/autogpt_platform/frontend/src/components/nav/MarketPopup.tsx b/autogpt_platform/frontend/src/components/nav/MarketPopup.tsx new file mode 100644 index 0000000000..bdb5d1bee0 --- /dev/null +++ b/autogpt_platform/frontend/src/components/nav/MarketPopup.tsx @@ -0,0 +1,27 @@ +import { ButtonHTMLAttributes } from "react"; +import React from "react"; + +interface MarketPopupProps extends ButtonHTMLAttributes { + marketplaceUrl?: string; +} + +export default function MarketPopup({ + className = "", + marketplaceUrl = "http://platform.agpt.co/marketplace", + children, + ...props +}: MarketPopupProps) { + const openMarketplacePopup = () => { + window.open( + marketplaceUrl, + "popupWindow", + "width=600,height=400,toolbar=no,menubar=no,scrollbars=no", + ); + }; + + return ( + + ); +} diff --git a/autogpt_platform/frontend/src/components/nav/NavBarButtons.tsx b/autogpt_platform/frontend/src/components/nav/NavBarButtons.tsx new file mode 100644 index 0000000000..36115e0e6c --- /dev/null +++ b/autogpt_platform/frontend/src/components/nav/NavBarButtons.tsx @@ -0,0 +1,74 @@ +"use client"; + +import React from "react"; +import Link from "next/link"; +import { BsBoxes } from "react-icons/bs"; +import { LuLaptop, LuShoppingCart } from "react-icons/lu"; +import { BehaveAs, cn } from "@/lib/utils"; +import { usePathname } from "next/navigation"; +import { getBehaveAs } from "@/lib/utils"; +import MarketPopup from "./MarketPopup"; + +export function NavBarButtons({ className }: { className?: string }) { + const pathname = usePathname(); + const buttons = [ + { + href: "/", + text: "Monitor", + icon: , + }, + { + href: "/build", + text: "Build", + icon: , + }, + ]; + + const isCloud = getBehaveAs() === BehaveAs.CLOUD; + + return ( + <> + {buttons.map((button) => { + const isActive = button.href === pathname; + return ( + + {button.icon} {button.text} + + ); + })} + {isCloud ? ( + + Marketplace + + ) : ( + + Marketplace + + )} + + ); +} diff --git a/autogpt_platform/frontend/src/lib/utils.ts b/autogpt_platform/frontend/src/lib/utils.ts index 8852dc4f42..4c976e610f 100644 --- a/autogpt_platform/frontend/src/lib/utils.ts +++ b/autogpt_platform/frontend/src/lib/utils.ts @@ -203,3 +203,14 @@ export function filterBlocksByType( ): T[] { return blocks.filter(predicate); } + +export enum BehaveAs { + CLOUD = "CLOUD", + LOCAL = "LOCAL", +} + +export function getBehaveAs(): BehaveAs { + return process.env.NEXT_PUBLIC_BEHAVE_AS === "CLOUD" + ? BehaveAs.CLOUD + : BehaveAs.LOCAL; +} diff --git a/autogpt_platform/frontend/yarn.lock b/autogpt_platform/frontend/yarn.lock index ce8fea9970..b66d057f2b 100644 --- a/autogpt_platform/frontend/yarn.lock +++ b/autogpt_platform/frontend/yarn.lock @@ -28,7 +28,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz" integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== -"@babel/core@^7.0.0", "@babel/core@^7.18.5": +"@babel/core@^7.18.5": version "7.25.2" resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== @@ -288,20 +288,12 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@jridgewell/source-map@^0.3.3": - version "0.3.6" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz" - integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -326,6 +318,46 @@ resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.13.tgz" integrity sha512-IkAmQEa2Htq+wHACBxOsslt+jMoV3msvxCn0WFSfJSkv/scy+i/EukBKNad36grRxywaXUYJc9mxEGkeIs8Bzg== +"@next/swc-darwin-x64@14.2.13": + version "14.2.13" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.13.tgz#1d4821d54bb01dacc6a6c32408f8468a4f4af269" + integrity sha512-Dv1RBGs2TTjkwEnFMVL5XIfJEavnLqqwYSD6LXgTPdEy/u6FlSrLBSSfe1pcfqhFEXRAgVL3Wpjibe5wXJzWog== + +"@next/swc-linux-arm64-gnu@14.2.13": + version "14.2.13" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.13.tgz#79d9af8d3408df9990c8911889eca1ca6a308f19" + integrity sha512-yB1tYEFFqo4ZNWkwrJultbsw7NPAAxlPXURXioRl9SdW6aIefOLS+0TEsKrWBtbJ9moTDgU3HRILL6QBQnMevg== + +"@next/swc-linux-arm64-musl@14.2.13": + version "14.2.13" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.13.tgz#b13180645865b120591db2f1e831743ebc02ab36" + integrity sha512-v5jZ/FV/eHGoWhMKYrsAweQ7CWb8xsWGM/8m1mwwZQ/sutJjoFaXchwK4pX8NqwImILEvQmZWyb8pPTcP7htWg== + +"@next/swc-linux-x64-gnu@14.2.13": + version "14.2.13" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.13.tgz#8cb8480dfeee512648e4e08c2095aac0461b876f" + integrity sha512-aVc7m4YL7ViiRv7SOXK3RplXzOEe/qQzRA5R2vpXboHABs3w8vtFslGTz+5tKiQzWUmTmBNVW0UQdhkKRORmGA== + +"@next/swc-linux-x64-musl@14.2.13": + version "14.2.13" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.13.tgz#df5ca922fa1e1ee81b15a06a2d3d3ace0efd2bd7" + integrity sha512-4wWY7/OsSaJOOKvMsu1Teylku7vKyTuocvDLTZQq0TYv9OjiYYWt63PiE1nTuZnqQ4RPvME7Xai+9enoiN0Wrg== + +"@next/swc-win32-arm64-msvc@14.2.13": + version "14.2.13" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.13.tgz#8a7db6e71f526212587975f743b28e4d1cb829d1" + integrity sha512-uP1XkqCqV2NVH9+g2sC7qIw+w2tRbcMiXFEbMihkQ8B1+V6m28sshBwAB0SDmOe0u44ne1vFU66+gx/28RsBVQ== + +"@next/swc-win32-ia32-msvc@14.2.13": + version "14.2.13" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.13.tgz#6aa664f36f2d70c5ae6ffcbbc56784d33f24522d" + integrity sha512-V26ezyjPqQpDBV4lcWIh8B/QICQ4v+M5Bo9ykLN+sqeKKBxJVDpEc6biDVyluTXTC40f5IqCU0ttth7Es2ZuMw== + +"@next/swc-win32-x64-msvc@14.2.13": + version "14.2.13" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.13.tgz#5a920eea82a58affa6146192586716cec6c87fed" + integrity sha512-WwzOEAFBGhlDHE5Z73mNU8CO8mqMNLqaG+AO9ETmzdCQlJhVtWZnOl2+rqgVQS+YHunjOWptdFmNfbpwcUuEsw== + "@next/third-parties@^14.2.5": version "14.2.6" resolved "https://registry.npmjs.org/@next/third-parties/-/third-parties-14.2.6.tgz" @@ -341,7 +373,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -368,7 +400,7 @@ dependencies: "@opentelemetry/api" "^1.0.0" -"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.1.0", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.7.0", "@opentelemetry/api@^1.8", "@opentelemetry/api@^1.9.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0": +"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.8", "@opentelemetry/api@^1.9.0": version "1.9.0" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== @@ -378,7 +410,7 @@ resolved "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz" integrity sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg== -"@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.25.1", "@opentelemetry/core@^1.8.0", "@opentelemetry/core@1.26.0": +"@opentelemetry/core@1.26.0", "@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.25.1", "@opentelemetry/core@^1.8.0": version "1.26.0" resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz" integrity sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ== @@ -514,15 +546,6 @@ "@opentelemetry/instrumentation" "^0.53.0" "@opentelemetry/semantic-conventions" "^1.27.0" -"@opentelemetry/instrumentation-mysql@0.41.0": - version "0.41.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.41.0.tgz" - integrity sha512-jnvrV6BsQWyHS2qb2fkfbfSb1R/lmYwqEZITwufuRl37apTopswu9izc0b1CYRp/34tUG/4k/V39PND6eyiNvw== - dependencies: - "@opentelemetry/instrumentation" "^0.53.0" - "@opentelemetry/semantic-conventions" "^1.27.0" - "@types/mysql" "2.15.26" - "@opentelemetry/instrumentation-mysql2@0.41.0": version "0.41.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz" @@ -532,6 +555,15 @@ "@opentelemetry/semantic-conventions" "^1.27.0" "@opentelemetry/sql-common" "^0.40.1" +"@opentelemetry/instrumentation-mysql@0.41.0": + version "0.41.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.41.0.tgz" + integrity sha512-jnvrV6BsQWyHS2qb2fkfbfSb1R/lmYwqEZITwufuRl37apTopswu9izc0b1CYRp/34tUG/4k/V39PND6eyiNvw== + dependencies: + "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/semantic-conventions" "^1.27.0" + "@types/mysql" "2.15.26" + "@opentelemetry/instrumentation-nestjs-core@0.40.0": version "0.40.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.40.0.tgz" @@ -568,6 +600,18 @@ "@opentelemetry/core" "^1.8.0" "@opentelemetry/instrumentation" "^0.53.0" +"@opentelemetry/instrumentation@0.53.0", "@opentelemetry/instrumentation@^0.53.0": + version "0.53.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz" + integrity sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A== + dependencies: + "@opentelemetry/api-logs" "0.53.0" + "@types/shimmer" "^1.2.0" + import-in-the-middle "^1.8.1" + require-in-the-middle "^7.1.1" + semver "^7.5.2" + shimmer "^1.2.1" + "@opentelemetry/instrumentation@^0.49 || ^0.50 || ^0.51 || ^0.52.0": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz" @@ -580,24 +624,12 @@ semver "^7.5.2" shimmer "^1.2.1" -"@opentelemetry/instrumentation@^0.53.0", "@opentelemetry/instrumentation@0.53.0": - version "0.53.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz" - integrity sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A== - dependencies: - "@opentelemetry/api-logs" "0.53.0" - "@types/shimmer" "^1.2.0" - import-in-the-middle "^1.8.1" - require-in-the-middle "^7.1.1" - semver "^7.5.2" - shimmer "^1.2.1" - "@opentelemetry/redis-common@^0.36.2": version "0.36.2" resolved "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz" integrity sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g== -"@opentelemetry/resources@^1.26.0", "@opentelemetry/resources@1.26.0": +"@opentelemetry/resources@1.26.0", "@opentelemetry/resources@^1.26.0": version "1.26.0" resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz" integrity sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw== @@ -622,7 +654,7 @@ "@opentelemetry/resources" "1.26.0" "@opentelemetry/semantic-conventions" "1.27.0" -"@opentelemetry/semantic-conventions@^1.27.0", "@opentelemetry/semantic-conventions@1.27.0": +"@opentelemetry/semantic-conventions@1.27.0", "@opentelemetry/semantic-conventions@^1.27.0": version "1.27.0" resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz" integrity sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg== @@ -639,7 +671,7 @@ resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@playwright/test@^1.41.2", "@playwright/test@^1.47.1": +"@playwright/test@^1.47.1": version "1.47.1" resolved "https://registry.npmjs.org/@playwright/test/-/test-1.47.1.tgz" integrity sha512-dbWpcNQZ5nj16m+A5UNScYx7HX5trIy7g4phrcitn+Nk83S32EBX/CLU4hiF4RGKX/yRc93AAqtfaXB7JWBd4Q== @@ -751,26 +783,6 @@ resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz" integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== -"@radix-ui/react-dialog@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz" - integrity sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-focus-guards" "1.1.0" - "@radix-ui/react-focus-scope" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.7" - "@radix-ui/react-dialog@1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz" @@ -792,6 +804,26 @@ aria-hidden "^1.1.1" react-remove-scroll "2.5.5" +"@radix-ui/react-dialog@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz" + integrity sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-focus-guards" "1.1.0" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.7" + "@radix-ui/react-direction@1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz" @@ -1064,13 +1096,6 @@ dependencies: "@radix-ui/react-primitive" "2.0.0" -"@radix-ui/react-slot@^1.1.0", "@radix-ui/react-slot@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz" - integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-slot@1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz" @@ -1079,6 +1104,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.1" +"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz" + integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-switch@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz" @@ -1234,6 +1266,11 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@rollup/rollup-linux-x64-gnu@^4.9.5": + version "4.22.5" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz#a135b040b21582e91cfed2267ccfc7d589e1dbc6" + integrity sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA== + "@rushstack/eslint-patch@^1.3.3": version "1.10.4" resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz" @@ -1319,6 +1356,36 @@ resolved "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.36.1.tgz" integrity sha512-JOHQjVD8Kqxm1jUKioAP5ohLOITf+Dh6+DBz4gQjCNdotsvNW5m63TKROwq2oB811p+Jzv5304ujmN4cAqW1Ww== +"@sentry/cli-linux-arm64@2.36.1": + version "2.36.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.36.1.tgz#ff449d7e7e715166257998c02cf635ca02acbadd" + integrity sha512-R//3ZEkbzvoStr3IA7nxBZNiBYyxOljOqAhgiTnejXHmnuwDzM3TBA2n5vKPE/kBFxboEBEw0UTzTIRb1T0bgw== + +"@sentry/cli-linux-arm@2.36.1": + version "2.36.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.36.1.tgz#1ae5d335a1b4cd217a34c2bd6c6f5e0670136eb3" + integrity sha512-gvEOKN0fWL2AVqUBKHNXPRZfJNvKTs8kQhS8cQqahZGgZHiPCI4BqW45cKMq+ZTt1UUbLmt6khx5Dz7wi+0i5A== + +"@sentry/cli-linux-i686@2.36.1": + version "2.36.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.36.1.tgz#112b9e26357e918cbbba918114ec8cdab07cdf60" + integrity sha512-R7sW5Vk/HacVy2YgQoQB+PwccvFYf2CZVPSFSFm2z7MEfNe77UYHWUq+sjJ4vxWG6HDWGVmaX0fjxyDkE01JRA== + +"@sentry/cli-linux-x64@2.36.1": + version "2.36.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.36.1.tgz#c3e5bdb0c9a4bb44c83927c62a3cd7e006709bf7" + integrity sha512-UMr3ik8ksA7zQfbzsfwCb+ztenLnaeAbX94Gp+bzANZwPfi/vVHf2bLyqsBs4OyVt9SPlN1bbM/RTGfMjZ3JOw== + +"@sentry/cli-win32-i686@2.36.1": + version "2.36.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.36.1.tgz#819573320e885e1dbf59b0a01d3bd370c84c1708" + integrity sha512-CflvhnvxPEs5GWQuuDtYSLqPrBaPbcSJFlBuUIb+8WNzRxvVfjgw1qzfZmkQqABqiy/YEsEekllOoMFZAvCcVA== + +"@sentry/cli-win32-x64@2.36.1": + version "2.36.1" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.36.1.tgz#80779b4bffb4e2e32944eae72c60e6f40151b4dc" + integrity sha512-wWqht2xghcK3TGnooHZSzA3WSjdtno/xFjZLvWmw38rblGwgKMxLZnlxV6uDyS+OJ6CbfDTlCRay/0TIqA0N8g== + "@sentry/cli@^2.33.1": version "2.36.1" resolved "https://registry.npmjs.org/@sentry/cli/-/cli-2.36.1.tgz" @@ -1472,7 +1539,7 @@ dependencies: "@supabase/node-fetch" "^2.6.14" -"@supabase/node-fetch@^2.6.14", "@supabase/node-fetch@2.6.15": +"@supabase/node-fetch@2.6.15", "@supabase/node-fetch@^2.6.14": version "2.6.15" resolved "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz" integrity sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ== @@ -1512,7 +1579,7 @@ dependencies: "@supabase/node-fetch" "^2.6.14" -"@supabase/supabase-js@^2.43.4", "@supabase/supabase-js@^2.45.0": +"@supabase/supabase-js@^2.45.0": version "2.45.1" resolved "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.45.1.tgz" integrity sha512-/PVe3lXmalazD8BGMIoI7+ttvT1mLXy13lNcoAPtjP1TDDY83g8csZbVR6l+0/RZtvJxl3LGXfTJT4bjWgC5Nw== @@ -1648,7 +1715,7 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": +"@types/estree@*", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -1660,11 +1727,6 @@ dependencies: "@types/unist" "*" -"@types/json-schema@^7.0.8": - version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" @@ -1689,13 +1751,20 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^20": +"@types/node@*": version "20.16.1" resolved "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz" integrity sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ== dependencies: undici-types "~6.19.2" +"@types/node@^22.7.3": + version "22.7.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.3.tgz#7ddf1ddf13078692b4cfadb835852b2a718ee1ef" + integrity sha512-qXKfhXXqGTyBskvWEzJZPUxSslAiLaB6JGP1ic/XTH9ctGgzdgYguuLP1C601aRTSDNlLb0jbKqXjZ48GNraSA== + dependencies: + undici-types "~6.19.2" + "@types/pg-pool@2.0.6": version "2.0.6" resolved "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz" @@ -1722,7 +1791,7 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@*", "@types/react-dom@^18": +"@types/react-dom@^18": version "18.3.0" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== @@ -1736,7 +1805,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^18", "@types/react@>=16.8", "@types/react@>=18": +"@types/react@*", "@types/react@^18": version "18.3.4" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz" integrity sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw== @@ -1817,137 +1886,6 @@ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz" - integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz" - integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz" - integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.12.1" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz" - integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-opt" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - "@webassemblyjs/wast-printer" "1.12.1" - -"@webassemblyjs/wasm-gen@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz" - integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz" - integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - -"@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz" - integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.12.1": - version "1.12.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz" - integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - "@xyflow/react@^12.1.0": version "12.1.1" resolved "https://registry.npmjs.org/@xyflow/react/-/react-12.1.1.tgz" @@ -1980,7 +1918,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: version "8.12.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -1992,11 +1930,6 @@ agent-base@6: dependencies: debug "4" -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -2007,16 +1940,6 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.12.5, ajv@^6.9.1: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^8.17.1: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" @@ -2248,7 +2171,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.21.10, browserslist@^4.23.1, "browserslist@>= 4.21.0": +browserslist@^4.23.1: version "4.23.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz" integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== @@ -2258,11 +2181,6 @@ browserslist@^4.21.10, browserslist@^4.23.1, "browserslist@>= 4.21.0": node-releases "^2.0.18" update-browserslist-db "^1.1.0" -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - busboy@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" @@ -2301,6 +2219,14 @@ ccount@^2.0.0: resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== +chalk@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -2318,14 +2244,6 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - character-entities-html4@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" @@ -2361,11 +2279,6 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -chrome-trace-event@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz" - integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== - cjs-module-lexer@^1.2.2: version "1.4.1" resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz" @@ -2388,16 +2301,16 @@ client-only@0.0.1: resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -clsx@^2.0.0, clsx@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - clsx@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== +clsx@^2.0.0, clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + cmdk@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz" @@ -2420,26 +2333,21 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + comma-separated-tokens@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - commander@^4.0.0: version "4.1.1" resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" @@ -2484,7 +2392,7 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3": +"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: version "3.2.4" resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== @@ -2501,7 +2409,7 @@ d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3": resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== -d3-drag@^3.0.0, "d3-drag@2 - 3": +"d3-drag@2 - 3", d3-drag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== @@ -2509,7 +2417,7 @@ d3-drag@^3.0.0, "d3-drag@2 - 3": d3-dispatch "1 - 3" d3-selection "3" -d3-ease@^3.0.1, "d3-ease@1 - 3": +"d3-ease@1 - 3", d3-ease@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== @@ -2519,7 +2427,7 @@ d3-ease@^3.0.1, "d3-ease@1 - 3": resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== -d3-interpolate@^3.0.1, "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3": +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== @@ -2542,7 +2450,7 @@ d3-scale@^4.0.2: d3-time "2.1.1 - 3" d3-time-format "2 - 4" -d3-selection@^3.0.0, "d3-selection@2 - 3", d3-selection@3: +"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== @@ -2561,14 +2469,14 @@ d3-shape@^3.1.0: dependencies: d3-time "1 - 3" -d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3": +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" -d3-timer@^3.0.1, "d3-timer@1 - 3": +"d3-timer@1 - 3", d3-timer@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== @@ -2627,11 +2535,18 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -"date-fns@^2.28.0 || ^3.0.0", date-fns@^3.6.0: +date-fns@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz" integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -2639,13 +2554,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@4: - version "4.3.7" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - decimal.js-light@^2.4.1: version "2.5.1" resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" @@ -2791,7 +2699,7 @@ emoji-regex@^9.2.2: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -enhanced-resolve@^5.12.0, enhanced-resolve@^5.17.1: +enhanced-resolve@^5.12.0: version "5.17.1" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz" integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== @@ -2898,11 +2806,6 @@ es-iterator-helpers@^1.0.19: iterator.prototype "^1.1.2" safe-array-concat "^1.1.2" -es-module-lexer@^1.2.1: - version "1.5.4" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz" - integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== - es-object-atoms@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" @@ -2994,7 +2897,7 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" -eslint-plugin-import@*, eslint-plugin-import@^2.28.1: +eslint-plugin-import@^2.28.1: version "2.29.1" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== @@ -3076,20 +2979,12 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8, eslint@^8.56.0: +eslint@^8: version "8.57.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== @@ -3156,11 +3051,6 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" @@ -3186,11 +3076,6 @@ eventemitter3@^4.0.1: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - exenv@^1.2.0: version "1.2.2" resolved "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz" @@ -3300,7 +3185,7 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2, fsevents@2.3.2: +fsevents@2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -3362,7 +3247,7 @@ get-tsconfig@^4.5.0: dependencies: resolve-pkg-maps "^1.0.0" -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3376,17 +3261,16 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== +glob@10.3.10: + version "10.3.10" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" glob@^10.3.10, glob@^10.4.1: version "10.4.5" @@ -3422,17 +3306,6 @@ glob@^9.3.2: minipass "^4.2.4" path-scurry "^1.6.1" -glob@10.3.10: - version "10.3.10" - resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -3472,7 +3345,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4: +graceful-fs@^4.2.11, graceful-fs@^4.2.4: 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== @@ -3907,15 +3780,6 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jiti@^1.21.0: version "1.21.6" resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz" @@ -3943,11 +3807,6 @@ json-buffer@3.0.1: resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -4027,11 +3886,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -4078,13 +3932,6 @@ lucide-react@^0.407.0: resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.407.0.tgz" integrity sha512-+dRIu9Sry+E8wPF9+sY5eKld2omrU4X5IKXxrgqBt+o11IIHVU0QOfNoVWFuj0ZRDrxr4Wci26o2mKZqLGE0lA== -magic-string@^0.30.3: - version "0.30.11" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz" - integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - magic-string@0.30.8: version "0.30.8" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz" @@ -4092,6 +3939,13 @@ magic-string@0.30.8: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +magic-string@^0.30.3: + version "0.30.11" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz" + integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + mdast-util-from-markdown@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz" @@ -4197,11 +4051,6 @@ mdast-util-to-string@^4.0.0: dependencies: "@types/mdast" "^4.0.0" -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" @@ -4409,17 +4258,12 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: - mime-db "1.52.0" + brace-expansion "^2.0.1" minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" @@ -4435,27 +4279,13 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1: +minimatch@^9.0.1, minimatch@^9.0.4: version "9.0.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" @@ -4505,17 +4335,12 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - next-themes@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz" integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== -"next@^13.0.0 || ^14.0.0", "next@^13.2.0 || ^14.0 || ^15.0.0-rc.0", next@^14.2.13: +next@^14.2.13: version "14.2.13" resolved "https://registry.npmjs.org/next/-/next-14.2.13.tgz" integrity sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg== @@ -4826,15 +4651,6 @@ postcss-value-parser@^4.0.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8, postcss@^8.0.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9: - version "8.4.41" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz" - integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" - postcss@8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" @@ -4844,6 +4660,15 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8, postcss@^8.4.23: + version "8.4.41" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" @@ -4876,7 +4701,7 @@ prettier-plugin-tailwindcss@^0.6.6: resolved "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.6.tgz" integrity sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng== -prettier@^3.0, prettier@^3.3.3: +prettier@^3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== @@ -4915,19 +4740,12 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - react-day-picker@^8.10.1: version "8.10.1" resolved "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz" integrity sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA== -"react-dom@^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8 || ^17 || ^18", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", react-dom@^18, react-dom@^18.0.0, react-dom@^18.2.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=17: +react-dom@^18: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -4935,7 +4753,7 @@ react-day-picker@^8.10.1: loose-envify "^1.1.0" scheduler "^0.23.2" -react-hook-form@^7.0.0, react-hook-form@^7.52.1: +react-hook-form@^7.52.1: version "7.52.2" resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.52.2.tgz" integrity sha512-pqfPEbERnxxiNMPd0bzmt1tuaPcVccywFDpyk2uV5xCIBphHV5T8SVnX9/o3kplPE1zzKt77+YIoq+EMwJp56A== @@ -5046,7 +4864,7 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -react@*, "react@^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.14.0 || 17.x || 18.x || 19.x", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.x || ^17.x || ^18.x", react@^18, react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=17, react@>=18: +react@^18: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -5161,7 +4979,7 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.22.8, resolve@1.22.8: +resolve@1.22.8, resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.22.8: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -5191,7 +5009,7 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.68.0||^3.0.0||^4.0.0, rollup@3.29.5: +rollup@3.29.5: version "3.29.5" resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz" integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w== @@ -5215,11 +5033,6 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" @@ -5236,15 +5049,6 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" -schema-utils@^3.1.1, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" @@ -5255,13 +5059,6 @@ semver@^7.5.2, semver@^7.5.4: resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -serialize-javascript@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" @@ -5335,19 +5132,6 @@ source-map-js@^1.0.2, source-map-js@^1.2.0: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" @@ -5541,13 +5325,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -5563,7 +5340,7 @@ tailwindcss-animate@^1.0.7: resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== -tailwindcss@^3.4.1, "tailwindcss@>=3.0.0 || insiders": +tailwindcss@^3.4.1: version "3.4.10" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz" integrity sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w== @@ -5591,32 +5368,11 @@ tailwindcss@^3.4.1, "tailwindcss@>=3.0.0 || insiders": resolve "^1.22.2" sucrase "^3.32.0" -tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -terser-webpack-plugin@^5.3.10: - version "5.3.10" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.20" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.26.0" - -terser@^5.26.0: - version "5.34.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.34.0.tgz" - integrity sha512-y5NUX+U9HhVsK/zihZwoq4r9dICLyV2jXGOriDAVOeKhq3LKVjgJbGO90FisozXLlJfvjHqgckGmJFBb9KYoWQ== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -5759,7 +5515,7 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5, typescript@^5.0.0, typescript@>=3.3.1, typescript@>=4.2.0: +typescript@^5: version "5.5.4" resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== @@ -5942,14 +5698,6 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack@^2.4.1: - version "2.4.2" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz" - integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -5965,35 +5713,6 @@ webpack-virtual-modules@^0.5.0: resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz" integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== -webpack@^5.1.0, webpack@>=4.40.0, webpack@5.94.0: - version "5.94.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz" - integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== - dependencies: - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-attributes "^1.9.5" - browserslist "^4.21.10" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.1" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.10" - watchpack "^2.4.1" - webpack-sources "^3.2.3" - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" diff --git a/autogpt_platform/infra/helm/autogpt-builder/values.dev.yaml b/autogpt_platform/infra/helm/autogpt-builder/values.dev.yaml index 696d79f0e7..9c81de1db7 100644 --- a/autogpt_platform/infra/helm/autogpt-builder/values.dev.yaml +++ b/autogpt_platform/infra/helm/autogpt-builder/values.dev.yaml @@ -61,4 +61,5 @@ env: GOOGLE_CLIENT_ID: "" GOOGLE_CLIENT_SECRET: "" NEXT_PUBLIC_SUPABASE_URL: "" - NEXT_PUBLIC_SUPABASE_ANON_KEY: "" \ No newline at end of file + NEXT_PUBLIC_SUPABASE_ANON_KEY: "" + NEXT_PUBLIC_BEHAVE_AS: "CLOUD" \ No newline at end of file diff --git a/autogpt_platform/market/.env.example b/autogpt_platform/market/.env.example index 21ade826ff..afaed399ef 100644 --- a/autogpt_platform/market/.env.example +++ b/autogpt_platform/market/.env.example @@ -6,4 +6,5 @@ DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@localhost:${DB_PORT}/${DB_NAME} SENTRY_DSN=https://11d0640fef35640e0eb9f022eb7d7626@o4505260022104064.ingest.us.sentry.io/4507890252447744 ENABLE_AUTH=true -SUPABASE_JWT_SECRET=our-super-secret-jwt-token-with-at-least-32-characters-long \ No newline at end of file +SUPABASE_JWT_SECRET=our-super-secret-jwt-token-with-at-least-32-characters-long +BACKEND_CORS_ALLOW_ORIGINS="http://localhost:3000,http://127.0.0.1:3000" \ No newline at end of file From 8803740d4747872a52cedfa8bc8e2269deeaca3b Mon Sep 17 00:00:00 2001 From: Reinier van der Leer Date: Tue, 1 Oct 2024 16:08:42 +0200 Subject: [PATCH 027/155] refactor(blocks): Reassign non-random IDs (#8229) - refactor(blocks): Assign new IDs to 13 blocks - Create DB migration to update block IDs in existing DB entities - feat(frontend): Add `updateBlockIDs` "middleware" to `AgentImportForm` loader in front end --- .../backend/backend/blocks/basic.py | 4 +- .../backend/backend/blocks/discord.py | 4 +- .../backend/backend/blocks/email_block.py | 2 +- .../backend/backend/blocks/iteration.py | 2 +- .../backend/backend/blocks/llm.py | 4 +- .../backend/backend/blocks/rss.py | 2 +- .../backend/backend/blocks/search.py | 6 +-- .../backend/backend/blocks/time_blocks.py | 2 +- .../Discord Bot Chat To LLM_v5.json | 4 +- .../Discord Chatbot with History_v145.json | 6 +-- .../Discord Search Bot_v17.json | 6 +-- .../graph_templates/Medium Blogger_v28.json | 6 +-- .../migration.sql | 18 +++++++++ .../src/components/agent-import-form.tsx | 39 +++++++++++++++++++ 14 files changed, 81 insertions(+), 24 deletions(-) create mode 100644 autogpt_platform/backend/migrations/20240930151406_reassign_block_ids/migration.sql diff --git a/autogpt_platform/backend/backend/blocks/basic.py b/autogpt_platform/backend/backend/blocks/basic.py index b86d8d872b..095c3b0e92 100644 --- a/autogpt_platform/backend/backend/blocks/basic.py +++ b/autogpt_platform/backend/backend/blocks/basic.py @@ -88,7 +88,7 @@ class FindInDictionaryBlock(Block): def __init__(self): super().__init__( - id="b2g2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6", + id="0e50422c-6dee-4145-83d6-3a5a392f65de", description="Lookup the given key in the input dictionary/object/list and return the value.", input_schema=FindInDictionaryBlock.Input, output_schema=FindInDictionaryBlock.Output, @@ -429,7 +429,7 @@ class NoteBlock(Block): def __init__(self): super().__init__( - id="31d1064e-7446-4693-o7d4-65e5ca9110d1", + id="cc10ff7b-7753-4ff2-9af6-9399b1a7eddc", description="This block is used to display a sticky note with the given text.", categories={BlockCategory.BASIC}, input_schema=NoteBlock.Input, diff --git a/autogpt_platform/backend/backend/blocks/discord.py b/autogpt_platform/backend/backend/blocks/discord.py index 8565684a07..cd350a6199 100644 --- a/autogpt_platform/backend/backend/blocks/discord.py +++ b/autogpt_platform/backend/backend/blocks/discord.py @@ -28,7 +28,7 @@ class ReadDiscordMessagesBlock(Block): def __init__(self): super().__init__( - id="d3f4g5h6-1i2j-3k4l-5m6n-7o8p9q0r1s2t", # Unique ID for the node + id="df06086a-d5ac-4abb-9996-2ad0acb2eff7", input_schema=ReadDiscordMessagesBlock.Input, # Assign input schema output_schema=ReadDiscordMessagesBlock.Output, # Assign output schema description="Reads messages from a Discord channel using a bot token.", @@ -146,7 +146,7 @@ class SendDiscordMessageBlock(Block): def __init__(self): super().__init__( - id="h1i2j3k4-5l6m-7n8o-9p0q-r1s2t3u4v5w6", # Unique ID for the node + id="d0822ab5-9f8a-44a3-8971-531dd0178b6b", input_schema=SendDiscordMessageBlock.Input, # Assign input schema output_schema=SendDiscordMessageBlock.Output, # Assign output schema description="Sends a message to a Discord channel using a bot token.", diff --git a/autogpt_platform/backend/backend/blocks/email_block.py b/autogpt_platform/backend/backend/blocks/email_block.py index edfb2f391b..96e69e1ffc 100644 --- a/autogpt_platform/backend/backend/blocks/email_block.py +++ b/autogpt_platform/backend/backend/blocks/email_block.py @@ -43,7 +43,7 @@ class SendEmailBlock(Block): def __init__(self): super().__init__( - id="a1234567-89ab-cdef-0123-456789abcdef", + id="4335878a-394e-4e67-adf2-919877ff49ae", description="This block sends an email using the provided SMTP credentials.", categories={BlockCategory.OUTPUT}, input_schema=SendEmailBlock.Input, diff --git a/autogpt_platform/backend/backend/blocks/iteration.py b/autogpt_platform/backend/backend/blocks/iteration.py index 05ca5f5ed7..247a92d3c7 100644 --- a/autogpt_platform/backend/backend/blocks/iteration.py +++ b/autogpt_platform/backend/backend/blocks/iteration.py @@ -19,7 +19,7 @@ class StepThroughItemsBlock(Block): def __init__(self): super().__init__( - id="f8e7d6c5-b4a3-2c1d-0e9f-8g7h6i5j4k3l", + id="f66a3543-28d3-4ab5-8945-9b336371e2ce", input_schema=StepThroughItemsBlock.Input, output_schema=StepThroughItemsBlock.Output, categories={BlockCategory.LOGIC}, diff --git a/autogpt_platform/backend/backend/blocks/llm.py b/autogpt_platform/backend/backend/blocks/llm.py index 868244cd8e..19d2e9621c 100644 --- a/autogpt_platform/backend/backend/blocks/llm.py +++ b/autogpt_platform/backend/backend/blocks/llm.py @@ -392,7 +392,7 @@ class AITextSummarizerBlock(Block): def __init__(self): super().__init__( - id="c3d4e5f6-7g8h-9i0j-1k2l-m3n4o5p6q7r8", + id="a0a69be1-4528-491c-a85a-a4ab6873e3f0", description="Utilize a Large Language Model (LLM) to summarize a long text.", categories={BlockCategory.AI, BlockCategory.TEXT}, input_schema=AITextSummarizerBlock.Input, @@ -535,7 +535,7 @@ class AIConversationBlock(Block): def __init__(self): super().__init__( - id="c3d4e5f6-g7h8-i9j0-k1l2-m3n4o5p6q7r8", + id="32a87eab-381e-4dd4-bdb8-4c47151be35a", description="Advanced LLM call that takes a list of messages and sends them to the language model.", categories={BlockCategory.AI}, input_schema=AIConversationBlock.Input, diff --git a/autogpt_platform/backend/backend/blocks/rss.py b/autogpt_platform/backend/backend/blocks/rss.py index 3dd570385b..9a5a17ebee 100644 --- a/autogpt_platform/backend/backend/blocks/rss.py +++ b/autogpt_platform/backend/backend/blocks/rss.py @@ -43,7 +43,7 @@ class ReadRSSFeedBlock(Block): def __init__(self): super().__init__( - id="c6731acb-4105-4zp1-bc9b-03d0036h370g", + id="5ebe6768-8e5d-41e3-9134-1c7bd89a8d52", input_schema=ReadRSSFeedBlock.Input, output_schema=ReadRSSFeedBlock.Output, description="Reads RSS feed entries from a given URL.", diff --git a/autogpt_platform/backend/backend/blocks/search.py b/autogpt_platform/backend/backend/blocks/search.py index e51ff4013a..f8fc783e56 100644 --- a/autogpt_platform/backend/backend/blocks/search.py +++ b/autogpt_platform/backend/backend/blocks/search.py @@ -25,7 +25,7 @@ class GetWikipediaSummaryBlock(Block, GetRequest): def __init__(self): super().__init__( - id="h5e7f8g9-1b2c-3d4e-5f6g-7h8i9j0k1l2m", + id="f5b0f5d0-1862-4d61-94be-3ad0fa772760", description="This block fetches the summary of a given topic from Wikipedia.", categories={BlockCategory.SEARCH}, input_schema=GetWikipediaSummaryBlock.Input, @@ -62,7 +62,7 @@ class SearchTheWebBlock(Block, GetRequest): def __init__(self): super().__init__( - id="b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7", + id="87840993-2053-44b7-8da4-187ad4ee518c", description="This block searches the internet for the given search query.", categories={BlockCategory.SEARCH}, input_schema=SearchTheWebBlock.Input, @@ -109,7 +109,7 @@ class ExtractWebsiteContentBlock(Block, GetRequest): def __init__(self): super().__init__( - id="a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6", # Unique ID for the block + id="436c3984-57fd-4b85-8e9a-459b356883bd", description="This block scrapes the content from the given web URL.", categories={BlockCategory.SEARCH}, input_schema=ExtractWebsiteContentBlock.Input, diff --git a/autogpt_platform/backend/backend/blocks/time_blocks.py b/autogpt_platform/backend/backend/blocks/time_blocks.py index 338ee88a42..9e95d428b9 100644 --- a/autogpt_platform/backend/backend/blocks/time_blocks.py +++ b/autogpt_platform/backend/backend/blocks/time_blocks.py @@ -77,7 +77,7 @@ class GetCurrentDateAndTimeBlock(Block): def __init__(self): super().__init__( - id="b29c1b50-5d0e-4d9f-8f9d-1b0e6fcbf0h2", + id="716a67b3-6760-42e7-86dc-18645c6e00fc", description="This block outputs the current date and time.", categories={BlockCategory.TEXT}, input_schema=GetCurrentDateAndTimeBlock.Input, diff --git a/autogpt_platform/backend/graph_templates/Discord Bot Chat To LLM_v5.json b/autogpt_platform/backend/graph_templates/Discord Bot Chat To LLM_v5.json index b6ea9e6286..34cdfa7ae0 100644 --- a/autogpt_platform/backend/graph_templates/Discord Bot Chat To LLM_v5.json +++ b/autogpt_platform/backend/graph_templates/Discord Bot Chat To LLM_v5.json @@ -8,7 +8,7 @@ "nodes": [ { "id": "b8138bca-7892-42c2-9594-a845d3483413", - "block_id": "d3f4g5h6-1i2j-3k4l-5m6n-7o8p9q0r1s2t", + "block_id": "df06086a-d5ac-4abb-9996-2ad0acb2eff7", "input_default": {}, "metadata": { "position": { @@ -59,7 +59,7 @@ }, { "id": "dda2d061-2ef9-4dc5-9433-918c8395a4ac", - "block_id": "h1i2j3k4-5l6m-7n8o-9p0q-r1s2t3u4v5w6", + "block_id": "d0822ab5-9f8a-44a3-8971-531dd0178b6b", "input_default": {}, "metadata": { "position": { diff --git a/autogpt_platform/backend/graph_templates/Discord Chatbot with History_v145.json b/autogpt_platform/backend/graph_templates/Discord Chatbot with History_v145.json index da36ec00de..0da2a83684 100644 --- a/autogpt_platform/backend/graph_templates/Discord Chatbot with History_v145.json +++ b/autogpt_platform/backend/graph_templates/Discord Chatbot with History_v145.json @@ -110,7 +110,7 @@ }, { "id": "b45cfa51-5ead-4621-9f1c-f847dfea3e4c", - "block_id": "d3f4g5h6-1i2j-3k4l-5m6n-7o8p9q0r1s2t", + "block_id": "df06086a-d5ac-4abb-9996-2ad0acb2eff7", "input_default": {}, "metadata": { "position": { @@ -146,7 +146,7 @@ }, { "id": "8eedcf71-1146-4f54-b522-bf9b6e2d26b2", - "block_id": "h1i2j3k4-5l6m-7n8o-9p0q-r1s2t3u4v5w6", + "block_id": "d0822ab5-9f8a-44a3-8971-531dd0178b6b", "input_default": {}, "metadata": { "position": { @@ -197,7 +197,7 @@ }, { "id": "a568daee-45d2-4429-bf33-cbe9e1261f7b", - "block_id": "c3d4e5f6-g7h8-i9j0-k1l2-m3n4o5p6q7r8", + "block_id": "32a87eab-381e-4dd4-bdb8-4c47151be35a", "input_default": { "model": "llama-3.1-70b-versatile", "max_tokens": 2000 diff --git a/autogpt_platform/backend/graph_templates/Discord Search Bot_v17.json b/autogpt_platform/backend/graph_templates/Discord Search Bot_v17.json index 7de268a970..366fcf7e62 100644 --- a/autogpt_platform/backend/graph_templates/Discord Search Bot_v17.json +++ b/autogpt_platform/backend/graph_templates/Discord Search Bot_v17.json @@ -8,7 +8,7 @@ "nodes": [ { "id": "60ba4aac-1751-4be7-8745-1bd32191d4a2", - "block_id": "d3f4g5h6-1i2j-3k4l-5m6n-7o8p9q0r1s2t", + "block_id": "df06086a-d5ac-4abb-9996-2ad0acb2eff7", "input_default": {}, "metadata": { "position": { @@ -45,7 +45,7 @@ }, { "id": "5658c4f7-8e67-4d30-93f2-157bdbd3ef87", - "block_id": "b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7", + "block_id": "87840993-2053-44b7-8da4-187ad4ee518c", "input_default": {}, "metadata": { "position": { @@ -118,7 +118,7 @@ }, { "id": "f3d62f22-d193-4f04-85d2-164200fca4c0", - "block_id": "h1i2j3k4-5l6m-7n8o-9p0q-r1s2t3u4v5w6", + "block_id": "d0822ab5-9f8a-44a3-8971-531dd0178b6b", "input_default": {}, "metadata": { "position": { diff --git a/autogpt_platform/backend/graph_templates/Medium Blogger_v28.json b/autogpt_platform/backend/graph_templates/Medium Blogger_v28.json index 69040bcb1e..2335f1684c 100644 --- a/autogpt_platform/backend/graph_templates/Medium Blogger_v28.json +++ b/autogpt_platform/backend/graph_templates/Medium Blogger_v28.json @@ -8,7 +8,7 @@ "nodes": [ { "id": "382efac9-3def-4baf-b16a-d6d2512a5c8b", - "block_id": "b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7", + "block_id": "87840993-2053-44b7-8da4-187ad4ee518c", "input_default": { "query": "19th July 2024 Microsoft Blackout" }, @@ -44,7 +44,7 @@ }, { "id": "0cd8f670-8956-4942-ba28-aee732ec783f", - "block_id": "b2g2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6", + "block_id": "0e50422c-6dee-4145-83d6-3a5a392f65de", "input_default": { "key": "TITLE" }, @@ -57,7 +57,7 @@ }, { "id": "4a15b6b9-036d-43d3-915a-7e931fbc6522", - "block_id": "b2g2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6", + "block_id": "0e50422c-6dee-4145-83d6-3a5a392f65de", "input_default": { "key": "CONTENT" }, diff --git a/autogpt_platform/backend/migrations/20240930151406_reassign_block_ids/migration.sql b/autogpt_platform/backend/migrations/20240930151406_reassign_block_ids/migration.sql new file mode 100644 index 0000000000..c6f7ae6f33 --- /dev/null +++ b/autogpt_platform/backend/migrations/20240930151406_reassign_block_ids/migration.sql @@ -0,0 +1,18 @@ +-- Update AgentBlock IDs: this should cascade to the AgentNode and UserBlockCredit tables +UPDATE "AgentBlock" +SET "id" = CASE + WHEN "id" = 'a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6' THEN '436c3984-57fd-4b85-8e9a-459b356883bd' + WHEN "id" = 'b2g2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6' THEN '0e50422c-6dee-4145-83d6-3a5a392f65de' + WHEN "id" = 'c3d4e5f6-7g8h-9i0j-1k2l-m3n4o5p6q7r8' THEN 'a0a69be1-4528-491c-a85a-a4ab6873e3f0' + WHEN "id" = 'c3d4e5f6-g7h8-i9j0-k1l2-m3n4o5p6q7r8' THEN '32a87eab-381e-4dd4-bdb8-4c47151be35a' + WHEN "id" = 'b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7' THEN '87840993-2053-44b7-8da4-187ad4ee518c' + WHEN "id" = 'h1i2j3k4-5l6m-7n8o-9p0q-r1s2t3u4v5w6' THEN 'd0822ab5-9f8a-44a3-8971-531dd0178b6b' + WHEN "id" = 'd3f4g5h6-1i2j-3k4l-5m6n-7o8p9q0r1s2t' THEN 'df06086a-d5ac-4abb-9996-2ad0acb2eff7' + WHEN "id" = 'h5e7f8g9-1b2c-3d4e-5f6g-7h8i9j0k1l2m' THEN 'f5b0f5d0-1862-4d61-94be-3ad0fa772760' + WHEN "id" = 'a1234567-89ab-cdef-0123-456789abcdef' THEN '4335878a-394e-4e67-adf2-919877ff49ae' + WHEN "id" = 'f8e7d6c5-b4a3-2c1d-0e9f-8g7h6i5j4k3l' THEN 'f66a3543-28d3-4ab5-8945-9b336371e2ce' + WHEN "id" = 'b29c1b50-5d0e-4d9f-8f9d-1b0e6fcbf0h2' THEN '716a67b3-6760-42e7-86dc-18645c6e00fc' + WHEN "id" = '31d1064e-7446-4693-o7d4-65e5ca9110d1' THEN 'cc10ff7b-7753-4ff2-9af6-9399b1a7eddc' + WHEN "id" = 'c6731acb-4105-4zp1-bc9b-03d0036h370g' THEN '5ebe6768-8e5d-41e3-9134-1c7bd89a8d52' + ELSE "id" +END; diff --git a/autogpt_platform/frontend/src/components/agent-import-form.tsx b/autogpt_platform/frontend/src/components/agent-import-form.tsx index 4261ed6350..64ca5f8a31 100644 --- a/autogpt_platform/frontend/src/components/agent-import-form.tsx +++ b/autogpt_platform/frontend/src/components/agent-import-form.tsx @@ -33,6 +33,44 @@ const formSchema = z.object({ importAsTemplate: z.boolean(), }); +function updateBlockIDs(graph: Graph) { + // https://github.com/Significant-Gravitas/AutoGPT/issues/8223 + const updatedBlockIDMap: Record = { + "a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6": + "436c3984-57fd-4b85-8e9a-459b356883bd", + "b2g2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6": + "0e50422c-6dee-4145-83d6-3a5a392f65de", + "c3d4e5f6-7g8h-9i0j-1k2l-m3n4o5p6q7r8": + "a0a69be1-4528-491c-a85a-a4ab6873e3f0", + "c3d4e5f6-g7h8-i9j0-k1l2-m3n4o5p6q7r8": + "32a87eab-381e-4dd4-bdb8-4c47151be35a", + "b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7": + "87840993-2053-44b7-8da4-187ad4ee518c", + "h1i2j3k4-5l6m-7n8o-9p0q-r1s2t3u4v5w6": + "d0822ab5-9f8a-44a3-8971-531dd0178b6b", + "d3f4g5h6-1i2j-3k4l-5m6n-7o8p9q0r1s2t": + "df06086a-d5ac-4abb-9996-2ad0acb2eff7", + "h5e7f8g9-1b2c-3d4e-5f6g-7h8i9j0k1l2m": + "f5b0f5d0-1862-4d61-94be-3ad0fa772760", + "a1234567-89ab-cdef-0123-456789abcdef": + "4335878a-394e-4e67-adf2-919877ff49ae", + "f8e7d6c5-b4a3-2c1d-0e9f-8g7h6i5j4k3l": + "f66a3543-28d3-4ab5-8945-9b336371e2ce", + "b29c1b50-5d0e-4d9f-8f9d-1b0e6fcbf0h2": + "716a67b3-6760-42e7-86dc-18645c6e00fc", + "31d1064e-7446-4693-o7d4-65e5ca9110d1": + "cc10ff7b-7753-4ff2-9af6-9399b1a7eddc", + "c6731acb-4105-4zp1-bc9b-03d0036h370g": + "5ebe6768-8e5d-41e3-9134-1c7bd89a8d52", + }; + graph.nodes + .filter((node) => node.block_id in updatedBlockIDMap) + .forEach((node) => { + node.block_id = updatedBlockIDMap[node.block_id]; + }); + return graph; +} + export const AgentImportForm: React.FC< React.FormHTMLAttributes > = ({ className, ...props }) => { @@ -116,6 +154,7 @@ export const AgentImportForm: React.FC< ); } const agent = obj as Graph; + updateBlockIDs(agent); setAgentObject(agent); form.setValue("agentName", agent.name); form.setValue("agentDescription", agent.description); From f8928941938bf11267f3a8777292989e8e3cc013 Mon Sep 17 00:00:00 2001 From: Krzysztof Czerwinski <34861343+kcze@users.noreply.github.com> Date: Tue, 1 Oct 2024 15:42:14 +0100 Subject: [PATCH 028/155] docs(server): Request to use UUID generators for new block ids (#8241) --- docs/content/server/new_blocks.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/content/server/new_blocks.md b/docs/content/server/new_blocks.md index 956d241ed7..ae14f0bc38 100644 --- a/docs/content/server/new_blocks.md +++ b/docs/content/server/new_blocks.md @@ -49,13 +49,15 @@ Follow these steps to create and test a new block: 4. **Implement the `__init__` method, including test data and mocks:** + !!! important + Use UUID generator (e.g. https://www.uuidgenerator.net/) for every new block `id` and *do not* make up your own. Alternatively, you can run this python code to generate an uuid: `print(__import__('uuid').uuid4())` + ```python def __init__(self): super().__init__( # Unique ID for the block, used across users for templates - # you can generate this with this python one liner - # print(__import__('uuid').uuid4()) - id="h5e7f8g9-1b2c-3d4e-5f6g-7h8i9j0k1l2m", + # If you are an AI leave it as is or change to "generate-proper-uuid" + id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", input_schema=WikipediaSummaryBlock.Input, # Assign input schema output_schema=WikipediaSummaryBlock.Output, # Assign output schema From 9748cd08bf2e48e7a9925f52d43ea02f789d2bf9 Mon Sep 17 00:00:00 2001 From: Nicholas Tindle Date: Wed, 2 Oct 2024 07:45:44 -0500 Subject: [PATCH 029/155] feat(market): swap to prisma direct query (#8246) * feat(market): swap to prisma direct query * add schema --------- Co-authored-by: Aarushi --- autogpt_platform/market/market/db.py | 60 +++++++++++++--------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/autogpt_platform/market/market/db.py b/autogpt_platform/market/market/db.py index cbc8d59c04..5f0d983891 100644 --- a/autogpt_platform/market/market/db.py +++ b/autogpt_platform/market/market/db.py @@ -593,24 +593,24 @@ async def get_not_featured_agents( agents = await prisma.client.get_client().query_raw( query=f""" SELECT - "Agents".id, - "Agents"."createdAt", - "Agents"."updatedAt", - "Agents".version, - "Agents".name, - LEFT("Agents".description, 500) AS description, - "Agents".author, - "Agents".keywords, - "Agents".categories, - "Agents".graph, - "Agents"."submissionStatus", - "Agents"."submissionDate", - "Agents".search::text AS search - FROM "Agents" - LEFT JOIN "FeaturedAgent" ON "Agents"."id" = "FeaturedAgent"."agentId" - WHERE ("FeaturedAgent"."agentId" IS NULL OR "FeaturedAgent"."featuredCategories" = '{{}}') - AND "Agents"."submissionStatus" = 'APPROVED' - ORDER BY "Agents"."createdAt" DESC + "market"."Agents".id, + "market"."Agents"."createdAt", + "market"."Agents"."updatedAt", + "market"."Agents".version, + "market"."Agents".name, + LEFT("market"."Agents".description, 500) AS description, + "market"."Agents".author, + "market"."Agents".keywords, + "market"."Agents".categories, + "market"."Agents".graph, + "market"."Agents"."submissionStatus", + "market"."Agents"."submissionDate", + "market"."Agents".search::text AS search + FROM "market"."Agents" + LEFT JOIN "market"."FeaturedAgent" ON "market"."Agents"."id" = "market"."FeaturedAgent"."agentId" + WHERE ("market"."FeaturedAgent"."agentId" IS NULL OR "market"."FeaturedAgent"."featuredCategories" = '{{}}') + AND "market"."Agents"."submissionStatus" = 'APPROVED' + ORDER BY "market"."Agents"."createdAt" DESC LIMIT {page_size} OFFSET {page_size * (page - 1)} """, model=prisma.models.Agents, @@ -630,24 +630,20 @@ async def get_all_categories() -> market.model.CategoriesResponse: CategoriesResponse: A list of unique categories. """ try: - categories = await prisma.client.get_client().query_first( - query=""" -SELECT ARRAY_AGG(DISTINCT category ORDER BY category) AS unique_categories -FROM ( - SELECT UNNEST(categories) AS category - FROM "Agents" -) subquery; -""", - model=market.model.CategoriesResponse, - ) - if not categories: - return market.model.CategoriesResponse(unique_categories=[]) + agents = await prisma.models.Agents.prisma().find_many(distinct=["categories"]) - return categories + # Aggregate categories on the Python side + all_categories = set() + for agent in agents: + all_categories.update(agent.categories) + + unique_categories = sorted(list(all_categories)) + + return market.model.CategoriesResponse(unique_categories=unique_categories) except prisma.errors.PrismaError as e: raise AgentQueryError(f"Database query failed: {str(e)}") except Exception as e: - # raise AgentQueryError(f"Unexpected error occurred: {str(e)}") + # Return an empty list of categories in case of unexpected errors return market.model.CategoriesResponse(unique_categories=[]) From 24cc5131d74b2e55f7b02f6c60a90a15219dd44b Mon Sep 17 00:00:00 2001 From: vishesh10 Date: Wed, 2 Oct 2024 20:03:05 +0530 Subject: [PATCH 030/155] refactor(backend): Replace deprecated event hooks with lifecycle handler (#8092) Co-authored-by: Reinier van der Leer --- .../backend/backend/server/ws_api.py | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/autogpt_platform/backend/backend/server/ws_api.py b/autogpt_platform/backend/backend/server/ws_api.py index da941233d0..91267602d9 100644 --- a/autogpt_platform/backend/backend/server/ws_api.py +++ b/autogpt_platform/backend/backend/server/ws_api.py @@ -1,5 +1,6 @@ import asyncio import logging +from contextlib import asynccontextmanager import uvicorn from autogpt_libs.auth import parse_jwt_token @@ -16,7 +17,17 @@ from backend.util.settings import Config, Settings logger = logging.getLogger(__name__) settings = Settings() -app = FastAPI() + +@asynccontextmanager +async def lifespan(app: FastAPI): + await event_queue.connect() + manager = get_connection_manager() + asyncio.create_task(event_broadcaster(manager)) + yield + await event_queue.close() + + +app = FastAPI(lifespan=lifespan) event_queue = AsyncRedisEventQueue() _connection_manager = None @@ -37,18 +48,6 @@ def get_connection_manager(): return _connection_manager -@app.on_event("startup") -async def startup_event(): - await event_queue.connect() - manager = get_connection_manager() - asyncio.create_task(event_broadcaster(manager)) - - -@app.on_event("shutdown") -async def shutdown_event(): - await event_queue.close() - - async def event_broadcaster(manager: ConnectionManager): while True: event = await event_queue.get() From 723055ce1d9fe319baeb6088ba93e51e73652ba8 Mon Sep 17 00:00:00 2001 From: Toran Bruce Richards Date: Wed, 2 Oct 2024 17:26:32 +0100 Subject: [PATCH 031/155] feat(blocks): Add text decoder block (#8248) * Refactor search.py: Add option for raw content scraping in ExtractWebsiteContentBlock * Add TextDecoderBlock for decoding escape sequences in text --- .../backend/backend/blocks/decoder_block.py | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 autogpt_platform/backend/backend/blocks/decoder_block.py diff --git a/autogpt_platform/backend/backend/blocks/decoder_block.py b/autogpt_platform/backend/backend/blocks/decoder_block.py new file mode 100644 index 0000000000..fb23ef2c56 --- /dev/null +++ b/autogpt_platform/backend/backend/blocks/decoder_block.py @@ -0,0 +1,42 @@ +import codecs + +from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema +from backend.data.model import SchemaField + + +class TextDecoderBlock(Block): + class Input(BlockSchema): + text: str = SchemaField( + description="A string containing escaped characters to be decoded", + placeholder='Your entire text block with \\n and \\" escaped characters', + ) + + class Output(BlockSchema): + decoded_text: str = SchemaField( + description="The decoded text with escape sequences processed" + ) + + def __init__(self): + super().__init__( + id="2570e8fe-8447-43ed-84c7-70d657923231", + description="Decodes a string containing escape sequences into actual text", + categories={BlockCategory.TEXT}, + input_schema=TextDecoderBlock.Input, + output_schema=TextDecoderBlock.Output, + test_input={"text": """Hello\nWorld!\nThis is a \"quoted\" string."""}, + test_output=[ + ( + "decoded_text", + """Hello +World! +This is a "quoted" string.""", + ) + ], + ) + + def run(self, input_data: Input, **kwargs) -> BlockOutput: + try: + decoded_text = codecs.decode(input_data.text, "unicode_escape") + yield "decoded_text", decoded_text + except Exception as e: + yield "error", f"Error decoding text: {str(e)}" From 78fe578177cef10ab69680a762dae6f18f50f0be Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Wed, 2 Oct 2024 22:57:13 +0200 Subject: [PATCH 032/155] feat(platform): Add implicit typing conversion of nested data-structure (#8231) --- autogpt_platform/backend/backend/util/type.py | 93 ++++++++++++++----- .../backend/test/util/test_type.py | 3 +- 2 files changed, 73 insertions(+), 23 deletions(-) diff --git a/autogpt_platform/backend/backend/util/type.py b/autogpt_platform/backend/backend/util/type.py index 379526f87f..9c267aba2a 100644 --- a/autogpt_platform/backend/backend/util/type.py +++ b/autogpt_platform/backend/backend/util/type.py @@ -1,5 +1,5 @@ import json -from typing import Any, Type, TypeVar, get_origin +from typing import Any, Type, TypeVar, get_args, get_origin class ConversionError(Exception): @@ -103,26 +103,75 @@ def __convert_bool(value: Any) -> bool: def convert(value: Any, target_type: Type): - target_type = get_origin(target_type) or target_type - if target_type not in [list, dict, tuple, str, set, int, float, bool]: + origin = get_origin(target_type) + args = get_args(target_type) + if origin is None: + origin = target_type + if origin not in [list, dict, tuple, str, set, int, float, bool]: return value - if isinstance(value, target_type): - return value - if target_type is list: - return __convert_list(value) - elif target_type is dict: - return __convert_dict(value) - elif target_type is tuple: - return __convert_tuple(value) - elif target_type is str: - return __convert_str(value) - elif target_type is set: - return __convert_set(value) - elif target_type is int: - return __convert_num(value, int) - elif target_type is float: - return __convert_num(value, float) - elif target_type is bool: - return __convert_bool(value) + + # Handle the case when value is already of the target type + if isinstance(value, origin): + if not args: + return value + else: + # Need to convert elements + if origin is list: + return [convert(v, args[0]) for v in value] + elif origin is tuple: + # Tuples can have multiple types + if len(args) == 1: + return tuple(convert(v, args[0]) for v in value) + else: + return tuple(convert(v, t) for v, t in zip(value, args)) + elif origin is dict: + key_type, val_type = args + return { + convert(k, key_type): convert(v, val_type) for k, v in value.items() + } + elif origin is set: + return {convert(v, args[0]) for v in value} + else: + return value else: - return value + # Need to convert value to the origin type + if origin is list: + value = __convert_list(value) + if args: + return [convert(v, args[0]) for v in value] + else: + return value + elif origin is dict: + value = __convert_dict(value) + if args: + key_type, val_type = args + return { + convert(k, key_type): convert(v, val_type) for k, v in value.items() + } + else: + return value + elif origin is tuple: + value = __convert_tuple(value) + if args: + if len(args) == 1: + return tuple(convert(v, args[0]) for v in value) + else: + return tuple(convert(v, t) for v, t in zip(value, args)) + else: + return value + elif origin is str: + return __convert_str(value) + elif origin is set: + value = __convert_set(value) + if args: + return {convert(v, args[0]) for v in value} + else: + return value + elif origin is int: + return __convert_num(value, int) + elif origin is float: + return __convert_num(value, float) + elif origin is bool: + return __convert_bool(value) + else: + return value diff --git a/autogpt_platform/backend/test/util/test_type.py b/autogpt_platform/backend/test/util/test_type.py index a2a7b2bfab..f9a14d10a0 100644 --- a/autogpt_platform/backend/test/util/test_type.py +++ b/autogpt_platform/backend/test/util/test_type.py @@ -27,5 +27,6 @@ def test_type_conversion(): from typing import List - # assert convert("5", List[int]) == [5] + assert convert("5", List[int]) == [5] assert convert("[5,4,2]", List[int]) == [5, 4, 2] + assert convert([5, 4, 2], List[str]) == ["5", "4", "2"] From 95e184c85ff8c88f561b40993713d828f4fd834b Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Thu, 3 Oct 2024 11:10:45 +0200 Subject: [PATCH 033/155] fix(platform): Add block data db auto-update (#8249) --- autogpt_platform/backend/backend/data/block.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/autogpt_platform/backend/backend/data/block.py b/autogpt_platform/backend/backend/data/block.py index a3b89cc6f9..c8e6bccd87 100644 --- a/autogpt_platform/backend/backend/data/block.py +++ b/autogpt_platform/backend/backend/data/block.py @@ -286,7 +286,9 @@ def get_blocks() -> dict[str, Block]: async def initialize_blocks() -> None: for block in get_blocks().values(): - existing_block = await AgentBlock.prisma().find_unique(where={"id": block.id}) + existing_block = await AgentBlock.prisma().find_first( + where={"OR": [{"id": block.id}, {"name": block.name}]} + ) if not existing_block: await AgentBlock.prisma().create( data={ @@ -301,13 +303,15 @@ async def initialize_blocks() -> None: input_schema = json.dumps(block.input_schema.jsonschema()) output_schema = json.dumps(block.output_schema.jsonschema()) if ( - block.name != existing_block.name + block.id != existing_block.id + or block.name != existing_block.name or input_schema != existing_block.inputSchema or output_schema != existing_block.outputSchema ): await AgentBlock.prisma().update( - where={"id": block.id}, + where={"id": existing_block.id}, data={ + "id": block.id, "name": block.name, "inputSchema": input_schema, "outputSchema": output_schema, From 1114b421d004d2763d526e16a11d638d551f64d3 Mon Sep 17 00:00:00 2001 From: Swifty Date: Thu, 3 Oct 2024 12:16:25 +0200 Subject: [PATCH 034/155] tweak(frontend): Update Blocks UI (#8190) * Updated onOpenChange code style * modifying how handle text is rendered * Rounding input boxes * Modifying layout of nodes * formatting * update edge start / end positions * updated handle rendering * moved outputs down and disabled toggle * formatting * update font * update key name formatting * modify layout of input items * updated the add property button * feat(platform): Sync on new UI design * simplify UI * block list add border and remove padding * add highlight on navbar button * Change block header so block costs line up correctly * fix history type issue * formatting * tweaking css to hide white spot * fixed white spot * Added context menu * Changed status badge color * getting error colors just right * Added a NodeOutputs component for rendering the outputs * tidy up * Change Add Item Button Color * changed cursor on hover in block control panel * formatting * updated formatting of tutoral and tally buttons * fix(platform): Fix text area input not updating input field * Address comments * Add missing color * fix lint errors * Cleanup context logic * Make inputref reliable * Update coloring * fix(platform): Fix unexpected closing block list on tutorial * Add X-scrolling * Remove excessive shadows * Remove another excessive shadows * Another patch patch patch * Add border on context menu * Cleanup executions * Cleanup executions * Makr border darker * Make border darker * Fix input reset --------- Co-authored-by: Zamil Majdy --- autogpt_platform/frontend/package.json | 1 + .../frontend/src/app/marketplace/page.tsx | 2 +- .../frontend/src/components/CustomEdge.tsx | 6 +- .../frontend/src/components/CustomNode.tsx | 381 +++++--- .../frontend/src/components/Flow.tsx | 2 +- .../frontend/src/components/NodeHandle.tsx | 31 +- .../frontend/src/components/NodeOutputs.tsx | 45 + .../src/components/OutputModalComponent.tsx | 2 +- .../src/components/PrimaryActionButton.tsx | 2 +- .../frontend/src/components/TallyPopup.tsx | 13 +- .../components/edit/control/BlocksControl.tsx | 101 +- .../marketplace/AgentDetailContent.tsx | 2 +- .../src/components/nav/CreditButton.tsx | 14 +- .../src/components/node-input-components.tsx | 36 +- .../frontend/src/components/ui/input.tsx | 2 +- .../frontend/src/components/ui/render.tsx | 16 +- .../frontend/src/hooks/useAgentGraph.ts | 3 + autogpt_platform/frontend/src/lib/utils.ts | 28 +- autogpt_platform/frontend/yarn.lock | 862 +++++++++++++----- 19 files changed, 1068 insertions(+), 481 deletions(-) create mode 100644 autogpt_platform/frontend/src/components/NodeOutputs.tsx diff --git a/autogpt_platform/frontend/package.json b/autogpt_platform/frontend/package.json index f9ba6ed2bf..ab18ece18f 100644 --- a/autogpt_platform/frontend/package.json +++ b/autogpt_platform/frontend/package.json @@ -23,6 +23,7 @@ "@radix-ui/react-avatar": "^1.1.0", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-collapsible": "^1.1.0", + "@radix-ui/react-context-menu": "^2.2.1", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-icons": "^1.3.0", diff --git a/autogpt_platform/frontend/src/app/marketplace/page.tsx b/autogpt_platform/frontend/src/app/marketplace/page.tsx index 7cc1f990dd..ded8fdf777 100644 --- a/autogpt_platform/frontend/src/app/marketplace/page.tsx +++ b/autogpt_platform/frontend/src/app/marketplace/page.tsx @@ -105,7 +105,7 @@ const AgentCard: React.FC<{ agent: Agent; featured?: boolean }> = ({ return (
diff --git a/autogpt_platform/frontend/src/components/CustomEdge.tsx b/autogpt_platform/frontend/src/components/CustomEdge.tsx index 78b8bf60b1..6cf767d327 100644 --- a/autogpt_platform/frontend/src/components/CustomEdge.tsx +++ b/autogpt_platform/frontend/src/components/CustomEdge.tsx @@ -48,9 +48,9 @@ export function CustomEdge({ }>({ beads: [], created: 0, destroyed: 0 }); const { svgPath, length, getPointForT, getTForDistance } = useBezierPath( sourceX - 5, - sourceY, - targetX + 3, - targetY, + sourceY - 5, + targetX - 9, + targetY - 5, ); const { deleteElements } = useReactFlow(); const { visualizeBeads } = useContext(FlowContext) ?? { diff --git a/autogpt_platform/frontend/src/components/CustomNode.tsx b/autogpt_platform/frontend/src/components/CustomNode.tsx index 91c275a0fe..7c6766b868 100644 --- a/autogpt_platform/frontend/src/components/CustomNode.tsx +++ b/autogpt_platform/frontend/src/components/CustomNode.tsx @@ -21,19 +21,20 @@ import { import { beautifyString, cn, setNestedProperty } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Switch } from "@/components/ui/switch"; -import { Copy, Trash2 } from "lucide-react"; import { history } from "./history"; import NodeHandle from "./NodeHandle"; import { NodeGenericInputField, NodeTextBoxInput, } from "./node-input-components"; -import SchemaTooltip from "./SchemaTooltip"; import { getPrimaryCategoryColor } from "@/lib/utils"; import { FlowContext } from "./Flow"; import { Badge } from "./ui/badge"; -import DataTable from "./DataTable"; +import NodeOutputs from "./NodeOutputs"; import { IconCoin } from "./ui/icons"; +import * as Separator from "@radix-ui/react-separator"; +import * as ContextMenu from "@radix-ui/react-context-menu"; +import { DotsVerticalIcon, TrashIcon, CopyIcon } from "@radix-ui/react-icons"; type ParsedKey = { key: string; index?: number }; @@ -72,14 +73,19 @@ export type CustomNodeData = { export type CustomNode = Node; -export function CustomNode({ data, id, width, height }: NodeProps) { +export function CustomNode({ + data, + id, + width, + height, + selected, +}: NodeProps) { const [isOutputOpen, setIsOutputOpen] = useState(data.isOutputOpen || false); const [isAdvancedOpen, setIsAdvancedOpen] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const [activeKey, setActiveKey] = useState(null); const [inputModalValue, setInputModalValue] = useState(""); const [isOutputModalOpen, setIsOutputModalOpen] = useState(false); - const [isHovered, setIsHovered] = useState(false); const { updateNodeData, deleteElements, addNodes, getNode } = useReactFlow< CustomNode, Edge @@ -166,10 +172,10 @@ export function CustomNode({ data, id, width, height }: NodeProps) { return ( (isRequired || isAdvancedOpen || !isAdvanced) && (
- + {propSchema.title || beautifyString(propKey)} -
{}}> +
{!isConnected && ( ) { const isAdvanced = propSchema.advanced; return ( (isRequired || isAdvancedOpen || !isAdvanced) && ( -
{}}> +
{propKey !== "value" ? ( - + {propSchema.title || beautifyString(propKey)} ) : ( @@ -254,9 +260,9 @@ export function CustomNode({ data, id, width, height }: NodeProps) { const isAdvanced = propSchema.advanced; return ( (isRequired || isAdvancedOpen || isConnected || !isAdvanced) && ( -
{}}> +
{"credentials_provider" in propSchema ? ( - + Credentials ) : ( @@ -392,7 +398,7 @@ export function CustomNode({ data, id, width, height }: NodeProps) { }; const handleInputClick = (key: string) => { - console.log(`Opening modal for key: ${key}`); + console.debug(`Opening modal for key: ${key}`); setActiveKey(key); const value = getValue(key); setInputModalValue( @@ -418,16 +424,8 @@ export function CustomNode({ data, id, width, height }: NodeProps) { setIsOutputModalOpen(true); }; - const handleHovered = () => { - setIsHovered(true); - }; - - const handleMouseLeave = () => { - setIsHovered(false); - }; - const deleteNode = useCallback(() => { - console.log("Deleting node:", id); + console.debug("Deleting node:", id); // Remove the node deleteElements({ nodes: [{ id }] }); @@ -464,7 +462,7 @@ export function CustomNode({ data, id, width, height }: NodeProps) { history.push({ type: "ADD_NODE", - payload: { node: newNode }, + payload: { node: { ...newNode, ...newNode.data } as CustomNodeData }, undo: () => deleteElements({ nodes: [{ id: newId }] }), redo: () => addNodes(newNode), }); @@ -507,20 +505,53 @@ export function CustomNode({ data, id, width, height }: NodeProps) { "custom-node", "dark-theme", "rounded-xl", - "border", "bg-white/[.9]", - "shadow-md", + "border border-gray-300", + data.uiType === BlockUIType.NOTE ? "w-[300px]" : "w-[500px]", + data.uiType === BlockUIType.NOTE ? "bg-yellow-100" : "bg-white", + selected ? "shadow-2xl" : "", ] .filter(Boolean) .join(" "); const errorClass = - hasConfigErrors || hasOutputError ? "border-red-500 border-2" : ""; + hasConfigErrors || hasOutputError ? "border-red-200 border-2" : ""; - const statusClass = - hasConfigErrors || hasOutputError - ? "failed" - : (data.status?.toLowerCase() ?? ""); + const statusClass = (() => { + if (hasConfigErrors || hasOutputError) return "border-red-200 border-4"; + switch (data.status?.toLowerCase()) { + case "completed": + return "border-green-200 border-4"; + case "running": + return "border-yellow-200 border-4"; + case "failed": + return "border-red-200 border-4"; + case "incomplete": + return "border-purple-200 border-4"; + case "queued": + return "border-cyan-200 border-4"; + default: + return ""; + } + })(); + + const statusBackgroundClass = (() => { + if (hasConfigErrors || hasOutputError) return "bg-red-200"; + switch (data.status?.toLowerCase()) { + case "completed": + return "bg-green-200"; + case "running": + return "bg-yellow-200"; + case "failed": + return "bg-red-200"; + case "incomplete": + return "bg-purple-200"; + case "queued": + return "bg-cyan-200"; + default: + return ""; + } + })(); const hasAdvancedFields = data.inputSchema && @@ -541,115 +572,205 @@ export function CustomNode({ data, id, width, height }: NodeProps) { ), ); - return ( -
-
( +
+ +
+ ); + + const ContextMenuContent = () => ( + + -
-
- {beautifyString( - data.blockType?.replace(/Block$/, "") || data.title, - )} + + Copy + + + + + Delete + + + ); + + const onContextButtonTrigger = (e: React.MouseEvent) => { + e.preventDefault(); + const rect = e.currentTarget.getBoundingClientRect(); + const event = new MouseEvent("contextmenu", { + bubbles: true, + clientX: rect.left + rect.width / 2, + clientY: rect.top + rect.height / 2, + }); + e.currentTarget.dispatchEvent(event); + }; + + const stripeColor = getPrimaryCategoryColor(data.categories); + + const NodeContent = () => ( +
+ {/* Header */} +
+ {/* Color Stripe */} +
+ +
+
+
+ {beautifyString( + data.blockType?.replace(/Block$/, "") || data.title, + )} +
- -
-
- {isHovered && ( - <> - - - + {blockCost && ( +
+ + {" "} + {blockCost.cost_amount}{" "} + credits/{blockCost.cost_type} + +
)}
+ + {data.categories[0].category} + + + +
- {blockCost && ( -
- - {blockCost.cost_amount} credits/{blockCost.cost_type} - -
- )} - {data.uiType !== BlockUIType.NOTE ? ( -
+ {/* Body */} +
+ {/* Input Handles */} + {data.uiType !== BlockUIType.NOTE ? ( +
+
+ {data.inputSchema && + generateInputHandles(data.inputSchema, data.uiType)} +
+
+ ) : (
{data.inputSchema && generateInputHandles(data.inputSchema, data.uiType)}
-
- {data.outputSchema && - generateOutputHandles(data.outputSchema, data.uiType)} -
-
- ) : ( -
- {data.inputSchema && - generateInputHandles(data.inputSchema, data.uiType)} -
- )} - {isOutputOpen && data.uiType !== BlockUIType.NOTE && ( -
- {(data.executionResults?.length ?? 0) > 0 ? ( - <> - + +
+ Advanced + -
- +
+ + )} + {/* Output Handles */} + {data.uiType !== BlockUIType.NOTE && ( + <> + +
+
+ {data.outputSchema && + generateOutputHandles(data.outputSchema, data.uiType)}
- - ) : ( - No outputs yet - )} -
- )} - {data.uiType !== BlockUIType.NOTE && ( -
- - Output - {hasAdvancedFields && ( - <> - - Advanced - - )} - {data.status && ( - + + )} +
+ {/* End Body */} + {/* Footer */} +
+ {/* Display Outputs */} + {isOutputOpen && data.uiType !== BlockUIType.NOTE && ( +
+ {(data.executionResults?.length ?? 0) > 0 ? ( +
+ + +
+ +
+
+ ) : ( +
+ )} +
- {data.status} - - )} -
- )} + + {hasConfigErrors || hasOutputError + ? "Error" + : data.status + ? beautifyString(data.status) + : "Not Run"} + +
+
+ )} +
) { />
); + + return ( + + + + + + ); } diff --git a/autogpt_platform/frontend/src/components/Flow.tsx b/autogpt_platform/frontend/src/components/Flow.tsx index 3b24dc964d..8871f804aa 100644 --- a/autogpt_platform/frontend/src/components/Flow.tsx +++ b/autogpt_platform/frontend/src/components/Flow.tsx @@ -421,7 +421,7 @@ const FlowEditor: React.FC<{ history.push({ type: "ADD_NODE", - payload: { node: newNode.data }, + payload: { node: { ...newNode, ...newNode.data } }, undo: () => deleteElements({ nodes: [{ id: newNode.id }] }), redo: () => addNodes(newNode), }); diff --git a/autogpt_platform/frontend/src/components/NodeHandle.tsx b/autogpt_platform/frontend/src/components/NodeHandle.tsx index d059d65678..e42b740d3b 100644 --- a/autogpt_platform/frontend/src/components/NodeHandle.tsx +++ b/autogpt_platform/frontend/src/components/NodeHandle.tsx @@ -31,20 +31,27 @@ const NodeHandle: FC = ({ const typeClass = `text-sm ${getTypeTextColor(schema.type || "any")} ${side === "left" ? "text-left" : "text-right"}`; const label = ( -
- - {schema.title || beautifyString(keyName)} +
+ + {schema.title || beautifyString(keyName.toLowerCase())} {isRequired ? "*" : ""} - {typeName[schema.type] || "any"} + + ({typeName[schema.type as keyof typeof typeName] || "any"}) +
); - const dot = ( -
- ); + const Dot = ({ className = "" }) => { + const color = isConnected + ? getTypeBgColor(schema.type || "any") + : "border-gray-300"; + return ( +
+ ); + }; if (side === "left") { return ( @@ -53,10 +60,10 @@ const NodeHandle: FC = ({ type="target" position={Position.Left} id={keyName} - className="background-color: white; border: 2px solid black; width: 15px; height: 15px; border-radius: 50%; bottom: -7px; left: 20%; group -ml-[26px]" + className="-ml-[26px]" >
- {dot} + {label}
@@ -74,7 +81,7 @@ const NodeHandle: FC = ({ >
{label} - {dot} +
diff --git a/autogpt_platform/frontend/src/components/NodeOutputs.tsx b/autogpt_platform/frontend/src/components/NodeOutputs.tsx new file mode 100644 index 0000000000..c7b7dc5710 --- /dev/null +++ b/autogpt_platform/frontend/src/components/NodeOutputs.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import { ContentRenderer } from "./ui/render"; +import { beautifyString } from "@/lib/utils"; +import * as Separator from "@radix-ui/react-separator"; + +type NodeOutputsProps = { + title?: string; + truncateLongData?: boolean; + data: { [key: string]: Array }; +}; + +export default function NodeOutputs({ + title, + truncateLongData, + data, +}: NodeOutputsProps) { + return ( +
+ {title && {title}} + {Object.entries(data).map(([pin, dataArray]) => ( +
+
+ Pin: + {beautifyString(pin)} +
+ +
+ Data: +
+ {dataArray.map((item, index) => ( + + + {index < dataArray.length - 1 && ", "} + + ))} +
+
+
+ ))} +
+ ); +} diff --git a/autogpt_platform/frontend/src/components/OutputModalComponent.tsx b/autogpt_platform/frontend/src/components/OutputModalComponent.tsx index fcf33049f2..082bdb022d 100644 --- a/autogpt_platform/frontend/src/components/OutputModalComponent.tsx +++ b/autogpt_platform/frontend/src/components/OutputModalComponent.tsx @@ -26,7 +26,7 @@ const OutputModalComponent: FC = ({
Output Data History -
+
{executionResults.map((data, i) => ( <> diff --git a/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx b/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx index 2d399306eb..25743c6805 100644 --- a/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx +++ b/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx @@ -59,7 +59,7 @@ const PrimaryActionBar: React.FC = ({ onClick={runButtonOnClick} size="primary" style={{ - background: isRunning ? "#FFB3BA" : "#7544DF", + background: isRunning ? "#DF4444" : "#7544DF", opacity: isDisabled ? 0.5 : 1, }} > diff --git a/autogpt_platform/frontend/src/components/TallyPopup.tsx b/autogpt_platform/frontend/src/components/TallyPopup.tsx index e36738598d..89b02cf49a 100644 --- a/autogpt_platform/frontend/src/components/TallyPopup.tsx +++ b/autogpt_platform/frontend/src/components/TallyPopup.tsx @@ -1,7 +1,7 @@ "use client"; import React, { useEffect, useState } from "react"; import { Button } from "./ui/button"; -import { IconMegaphone } from "@/components/ui/icons"; +import { QuestionMarkCircledIcon } from "@radix-ui/react-icons"; import { useRouter } from "next/navigation"; const TallyPopupSimple = () => { @@ -48,17 +48,22 @@ const TallyPopupSimple = () => { }; return ( -
-
diff --git a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx index 0813d08d97..beecf76725 100644 --- a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx +++ b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx @@ -2,7 +2,6 @@ import React, { useState } from "react"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; -import { ToyBrick } from "lucide-react"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { beautifyString } from "@/lib/utils"; @@ -12,11 +11,9 @@ import { PopoverTrigger, } from "@/components/ui/popover"; import { Block } from "@/lib/autogpt-server-api"; -import { PlusIcon } from "@radix-ui/react-icons"; +import { MagnifyingGlassIcon, PlusIcon } from "@radix-ui/react-icons"; import { IconToyBrick } from "@/components/ui/icons"; -import SchemaTooltip from "@/components/SchemaTooltip"; import { getPrimaryCategoryColor } from "@/lib/utils"; -import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, @@ -55,9 +52,10 @@ export const BlocksControl: React.FC = ({ // Extract unique categories from blocks const categories = Array.from( - new Set( - blocks.flatMap((block) => block.categories.map((cat) => cat.category)), - ), + new Set([ + null, + ...blocks.flatMap((block) => block.categories.map((cat) => cat.category)), + ]), ); React.useEffect(() => { @@ -97,80 +95,93 @@ export const BlocksControl: React.FC = ({ side="right" sideOffset={22} align="start" - className="w-[30rem] p-0" + className="absolute -top-3 w-[17rem] rounded-xl p-0 md:w-[30rem]" data-id="blocks-control-popover-content" > - - + +
- setSearchQuery(e.target.value)} - data-id="blocks-control-search-input" - /> +
+ + setSearchQuery(e.target.value)} + className="rounded-lg px-8 py-5" + data-id="blocks-control-search-input" + /> +
- {categories.map((category) => ( - - setSelectedCategory( - selectedCategory === category ? null : category, - ) - } - > - {beautifyString(category)} - - ))} + {categories.map((category) => { + const color = getPrimaryCategoryColor([ + { category: category || "All", description: "" }, + ]); + const colorClass = + selectedCategory === category ? `${color}` : ""; + return ( +
+ setSelectedCategory( + selectedCategory === category ? null : category, + ) + } + > + {beautifyString( + category && category.length > 3 + ? category.toLowerCase() + : category || "All", + )} +
+ ); + })}
- + {filteredBlocks.map((block) => ( addBlock(block.id, block.name)} > - {/* This div needs to be 10px wide and the same height as the card and be the primary color showing up on top of the card with matching rounded corners */}
-
+
- {beautifyString(block.name)} + {beautifyString(block.name).replace(/ Block$/, "")} - + {block.description}
+ > + +
))} diff --git a/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx b/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx index ff4f398c98..b0572b106a 100644 --- a/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx +++ b/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx @@ -114,7 +114,7 @@ function AgentDetailContent({ agent }: { agent: AgentDetailResponse }) { {agent.description}

-
+
diff --git a/autogpt_platform/frontend/src/components/nav/CreditButton.tsx b/autogpt_platform/frontend/src/components/nav/CreditButton.tsx index d806153982..0a8d9d446c 100644 --- a/autogpt_platform/frontend/src/components/nav/CreditButton.tsx +++ b/autogpt_platform/frontend/src/components/nav/CreditButton.tsx @@ -1,21 +1,23 @@ "use client"; -import { useState, useEffect } from "react"; +import { useState, useEffect, useCallback } from "react"; import { Button } from "@/components/ui/button"; -import { IconRefresh, IconCoin } from "@/components/ui/icons"; +import { IconRefresh } from "@/components/ui/icons"; import AutoGPTServerAPI from "@/lib/autogpt-server-api"; +const api = new AutoGPTServerAPI(); + export default function CreditButton() { const [credit, setCredit] = useState(null); - const api = new AutoGPTServerAPI(); - const fetchCredit = async () => { + const fetchCredit = useCallback(async () => { const response = await api.getUserCredit(); setCredit(response.credits); - }; + }, []); + useEffect(() => { fetchCredit(); - }, [api]); + }, [fetchCredit]); return ( credit !== null && ( diff --git a/autogpt_platform/frontend/src/components/node-input-components.tsx b/autogpt_platform/frontend/src/components/node-input-components.tsx index cec4ee1e50..b128cd1241 100644 --- a/autogpt_platform/frontend/src/components/node-input-components.tsx +++ b/autogpt_platform/frontend/src/components/node-input-components.tsx @@ -9,7 +9,6 @@ import { BlockIOStringSubSchema, BlockIONumberSubSchema, BlockIOBooleanSubSchema, - BlockIOCredentialsSubSchema, } from "@/lib/autogpt-server-api/types"; import React, { FC, useCallback, useEffect, useState } from "react"; import { Button } from "./ui/button"; @@ -313,6 +312,18 @@ const NodeCredentialsInput: FC<{ ); }; +const InputRef = (value: any): React.RefObject => { + const inputRef = React.useRef(null); + + useEffect(() => { + if (inputRef.current && value && inputRef.current.value !== value) { + inputRef.current.value = value; + } + }, [value]); + + return inputRef; +}; + const NodeKeyValueInput: FC<{ selfKey: string; schema: BlockIOKVSubSchema; @@ -384,14 +395,15 @@ const NodeKeyValueInput: FC<{ } return ( -
- {displayName && {displayName}} +
0 ? "flex flex-col" : "")} + >
{keyValuePairs.map(({ key, value }, index) => (
{key && ( updateKeyValuePairs( keyValuePairs.toSpliced(index, 1, { @@ -445,7 +457,7 @@ const NodeKeyValueInput: FC<{
))} + + )}
- - {data.categories[0].category} - - - -
- {/* Body */} -
- {/* Input Handles */} - {data.uiType !== BlockUIType.NOTE ? ( -
-
- {data.inputSchema && - generateInputHandles(data.inputSchema, data.uiType)} -
-
- ) : ( + {blockCost && ( +
+ + {blockCost.cost_amount} credits/{blockCost.cost_type} + +
+ )} + {data.uiType !== BlockUIType.NOTE ? ( +
{data.inputSchema && generateInputHandles(data.inputSchema, data.uiType)}
- )} - - {/* Advanced Settings */} - {data.uiType !== BlockUIType.NOTE && hasAdvancedFields && ( - <> - -
- Advanced - -
- - )} - {/* Output Handles */} - {data.uiType !== BlockUIType.NOTE && ( - <> - -
-
- {data.outputSchema && - generateOutputHandles(data.outputSchema, data.uiType)} -
-
- - )} -
- {/* End Body */} - {/* Footer */} -
- {/* Display Outputs */} - {isOutputOpen && data.uiType !== BlockUIType.NOTE && ( -
- {(data.executionResults?.length ?? 0) > 0 ? ( -
- - -
- -
-
- ) : ( -
- )} -
- - {hasConfigErrors || hasOutputError - ? "Error" - : data.status - ? beautifyString(data.status) - : "Not Run"} - -
+
+ {data.outputSchema && + generateOutputHandles(data.outputSchema, data.uiType)}
- )} -
+
+ ) : ( +
+ {data.inputSchema && + generateInputHandles(data.inputSchema, data.uiType)} +
+ )} + {isOutputOpen && data.uiType !== BlockUIType.NOTE && ( +
+ {(data.executionResults?.length ?? 0) > 0 ? ( + <> + +
+ +
+ + ) : ( + No outputs yet + )} +
+ )} + {data.uiType !== BlockUIType.NOTE && ( +
+ + Output + {hasAdvancedFields && ( + <> + + Advanced + + )} + {data.status && ( + + {data.status} + + )} +
+ )}
); - - return ( - - - - - - ); } diff --git a/autogpt_platform/frontend/src/components/Flow.tsx b/autogpt_platform/frontend/src/components/Flow.tsx index 8871f804aa..3b24dc964d 100644 --- a/autogpt_platform/frontend/src/components/Flow.tsx +++ b/autogpt_platform/frontend/src/components/Flow.tsx @@ -421,7 +421,7 @@ const FlowEditor: React.FC<{ history.push({ type: "ADD_NODE", - payload: { node: { ...newNode, ...newNode.data } }, + payload: { node: newNode.data }, undo: () => deleteElements({ nodes: [{ id: newNode.id }] }), redo: () => addNodes(newNode), }); diff --git a/autogpt_platform/frontend/src/components/NodeHandle.tsx b/autogpt_platform/frontend/src/components/NodeHandle.tsx index e42b740d3b..d059d65678 100644 --- a/autogpt_platform/frontend/src/components/NodeHandle.tsx +++ b/autogpt_platform/frontend/src/components/NodeHandle.tsx @@ -31,27 +31,20 @@ const NodeHandle: FC = ({ const typeClass = `text-sm ${getTypeTextColor(schema.type || "any")} ${side === "left" ? "text-left" : "text-right"}`; const label = ( -
- - {schema.title || beautifyString(keyName.toLowerCase())} +
+ + {schema.title || beautifyString(keyName)} {isRequired ? "*" : ""} - - ({typeName[schema.type as keyof typeof typeName] || "any"}) - + {typeName[schema.type] || "any"}
); - const Dot = ({ className = "" }) => { - const color = isConnected - ? getTypeBgColor(schema.type || "any") - : "border-gray-300"; - return ( -
- ); - }; + const dot = ( +
+ ); if (side === "left") { return ( @@ -60,10 +53,10 @@ const NodeHandle: FC = ({ type="target" position={Position.Left} id={keyName} - className="-ml-[26px]" + className="background-color: white; border: 2px solid black; width: 15px; height: 15px; border-radius: 50%; bottom: -7px; left: 20%; group -ml-[26px]" >
- + {dot} {label}
@@ -81,7 +74,7 @@ const NodeHandle: FC = ({ >
{label} - + {dot}
diff --git a/autogpt_platform/frontend/src/components/NodeOutputs.tsx b/autogpt_platform/frontend/src/components/NodeOutputs.tsx deleted file mode 100644 index c7b7dc5710..0000000000 --- a/autogpt_platform/frontend/src/components/NodeOutputs.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from "react"; -import { ContentRenderer } from "./ui/render"; -import { beautifyString } from "@/lib/utils"; -import * as Separator from "@radix-ui/react-separator"; - -type NodeOutputsProps = { - title?: string; - truncateLongData?: boolean; - data: { [key: string]: Array }; -}; - -export default function NodeOutputs({ - title, - truncateLongData, - data, -}: NodeOutputsProps) { - return ( -
- {title && {title}} - {Object.entries(data).map(([pin, dataArray]) => ( -
-
- Pin: - {beautifyString(pin)} -
- -
- Data: -
- {dataArray.map((item, index) => ( - - - {index < dataArray.length - 1 && ", "} - - ))} -
-
-
- ))} -
- ); -} diff --git a/autogpt_platform/frontend/src/components/OutputModalComponent.tsx b/autogpt_platform/frontend/src/components/OutputModalComponent.tsx index 082bdb022d..fcf33049f2 100644 --- a/autogpt_platform/frontend/src/components/OutputModalComponent.tsx +++ b/autogpt_platform/frontend/src/components/OutputModalComponent.tsx @@ -26,7 +26,7 @@ const OutputModalComponent: FC = ({
Output Data History -
+
{executionResults.map((data, i) => ( <> diff --git a/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx b/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx index 25743c6805..2d399306eb 100644 --- a/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx +++ b/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx @@ -59,7 +59,7 @@ const PrimaryActionBar: React.FC = ({ onClick={runButtonOnClick} size="primary" style={{ - background: isRunning ? "#DF4444" : "#7544DF", + background: isRunning ? "#FFB3BA" : "#7544DF", opacity: isDisabled ? 0.5 : 1, }} > diff --git a/autogpt_platform/frontend/src/components/TallyPopup.tsx b/autogpt_platform/frontend/src/components/TallyPopup.tsx index 89b02cf49a..e36738598d 100644 --- a/autogpt_platform/frontend/src/components/TallyPopup.tsx +++ b/autogpt_platform/frontend/src/components/TallyPopup.tsx @@ -1,7 +1,7 @@ "use client"; import React, { useEffect, useState } from "react"; import { Button } from "./ui/button"; -import { QuestionMarkCircledIcon } from "@radix-ui/react-icons"; +import { IconMegaphone } from "@/components/ui/icons"; import { useRouter } from "next/navigation"; const TallyPopupSimple = () => { @@ -48,22 +48,17 @@ const TallyPopupSimple = () => { }; return ( -
-
diff --git a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx index beecf76725..0813d08d97 100644 --- a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx +++ b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx @@ -2,6 +2,7 @@ import React, { useState } from "react"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; +import { ToyBrick } from "lucide-react"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { beautifyString } from "@/lib/utils"; @@ -11,9 +12,11 @@ import { PopoverTrigger, } from "@/components/ui/popover"; import { Block } from "@/lib/autogpt-server-api"; -import { MagnifyingGlassIcon, PlusIcon } from "@radix-ui/react-icons"; +import { PlusIcon } from "@radix-ui/react-icons"; import { IconToyBrick } from "@/components/ui/icons"; +import SchemaTooltip from "@/components/SchemaTooltip"; import { getPrimaryCategoryColor } from "@/lib/utils"; +import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, @@ -52,10 +55,9 @@ export const BlocksControl: React.FC = ({ // Extract unique categories from blocks const categories = Array.from( - new Set([ - null, - ...blocks.flatMap((block) => block.categories.map((cat) => cat.category)), - ]), + new Set( + blocks.flatMap((block) => block.categories.map((cat) => cat.category)), + ), ); React.useEffect(() => { @@ -95,93 +97,80 @@ export const BlocksControl: React.FC = ({ side="right" sideOffset={22} align="start" - className="absolute -top-3 w-[17rem] rounded-xl p-0 md:w-[30rem]" + className="w-[30rem] p-0" data-id="blocks-control-popover-content" > - - + +
-
- - setSearchQuery(e.target.value)} - className="rounded-lg px-8 py-5" - data-id="blocks-control-search-input" - /> -
+ setSearchQuery(e.target.value)} + data-id="blocks-control-search-input" + />
- {categories.map((category) => { - const color = getPrimaryCategoryColor([ - { category: category || "All", description: "" }, - ]); - const colorClass = - selectedCategory === category ? `${color}` : ""; - return ( -
- setSelectedCategory( - selectedCategory === category ? null : category, - ) - } - > - {beautifyString( - category && category.length > 3 - ? category.toLowerCase() - : category || "All", - )} -
- ); - })} + {categories.map((category) => ( + + setSelectedCategory( + selectedCategory === category ? null : category, + ) + } + > + {beautifyString(category)} + + ))}
- + {filteredBlocks.map((block) => ( addBlock(block.id, block.name)} > + {/* This div needs to be 10px wide and the same height as the card and be the primary color showing up on top of the card with matching rounded corners */}
-
+
- {beautifyString(block.name).replace(/ Block$/, "")} + {beautifyString(block.name)} - + {block.description}
- -
+ >
))} diff --git a/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx b/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx index b0572b106a..ff4f398c98 100644 --- a/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx +++ b/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx @@ -114,7 +114,7 @@ function AgentDetailContent({ agent }: { agent: AgentDetailResponse }) { {agent.description}

-
+
diff --git a/autogpt_platform/frontend/src/components/nav/CreditButton.tsx b/autogpt_platform/frontend/src/components/nav/CreditButton.tsx index 0a8d9d446c..d806153982 100644 --- a/autogpt_platform/frontend/src/components/nav/CreditButton.tsx +++ b/autogpt_platform/frontend/src/components/nav/CreditButton.tsx @@ -1,23 +1,21 @@ "use client"; -import { useState, useEffect, useCallback } from "react"; +import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; -import { IconRefresh } from "@/components/ui/icons"; +import { IconRefresh, IconCoin } from "@/components/ui/icons"; import AutoGPTServerAPI from "@/lib/autogpt-server-api"; -const api = new AutoGPTServerAPI(); - export default function CreditButton() { const [credit, setCredit] = useState(null); + const api = new AutoGPTServerAPI(); - const fetchCredit = useCallback(async () => { + const fetchCredit = async () => { const response = await api.getUserCredit(); setCredit(response.credits); - }, []); - + }; useEffect(() => { fetchCredit(); - }, [fetchCredit]); + }, [api]); return ( credit !== null && ( diff --git a/autogpt_platform/frontend/src/components/node-input-components.tsx b/autogpt_platform/frontend/src/components/node-input-components.tsx index b128cd1241..cec4ee1e50 100644 --- a/autogpt_platform/frontend/src/components/node-input-components.tsx +++ b/autogpt_platform/frontend/src/components/node-input-components.tsx @@ -9,6 +9,7 @@ import { BlockIOStringSubSchema, BlockIONumberSubSchema, BlockIOBooleanSubSchema, + BlockIOCredentialsSubSchema, } from "@/lib/autogpt-server-api/types"; import React, { FC, useCallback, useEffect, useState } from "react"; import { Button } from "./ui/button"; @@ -312,18 +313,6 @@ const NodeCredentialsInput: FC<{ ); }; -const InputRef = (value: any): React.RefObject => { - const inputRef = React.useRef(null); - - useEffect(() => { - if (inputRef.current && value && inputRef.current.value !== value) { - inputRef.current.value = value; - } - }, [value]); - - return inputRef; -}; - const NodeKeyValueInput: FC<{ selfKey: string; schema: BlockIOKVSubSchema; @@ -395,15 +384,14 @@ const NodeKeyValueInput: FC<{ } return ( -
0 ? "flex flex-col" : "")} - > +
+ {displayName && {displayName}}
{keyValuePairs.map(({ key, value }, index) => (
{key && ( updateKeyValuePairs( keyValuePairs.toSpliced(index, 1, { @@ -457,7 +445,7 @@ const NodeKeyValueInput: FC<{
))}
{modals} + {oAuthError && ( +
Error: {oAuthError}
+ )} ); } @@ -251,6 +291,9 @@ export const CredentialsInput: FC<{ {modals} + {oAuthError && ( +
Error: {oAuthError}
+ )} ); }; From 1bc445007aec13fe9be62f77fe28b51063231844 Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Fri, 4 Oct 2024 01:54:05 +0400 Subject: [PATCH 038/155] Revert "Revert "tweak(frontend): Update Blocks UI (#8190)" (#8257)" This reverts commit 4989e3c2820bae1e783c63cbd3a552adc9077978. --- autogpt_platform/frontend/package.json | 1 + .../frontend/src/app/marketplace/page.tsx | 2 +- .../frontend/src/components/CustomEdge.tsx | 6 +- .../frontend/src/components/CustomNode.tsx | 381 +++++--- .../frontend/src/components/Flow.tsx | 2 +- .../frontend/src/components/NodeHandle.tsx | 31 +- .../frontend/src/components/NodeOutputs.tsx | 45 + .../src/components/OutputModalComponent.tsx | 2 +- .../src/components/PrimaryActionButton.tsx | 2 +- .../frontend/src/components/TallyPopup.tsx | 13 +- .../components/edit/control/BlocksControl.tsx | 101 +- .../marketplace/AgentDetailContent.tsx | 2 +- .../src/components/nav/CreditButton.tsx | 14 +- .../src/components/node-input-components.tsx | 36 +- .../frontend/src/components/ui/input.tsx | 2 +- .../frontend/src/components/ui/render.tsx | 16 +- .../frontend/src/hooks/useAgentGraph.ts | 3 + autogpt_platform/frontend/src/lib/utils.ts | 28 +- autogpt_platform/frontend/yarn.lock | 862 +++++++++++++----- 19 files changed, 1068 insertions(+), 481 deletions(-) create mode 100644 autogpt_platform/frontend/src/components/NodeOutputs.tsx diff --git a/autogpt_platform/frontend/package.json b/autogpt_platform/frontend/package.json index f9ba6ed2bf..ab18ece18f 100644 --- a/autogpt_platform/frontend/package.json +++ b/autogpt_platform/frontend/package.json @@ -23,6 +23,7 @@ "@radix-ui/react-avatar": "^1.1.0", "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-collapsible": "^1.1.0", + "@radix-ui/react-context-menu": "^2.2.1", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-icons": "^1.3.0", diff --git a/autogpt_platform/frontend/src/app/marketplace/page.tsx b/autogpt_platform/frontend/src/app/marketplace/page.tsx index 7cc1f990dd..ded8fdf777 100644 --- a/autogpt_platform/frontend/src/app/marketplace/page.tsx +++ b/autogpt_platform/frontend/src/app/marketplace/page.tsx @@ -105,7 +105,7 @@ const AgentCard: React.FC<{ agent: Agent; featured?: boolean }> = ({ return (
diff --git a/autogpt_platform/frontend/src/components/CustomEdge.tsx b/autogpt_platform/frontend/src/components/CustomEdge.tsx index 78b8bf60b1..6cf767d327 100644 --- a/autogpt_platform/frontend/src/components/CustomEdge.tsx +++ b/autogpt_platform/frontend/src/components/CustomEdge.tsx @@ -48,9 +48,9 @@ export function CustomEdge({ }>({ beads: [], created: 0, destroyed: 0 }); const { svgPath, length, getPointForT, getTForDistance } = useBezierPath( sourceX - 5, - sourceY, - targetX + 3, - targetY, + sourceY - 5, + targetX - 9, + targetY - 5, ); const { deleteElements } = useReactFlow(); const { visualizeBeads } = useContext(FlowContext) ?? { diff --git a/autogpt_platform/frontend/src/components/CustomNode.tsx b/autogpt_platform/frontend/src/components/CustomNode.tsx index 91c275a0fe..7c6766b868 100644 --- a/autogpt_platform/frontend/src/components/CustomNode.tsx +++ b/autogpt_platform/frontend/src/components/CustomNode.tsx @@ -21,19 +21,20 @@ import { import { beautifyString, cn, setNestedProperty } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Switch } from "@/components/ui/switch"; -import { Copy, Trash2 } from "lucide-react"; import { history } from "./history"; import NodeHandle from "./NodeHandle"; import { NodeGenericInputField, NodeTextBoxInput, } from "./node-input-components"; -import SchemaTooltip from "./SchemaTooltip"; import { getPrimaryCategoryColor } from "@/lib/utils"; import { FlowContext } from "./Flow"; import { Badge } from "./ui/badge"; -import DataTable from "./DataTable"; +import NodeOutputs from "./NodeOutputs"; import { IconCoin } from "./ui/icons"; +import * as Separator from "@radix-ui/react-separator"; +import * as ContextMenu from "@radix-ui/react-context-menu"; +import { DotsVerticalIcon, TrashIcon, CopyIcon } from "@radix-ui/react-icons"; type ParsedKey = { key: string; index?: number }; @@ -72,14 +73,19 @@ export type CustomNodeData = { export type CustomNode = Node; -export function CustomNode({ data, id, width, height }: NodeProps) { +export function CustomNode({ + data, + id, + width, + height, + selected, +}: NodeProps) { const [isOutputOpen, setIsOutputOpen] = useState(data.isOutputOpen || false); const [isAdvancedOpen, setIsAdvancedOpen] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const [activeKey, setActiveKey] = useState(null); const [inputModalValue, setInputModalValue] = useState(""); const [isOutputModalOpen, setIsOutputModalOpen] = useState(false); - const [isHovered, setIsHovered] = useState(false); const { updateNodeData, deleteElements, addNodes, getNode } = useReactFlow< CustomNode, Edge @@ -166,10 +172,10 @@ export function CustomNode({ data, id, width, height }: NodeProps) { return ( (isRequired || isAdvancedOpen || !isAdvanced) && (
- + {propSchema.title || beautifyString(propKey)} -
{}}> +
{!isConnected && ( ) { const isAdvanced = propSchema.advanced; return ( (isRequired || isAdvancedOpen || !isAdvanced) && ( -
{}}> +
{propKey !== "value" ? ( - + {propSchema.title || beautifyString(propKey)} ) : ( @@ -254,9 +260,9 @@ export function CustomNode({ data, id, width, height }: NodeProps) { const isAdvanced = propSchema.advanced; return ( (isRequired || isAdvancedOpen || isConnected || !isAdvanced) && ( -
{}}> +
{"credentials_provider" in propSchema ? ( - + Credentials ) : ( @@ -392,7 +398,7 @@ export function CustomNode({ data, id, width, height }: NodeProps) { }; const handleInputClick = (key: string) => { - console.log(`Opening modal for key: ${key}`); + console.debug(`Opening modal for key: ${key}`); setActiveKey(key); const value = getValue(key); setInputModalValue( @@ -418,16 +424,8 @@ export function CustomNode({ data, id, width, height }: NodeProps) { setIsOutputModalOpen(true); }; - const handleHovered = () => { - setIsHovered(true); - }; - - const handleMouseLeave = () => { - setIsHovered(false); - }; - const deleteNode = useCallback(() => { - console.log("Deleting node:", id); + console.debug("Deleting node:", id); // Remove the node deleteElements({ nodes: [{ id }] }); @@ -464,7 +462,7 @@ export function CustomNode({ data, id, width, height }: NodeProps) { history.push({ type: "ADD_NODE", - payload: { node: newNode }, + payload: { node: { ...newNode, ...newNode.data } as CustomNodeData }, undo: () => deleteElements({ nodes: [{ id: newId }] }), redo: () => addNodes(newNode), }); @@ -507,20 +505,53 @@ export function CustomNode({ data, id, width, height }: NodeProps) { "custom-node", "dark-theme", "rounded-xl", - "border", "bg-white/[.9]", - "shadow-md", + "border border-gray-300", + data.uiType === BlockUIType.NOTE ? "w-[300px]" : "w-[500px]", + data.uiType === BlockUIType.NOTE ? "bg-yellow-100" : "bg-white", + selected ? "shadow-2xl" : "", ] .filter(Boolean) .join(" "); const errorClass = - hasConfigErrors || hasOutputError ? "border-red-500 border-2" : ""; + hasConfigErrors || hasOutputError ? "border-red-200 border-2" : ""; - const statusClass = - hasConfigErrors || hasOutputError - ? "failed" - : (data.status?.toLowerCase() ?? ""); + const statusClass = (() => { + if (hasConfigErrors || hasOutputError) return "border-red-200 border-4"; + switch (data.status?.toLowerCase()) { + case "completed": + return "border-green-200 border-4"; + case "running": + return "border-yellow-200 border-4"; + case "failed": + return "border-red-200 border-4"; + case "incomplete": + return "border-purple-200 border-4"; + case "queued": + return "border-cyan-200 border-4"; + default: + return ""; + } + })(); + + const statusBackgroundClass = (() => { + if (hasConfigErrors || hasOutputError) return "bg-red-200"; + switch (data.status?.toLowerCase()) { + case "completed": + return "bg-green-200"; + case "running": + return "bg-yellow-200"; + case "failed": + return "bg-red-200"; + case "incomplete": + return "bg-purple-200"; + case "queued": + return "bg-cyan-200"; + default: + return ""; + } + })(); const hasAdvancedFields = data.inputSchema && @@ -541,115 +572,205 @@ export function CustomNode({ data, id, width, height }: NodeProps) { ), ); - return ( -
-
( +
+ +
+ ); + + const ContextMenuContent = () => ( + + -
-
- {beautifyString( - data.blockType?.replace(/Block$/, "") || data.title, - )} + + Copy + + + + + Delete + + + ); + + const onContextButtonTrigger = (e: React.MouseEvent) => { + e.preventDefault(); + const rect = e.currentTarget.getBoundingClientRect(); + const event = new MouseEvent("contextmenu", { + bubbles: true, + clientX: rect.left + rect.width / 2, + clientY: rect.top + rect.height / 2, + }); + e.currentTarget.dispatchEvent(event); + }; + + const stripeColor = getPrimaryCategoryColor(data.categories); + + const NodeContent = () => ( +
+ {/* Header */} +
+ {/* Color Stripe */} +
+ +
+
+
+ {beautifyString( + data.blockType?.replace(/Block$/, "") || data.title, + )} +
- -
-
- {isHovered && ( - <> - - - + {blockCost && ( +
+ + {" "} + {blockCost.cost_amount}{" "} + credits/{blockCost.cost_type} + +
)}
+ + {data.categories[0].category} + + + +
- {blockCost && ( -
- - {blockCost.cost_amount} credits/{blockCost.cost_type} - -
- )} - {data.uiType !== BlockUIType.NOTE ? ( -
+ {/* Body */} +
+ {/* Input Handles */} + {data.uiType !== BlockUIType.NOTE ? ( +
+
+ {data.inputSchema && + generateInputHandles(data.inputSchema, data.uiType)} +
+
+ ) : (
{data.inputSchema && generateInputHandles(data.inputSchema, data.uiType)}
-
- {data.outputSchema && - generateOutputHandles(data.outputSchema, data.uiType)} -
-
- ) : ( -
- {data.inputSchema && - generateInputHandles(data.inputSchema, data.uiType)} -
- )} - {isOutputOpen && data.uiType !== BlockUIType.NOTE && ( -
- {(data.executionResults?.length ?? 0) > 0 ? ( - <> - + +
+ Advanced + -
- +
+ + )} + {/* Output Handles */} + {data.uiType !== BlockUIType.NOTE && ( + <> + +
+
+ {data.outputSchema && + generateOutputHandles(data.outputSchema, data.uiType)}
- - ) : ( - No outputs yet - )} -
- )} - {data.uiType !== BlockUIType.NOTE && ( -
- - Output - {hasAdvancedFields && ( - <> - - Advanced - - )} - {data.status && ( - + + )} +
+ {/* End Body */} + {/* Footer */} +
+ {/* Display Outputs */} + {isOutputOpen && data.uiType !== BlockUIType.NOTE && ( +
+ {(data.executionResults?.length ?? 0) > 0 ? ( +
+ + +
+ +
+
+ ) : ( +
+ )} +
- {data.status} - - )} -
- )} + + {hasConfigErrors || hasOutputError + ? "Error" + : data.status + ? beautifyString(data.status) + : "Not Run"} + +
+
+ )} +
) { />
); + + return ( + + + + + + ); } diff --git a/autogpt_platform/frontend/src/components/Flow.tsx b/autogpt_platform/frontend/src/components/Flow.tsx index 3b24dc964d..8871f804aa 100644 --- a/autogpt_platform/frontend/src/components/Flow.tsx +++ b/autogpt_platform/frontend/src/components/Flow.tsx @@ -421,7 +421,7 @@ const FlowEditor: React.FC<{ history.push({ type: "ADD_NODE", - payload: { node: newNode.data }, + payload: { node: { ...newNode, ...newNode.data } }, undo: () => deleteElements({ nodes: [{ id: newNode.id }] }), redo: () => addNodes(newNode), }); diff --git a/autogpt_platform/frontend/src/components/NodeHandle.tsx b/autogpt_platform/frontend/src/components/NodeHandle.tsx index d059d65678..e42b740d3b 100644 --- a/autogpt_platform/frontend/src/components/NodeHandle.tsx +++ b/autogpt_platform/frontend/src/components/NodeHandle.tsx @@ -31,20 +31,27 @@ const NodeHandle: FC = ({ const typeClass = `text-sm ${getTypeTextColor(schema.type || "any")} ${side === "left" ? "text-left" : "text-right"}`; const label = ( -
- - {schema.title || beautifyString(keyName)} +
+ + {schema.title || beautifyString(keyName.toLowerCase())} {isRequired ? "*" : ""} - {typeName[schema.type] || "any"} + + ({typeName[schema.type as keyof typeof typeName] || "any"}) +
); - const dot = ( -
- ); + const Dot = ({ className = "" }) => { + const color = isConnected + ? getTypeBgColor(schema.type || "any") + : "border-gray-300"; + return ( +
+ ); + }; if (side === "left") { return ( @@ -53,10 +60,10 @@ const NodeHandle: FC = ({ type="target" position={Position.Left} id={keyName} - className="background-color: white; border: 2px solid black; width: 15px; height: 15px; border-radius: 50%; bottom: -7px; left: 20%; group -ml-[26px]" + className="-ml-[26px]" >
- {dot} + {label}
@@ -74,7 +81,7 @@ const NodeHandle: FC = ({ >
{label} - {dot} +
diff --git a/autogpt_platform/frontend/src/components/NodeOutputs.tsx b/autogpt_platform/frontend/src/components/NodeOutputs.tsx new file mode 100644 index 0000000000..c7b7dc5710 --- /dev/null +++ b/autogpt_platform/frontend/src/components/NodeOutputs.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import { ContentRenderer } from "./ui/render"; +import { beautifyString } from "@/lib/utils"; +import * as Separator from "@radix-ui/react-separator"; + +type NodeOutputsProps = { + title?: string; + truncateLongData?: boolean; + data: { [key: string]: Array }; +}; + +export default function NodeOutputs({ + title, + truncateLongData, + data, +}: NodeOutputsProps) { + return ( +
+ {title && {title}} + {Object.entries(data).map(([pin, dataArray]) => ( +
+
+ Pin: + {beautifyString(pin)} +
+ +
+ Data: +
+ {dataArray.map((item, index) => ( + + + {index < dataArray.length - 1 && ", "} + + ))} +
+
+
+ ))} +
+ ); +} diff --git a/autogpt_platform/frontend/src/components/OutputModalComponent.tsx b/autogpt_platform/frontend/src/components/OutputModalComponent.tsx index fcf33049f2..082bdb022d 100644 --- a/autogpt_platform/frontend/src/components/OutputModalComponent.tsx +++ b/autogpt_platform/frontend/src/components/OutputModalComponent.tsx @@ -26,7 +26,7 @@ const OutputModalComponent: FC = ({
Output Data History -
+
{executionResults.map((data, i) => ( <> diff --git a/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx b/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx index 2d399306eb..25743c6805 100644 --- a/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx +++ b/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx @@ -59,7 +59,7 @@ const PrimaryActionBar: React.FC = ({ onClick={runButtonOnClick} size="primary" style={{ - background: isRunning ? "#FFB3BA" : "#7544DF", + background: isRunning ? "#DF4444" : "#7544DF", opacity: isDisabled ? 0.5 : 1, }} > diff --git a/autogpt_platform/frontend/src/components/TallyPopup.tsx b/autogpt_platform/frontend/src/components/TallyPopup.tsx index e36738598d..89b02cf49a 100644 --- a/autogpt_platform/frontend/src/components/TallyPopup.tsx +++ b/autogpt_platform/frontend/src/components/TallyPopup.tsx @@ -1,7 +1,7 @@ "use client"; import React, { useEffect, useState } from "react"; import { Button } from "./ui/button"; -import { IconMegaphone } from "@/components/ui/icons"; +import { QuestionMarkCircledIcon } from "@radix-ui/react-icons"; import { useRouter } from "next/navigation"; const TallyPopupSimple = () => { @@ -48,17 +48,22 @@ const TallyPopupSimple = () => { }; return ( -
-
diff --git a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx index 0813d08d97..beecf76725 100644 --- a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx +++ b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx @@ -2,7 +2,6 @@ import React, { useState } from "react"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; -import { ToyBrick } from "lucide-react"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { beautifyString } from "@/lib/utils"; @@ -12,11 +11,9 @@ import { PopoverTrigger, } from "@/components/ui/popover"; import { Block } from "@/lib/autogpt-server-api"; -import { PlusIcon } from "@radix-ui/react-icons"; +import { MagnifyingGlassIcon, PlusIcon } from "@radix-ui/react-icons"; import { IconToyBrick } from "@/components/ui/icons"; -import SchemaTooltip from "@/components/SchemaTooltip"; import { getPrimaryCategoryColor } from "@/lib/utils"; -import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, @@ -55,9 +52,10 @@ export const BlocksControl: React.FC = ({ // Extract unique categories from blocks const categories = Array.from( - new Set( - blocks.flatMap((block) => block.categories.map((cat) => cat.category)), - ), + new Set([ + null, + ...blocks.flatMap((block) => block.categories.map((cat) => cat.category)), + ]), ); React.useEffect(() => { @@ -97,80 +95,93 @@ export const BlocksControl: React.FC = ({ side="right" sideOffset={22} align="start" - className="w-[30rem] p-0" + className="absolute -top-3 w-[17rem] rounded-xl p-0 md:w-[30rem]" data-id="blocks-control-popover-content" > - - + +
- setSearchQuery(e.target.value)} - data-id="blocks-control-search-input" - /> +
+ + setSearchQuery(e.target.value)} + className="rounded-lg px-8 py-5" + data-id="blocks-control-search-input" + /> +
- {categories.map((category) => ( - - setSelectedCategory( - selectedCategory === category ? null : category, - ) - } - > - {beautifyString(category)} - - ))} + {categories.map((category) => { + const color = getPrimaryCategoryColor([ + { category: category || "All", description: "" }, + ]); + const colorClass = + selectedCategory === category ? `${color}` : ""; + return ( +
+ setSelectedCategory( + selectedCategory === category ? null : category, + ) + } + > + {beautifyString( + category && category.length > 3 + ? category.toLowerCase() + : category || "All", + )} +
+ ); + })}
- + {filteredBlocks.map((block) => ( addBlock(block.id, block.name)} > - {/* This div needs to be 10px wide and the same height as the card and be the primary color showing up on top of the card with matching rounded corners */}
-
+
- {beautifyString(block.name)} + {beautifyString(block.name).replace(/ Block$/, "")} - + {block.description}
+ > + +
))} diff --git a/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx b/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx index ff4f398c98..b0572b106a 100644 --- a/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx +++ b/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx @@ -114,7 +114,7 @@ function AgentDetailContent({ agent }: { agent: AgentDetailResponse }) { {agent.description}

-
+
diff --git a/autogpt_platform/frontend/src/components/nav/CreditButton.tsx b/autogpt_platform/frontend/src/components/nav/CreditButton.tsx index d806153982..0a8d9d446c 100644 --- a/autogpt_platform/frontend/src/components/nav/CreditButton.tsx +++ b/autogpt_platform/frontend/src/components/nav/CreditButton.tsx @@ -1,21 +1,23 @@ "use client"; -import { useState, useEffect } from "react"; +import { useState, useEffect, useCallback } from "react"; import { Button } from "@/components/ui/button"; -import { IconRefresh, IconCoin } from "@/components/ui/icons"; +import { IconRefresh } from "@/components/ui/icons"; import AutoGPTServerAPI from "@/lib/autogpt-server-api"; +const api = new AutoGPTServerAPI(); + export default function CreditButton() { const [credit, setCredit] = useState(null); - const api = new AutoGPTServerAPI(); - const fetchCredit = async () => { + const fetchCredit = useCallback(async () => { const response = await api.getUserCredit(); setCredit(response.credits); - }; + }, []); + useEffect(() => { fetchCredit(); - }, [api]); + }, [fetchCredit]); return ( credit !== null && ( diff --git a/autogpt_platform/frontend/src/components/node-input-components.tsx b/autogpt_platform/frontend/src/components/node-input-components.tsx index cec4ee1e50..b128cd1241 100644 --- a/autogpt_platform/frontend/src/components/node-input-components.tsx +++ b/autogpt_platform/frontend/src/components/node-input-components.tsx @@ -9,7 +9,6 @@ import { BlockIOStringSubSchema, BlockIONumberSubSchema, BlockIOBooleanSubSchema, - BlockIOCredentialsSubSchema, } from "@/lib/autogpt-server-api/types"; import React, { FC, useCallback, useEffect, useState } from "react"; import { Button } from "./ui/button"; @@ -313,6 +312,18 @@ const NodeCredentialsInput: FC<{ ); }; +const InputRef = (value: any): React.RefObject => { + const inputRef = React.useRef(null); + + useEffect(() => { + if (inputRef.current && value && inputRef.current.value !== value) { + inputRef.current.value = value; + } + }, [value]); + + return inputRef; +}; + const NodeKeyValueInput: FC<{ selfKey: string; schema: BlockIOKVSubSchema; @@ -384,14 +395,15 @@ const NodeKeyValueInput: FC<{ } return ( -
- {displayName && {displayName}} +
0 ? "flex flex-col" : "")} + >
{keyValuePairs.map(({ key, value }, index) => (
{key && ( updateKeyValuePairs( keyValuePairs.toSpliced(index, 1, { @@ -445,7 +457,7 @@ const NodeKeyValueInput: FC<{
))} + + )}
- - {data.categories[0].category} - - - -
- {/* Body */} -
- {/* Input Handles */} - {data.uiType !== BlockUIType.NOTE ? ( -
-
- {data.inputSchema && - generateInputHandles(data.inputSchema, data.uiType)} -
-
- ) : ( + {blockCost && ( +
+ + {blockCost.cost_amount} credits/{blockCost.cost_type} + +
+ )} + {data.uiType !== BlockUIType.NOTE ? ( +
{data.inputSchema && generateInputHandles(data.inputSchema, data.uiType)}
- )} - - {/* Advanced Settings */} - {data.uiType !== BlockUIType.NOTE && hasAdvancedFields && ( - <> - -
- Advanced - -
- - )} - {/* Output Handles */} - {data.uiType !== BlockUIType.NOTE && ( - <> - -
-
- {data.outputSchema && - generateOutputHandles(data.outputSchema, data.uiType)} -
-
- - )} -
- {/* End Body */} - {/* Footer */} -
- {/* Display Outputs */} - {isOutputOpen && data.uiType !== BlockUIType.NOTE && ( -
- {(data.executionResults?.length ?? 0) > 0 ? ( -
- - -
- -
-
- ) : ( -
- )} -
- - {hasConfigErrors || hasOutputError - ? "Error" - : data.status - ? beautifyString(data.status) - : "Not Run"} - -
+
+ {data.outputSchema && + generateOutputHandles(data.outputSchema, data.uiType)}
- )} -
+
+ ) : ( +
+ {data.inputSchema && + generateInputHandles(data.inputSchema, data.uiType)} +
+ )} + {isOutputOpen && data.uiType !== BlockUIType.NOTE && ( +
+ {(data.executionResults?.length ?? 0) > 0 ? ( + <> + +
+ +
+ + ) : ( + No outputs yet + )} +
+ )} + {data.uiType !== BlockUIType.NOTE && ( +
+ + Output + {hasAdvancedFields && ( + <> + + Advanced + + )} + {data.status && ( + + {data.status} + + )} +
+ )}
); - - return ( - - - - - - ); } diff --git a/autogpt_platform/frontend/src/components/Flow.tsx b/autogpt_platform/frontend/src/components/Flow.tsx index 8871f804aa..3b24dc964d 100644 --- a/autogpt_platform/frontend/src/components/Flow.tsx +++ b/autogpt_platform/frontend/src/components/Flow.tsx @@ -421,7 +421,7 @@ const FlowEditor: React.FC<{ history.push({ type: "ADD_NODE", - payload: { node: { ...newNode, ...newNode.data } }, + payload: { node: newNode.data }, undo: () => deleteElements({ nodes: [{ id: newNode.id }] }), redo: () => addNodes(newNode), }); diff --git a/autogpt_platform/frontend/src/components/NodeHandle.tsx b/autogpt_platform/frontend/src/components/NodeHandle.tsx index e42b740d3b..d059d65678 100644 --- a/autogpt_platform/frontend/src/components/NodeHandle.tsx +++ b/autogpt_platform/frontend/src/components/NodeHandle.tsx @@ -31,27 +31,20 @@ const NodeHandle: FC = ({ const typeClass = `text-sm ${getTypeTextColor(schema.type || "any")} ${side === "left" ? "text-left" : "text-right"}`; const label = ( -
- - {schema.title || beautifyString(keyName.toLowerCase())} +
+ + {schema.title || beautifyString(keyName)} {isRequired ? "*" : ""} - - ({typeName[schema.type as keyof typeof typeName] || "any"}) - + {typeName[schema.type] || "any"}
); - const Dot = ({ className = "" }) => { - const color = isConnected - ? getTypeBgColor(schema.type || "any") - : "border-gray-300"; - return ( -
- ); - }; + const dot = ( +
+ ); if (side === "left") { return ( @@ -60,10 +53,10 @@ const NodeHandle: FC = ({ type="target" position={Position.Left} id={keyName} - className="-ml-[26px]" + className="background-color: white; border: 2px solid black; width: 15px; height: 15px; border-radius: 50%; bottom: -7px; left: 20%; group -ml-[26px]" >
- + {dot} {label}
@@ -81,7 +74,7 @@ const NodeHandle: FC = ({ >
{label} - + {dot}
diff --git a/autogpt_platform/frontend/src/components/NodeOutputs.tsx b/autogpt_platform/frontend/src/components/NodeOutputs.tsx deleted file mode 100644 index c7b7dc5710..0000000000 --- a/autogpt_platform/frontend/src/components/NodeOutputs.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from "react"; -import { ContentRenderer } from "./ui/render"; -import { beautifyString } from "@/lib/utils"; -import * as Separator from "@radix-ui/react-separator"; - -type NodeOutputsProps = { - title?: string; - truncateLongData?: boolean; - data: { [key: string]: Array }; -}; - -export default function NodeOutputs({ - title, - truncateLongData, - data, -}: NodeOutputsProps) { - return ( -
- {title && {title}} - {Object.entries(data).map(([pin, dataArray]) => ( -
-
- Pin: - {beautifyString(pin)} -
- -
- Data: -
- {dataArray.map((item, index) => ( - - - {index < dataArray.length - 1 && ", "} - - ))} -
-
-
- ))} -
- ); -} diff --git a/autogpt_platform/frontend/src/components/OutputModalComponent.tsx b/autogpt_platform/frontend/src/components/OutputModalComponent.tsx index 082bdb022d..fcf33049f2 100644 --- a/autogpt_platform/frontend/src/components/OutputModalComponent.tsx +++ b/autogpt_platform/frontend/src/components/OutputModalComponent.tsx @@ -26,7 +26,7 @@ const OutputModalComponent: FC = ({
Output Data History -
+
{executionResults.map((data, i) => ( <> diff --git a/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx b/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx index 25743c6805..2d399306eb 100644 --- a/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx +++ b/autogpt_platform/frontend/src/components/PrimaryActionButton.tsx @@ -59,7 +59,7 @@ const PrimaryActionBar: React.FC = ({ onClick={runButtonOnClick} size="primary" style={{ - background: isRunning ? "#DF4444" : "#7544DF", + background: isRunning ? "#FFB3BA" : "#7544DF", opacity: isDisabled ? 0.5 : 1, }} > diff --git a/autogpt_platform/frontend/src/components/TallyPopup.tsx b/autogpt_platform/frontend/src/components/TallyPopup.tsx index 89b02cf49a..e36738598d 100644 --- a/autogpt_platform/frontend/src/components/TallyPopup.tsx +++ b/autogpt_platform/frontend/src/components/TallyPopup.tsx @@ -1,7 +1,7 @@ "use client"; import React, { useEffect, useState } from "react"; import { Button } from "./ui/button"; -import { QuestionMarkCircledIcon } from "@radix-ui/react-icons"; +import { IconMegaphone } from "@/components/ui/icons"; import { useRouter } from "next/navigation"; const TallyPopupSimple = () => { @@ -48,22 +48,17 @@ const TallyPopupSimple = () => { }; return ( -
-
diff --git a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx index beecf76725..0813d08d97 100644 --- a/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx +++ b/autogpt_platform/frontend/src/components/edit/control/BlocksControl.tsx @@ -2,6 +2,7 @@ import React, { useState } from "react"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; +import { ToyBrick } from "lucide-react"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { beautifyString } from "@/lib/utils"; @@ -11,9 +12,11 @@ import { PopoverTrigger, } from "@/components/ui/popover"; import { Block } from "@/lib/autogpt-server-api"; -import { MagnifyingGlassIcon, PlusIcon } from "@radix-ui/react-icons"; +import { PlusIcon } from "@radix-ui/react-icons"; import { IconToyBrick } from "@/components/ui/icons"; +import SchemaTooltip from "@/components/SchemaTooltip"; import { getPrimaryCategoryColor } from "@/lib/utils"; +import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, @@ -52,10 +55,9 @@ export const BlocksControl: React.FC = ({ // Extract unique categories from blocks const categories = Array.from( - new Set([ - null, - ...blocks.flatMap((block) => block.categories.map((cat) => cat.category)), - ]), + new Set( + blocks.flatMap((block) => block.categories.map((cat) => cat.category)), + ), ); React.useEffect(() => { @@ -95,93 +97,80 @@ export const BlocksControl: React.FC = ({ side="right" sideOffset={22} align="start" - className="absolute -top-3 w-[17rem] rounded-xl p-0 md:w-[30rem]" + className="w-[30rem] p-0" data-id="blocks-control-popover-content" > - - + +
-
- - setSearchQuery(e.target.value)} - className="rounded-lg px-8 py-5" - data-id="blocks-control-search-input" - /> -
+ setSearchQuery(e.target.value)} + data-id="blocks-control-search-input" + />
- {categories.map((category) => { - const color = getPrimaryCategoryColor([ - { category: category || "All", description: "" }, - ]); - const colorClass = - selectedCategory === category ? `${color}` : ""; - return ( -
- setSelectedCategory( - selectedCategory === category ? null : category, - ) - } - > - {beautifyString( - category && category.length > 3 - ? category.toLowerCase() - : category || "All", - )} -
- ); - })} + {categories.map((category) => ( + + setSelectedCategory( + selectedCategory === category ? null : category, + ) + } + > + {beautifyString(category)} + + ))}
- + {filteredBlocks.map((block) => ( addBlock(block.id, block.name)} > + {/* This div needs to be 10px wide and the same height as the card and be the primary color showing up on top of the card with matching rounded corners */}
-
+
- {beautifyString(block.name).replace(/ Block$/, "")} + {beautifyString(block.name)} - + {block.description}
- -
+ >
))} diff --git a/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx b/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx index b0572b106a..ff4f398c98 100644 --- a/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx +++ b/autogpt_platform/frontend/src/components/marketplace/AgentDetailContent.tsx @@ -114,7 +114,7 @@ function AgentDetailContent({ agent }: { agent: AgentDetailResponse }) { {agent.description}

-
+
diff --git a/autogpt_platform/frontend/src/components/nav/CreditButton.tsx b/autogpt_platform/frontend/src/components/nav/CreditButton.tsx index 0a8d9d446c..d806153982 100644 --- a/autogpt_platform/frontend/src/components/nav/CreditButton.tsx +++ b/autogpt_platform/frontend/src/components/nav/CreditButton.tsx @@ -1,23 +1,21 @@ "use client"; -import { useState, useEffect, useCallback } from "react"; +import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; -import { IconRefresh } from "@/components/ui/icons"; +import { IconRefresh, IconCoin } from "@/components/ui/icons"; import AutoGPTServerAPI from "@/lib/autogpt-server-api"; -const api = new AutoGPTServerAPI(); - export default function CreditButton() { const [credit, setCredit] = useState(null); + const api = new AutoGPTServerAPI(); - const fetchCredit = useCallback(async () => { + const fetchCredit = async () => { const response = await api.getUserCredit(); setCredit(response.credits); - }, []); - + }; useEffect(() => { fetchCredit(); - }, [fetchCredit]); + }, [api]); return ( credit !== null && ( diff --git a/autogpt_platform/frontend/src/components/node-input-components.tsx b/autogpt_platform/frontend/src/components/node-input-components.tsx index 0d00d7de71..cec4ee1e50 100644 --- a/autogpt_platform/frontend/src/components/node-input-components.tsx +++ b/autogpt_platform/frontend/src/components/node-input-components.tsx @@ -9,6 +9,7 @@ import { BlockIOStringSubSchema, BlockIONumberSubSchema, BlockIOBooleanSubSchema, + BlockIOCredentialsSubSchema, } from "@/lib/autogpt-server-api/types"; import React, { FC, useCallback, useEffect, useState } from "react"; import { Button } from "./ui/button"; @@ -312,10 +313,6 @@ const NodeCredentialsInput: FC<{ ); }; -const InputRef = (value: any): ((el: HTMLInputElement | null) => void) => { - return (el) => el && (el.value = value); -}; - const NodeKeyValueInput: FC<{ selfKey: string; schema: BlockIOKVSubSchema; @@ -387,15 +384,14 @@ const NodeKeyValueInput: FC<{ } return ( -
0 ? "flex flex-col" : "")} - > +
+ {displayName && {displayName}}
{keyValuePairs.map(({ key, value }, index) => (
{key && ( updateKeyValuePairs( keyValuePairs.toSpliced(index, 1, { @@ -449,7 +445,7 @@ const NodeKeyValueInput: FC<{
))} @@ -81,6 +87,7 @@ export const SaveControl = ({ className="col-span-3" value={agentName} onChange={(e) => onNameChange(e.target.value)} + data-id="save-control-name-input" /> onDescriptionChange(e.target.value)} + data-id="save-control-description-input" /> {agentMeta?.version && ( <> @@ -105,13 +113,18 @@ export const SaveControl = ({
- {!agentMeta && ( +
@@ -128,6 +143,36 @@ export const FlowInfo: React.FC< )} /> + + + + Delete Agent + + Are you sure you want to delete this agent?
+ This action cannot be undone. +
+
+ + + + +
+
); }; diff --git a/autogpt_platform/frontend/src/lib/autogpt-server-api/baseClient.ts b/autogpt_platform/frontend/src/lib/autogpt-server-api/baseClient.ts index 19d8550d87..28b14b3ff5 100644 --- a/autogpt_platform/frontend/src/lib/autogpt-server-api/baseClient.ts +++ b/autogpt_platform/frontend/src/lib/autogpt-server-api/baseClient.ts @@ -124,6 +124,10 @@ export default class BaseAutoGPTServerAPI { return this._request("PUT", `/templates/${id}`, template); } + deleteGraph(id: string): Promise { + return this._request("DELETE", `/graphs/${id}`); + } + setGraphActiveVersion(id: string, version: number): Promise { return this._request("PUT", `/graphs/${id}/versions/active`, { active_graph_version: version, From 04473cad1e73f236bc1431719adbad144b48e1c8 Mon Sep 17 00:00:00 2001 From: Nicholas Tindle Date: Tue, 8 Oct 2024 11:11:14 -0500 Subject: [PATCH 058/155] feat(docs): OAuth docs updates based on google block changes (#8243) * feat(frontend,backend): testing * feat: testing * feat(backend): it works for reading email * feat(backend): more docs on google * fix(frontend,backend): formatting * feat(backend): more logigin (i know this should be debug) * feat(backend): make real the default scopes * feat(backend): tests and linting * fix: code review prep * feat: sheets block * feat: liniting * Update route.ts * Update autogpt_platform/backend/backend/integrations/oauth/google.py Co-authored-by: Reinier van der Leer * Update autogpt_platform/backend/backend/server/routers/integrations.py Co-authored-by: Reinier van der Leer * fix: revert opener change * feat(frontend): add back opener required to work on mac edge * feat(frontend): drop typing list import from gmail * fix: code review comments * feat: code review changes * feat: code review changes * fix(backend): move from asserts to checks so they don't get optimized away in the future * fix(backend): code review changes * fix(backend): remove google specific check * fix: add typing * fix: only enable google blocks when oauth is configured for google * fix: errors are real and valid outputs always when output * fix(backend): add provider detail for debuging scope declines * Update autogpt_platform/frontend/src/components/integrations/credentials-input.tsx Co-authored-by: Reinier van der Leer * fix(frontend): enhance with comment, typeof error isn't known so this is best way to ensure the stringifyication will work * feat: code review change requests * fix: linting * fix: reduce error catching * fix: doc messages in code * fix: check the correct scopes object :smile: * fix: remove double (and not needed) try catch * fix: lint * fix: scopes * feat: handle the default scopes better * feat: better email objectification * feat: process attachements turns out an email doesn't need a body * fix: lint * Update google.py * Update autogpt_platform/backend/backend/data/block.py Co-authored-by: Reinier van der Leer * fix: quit trying and except failure * Update autogpt_platform/backend/backend/server/routers/integrations.py Co-authored-by: Reinier van der Leer * feat: don't allow expired states * fix: clarify function name and purpose * feat: code links updates * feat: additional docs on adding a block * fix: type hint missing which means the block won't work * fix: linting * fix: docs formatting * Update issues.py * fix: improve the naming * fix: formatting * Update new_blocks.md * Update new_blocks.md * feat: better docs on what the args mean * feat: more details on yield * Update new_blocks.md * fix: remove ignore from docs build --------- Co-authored-by: Reinier van der Leer Co-authored-by: Zamil Majdy --- .../backend/backend/blocks/github/issues.py | 4 + .../backend/backend/blocks/google/_auth.py | 3 +- .../backend/integrations/oauth/__init__.py | 2 + .../backend/integrations/oauth/base.py | 11 + .../backend/integrations/oauth/github.py | 4 + .../backend/integrations/oauth/google.py | 2 + .../backend/backend/util/settings.py | 2 + .../integrations/credentials-input.tsx | 2 + .../integrations/credentials-provider.tsx | 2 + .../src/lib/autogpt-server-api/types.ts | 2 + docs/content/server/new_blocks.md | 189 ++++++++++++------ docs/mkdocs.yml | 5 +- docs/netlify.toml | 1 - 13 files changed, 165 insertions(+), 64 deletions(-) diff --git a/autogpt_platform/backend/backend/blocks/github/issues.py b/autogpt_platform/backend/backend/blocks/github/issues.py index 97a4694340..0ddeb547ee 100644 --- a/autogpt_platform/backend/backend/blocks/github/issues.py +++ b/autogpt_platform/backend/backend/blocks/github/issues.py @@ -13,6 +13,7 @@ from ._auth import ( ) +# --8<-- [start:GithubCommentBlockExample] class GithubCommentBlock(Block): class Input(BlockSchema): credentials: GithubCredentialsInput = GithubCredentialsField("repo") @@ -104,6 +105,9 @@ class GithubCommentBlock(Block): yield "error", f"Failed to post comment: {str(e)}" +# --8<-- [end:GithubCommentBlockExample] + + class GithubMakeIssueBlock(Block): class Input(BlockSchema): credentials: GithubCredentialsInput = GithubCredentialsField("repo") diff --git a/autogpt_platform/backend/backend/blocks/google/_auth.py b/autogpt_platform/backend/backend/blocks/google/_auth.py index 207861847d..742fcb36fa 100644 --- a/autogpt_platform/backend/backend/blocks/google/_auth.py +++ b/autogpt_platform/backend/backend/blocks/google/_auth.py @@ -6,11 +6,12 @@ from pydantic import SecretStr from backend.data.model import CredentialsField, CredentialsMetaInput from backend.util.settings import Secrets +# --8<-- [start:GoogleOAuthIsConfigured] secrets = Secrets() GOOGLE_OAUTH_IS_CONFIGURED = bool( secrets.google_client_id and secrets.google_client_secret ) - +# --8<-- [end:GoogleOAuthIsConfigured] GoogleCredentials = OAuth2Credentials GoogleCredentialsInput = CredentialsMetaInput[Literal["google"], Literal["oauth2"]] diff --git a/autogpt_platform/backend/backend/integrations/oauth/__init__.py b/autogpt_platform/backend/backend/integrations/oauth/__init__.py index 3ce18050a0..834293da92 100644 --- a/autogpt_platform/backend/backend/integrations/oauth/__init__.py +++ b/autogpt_platform/backend/backend/integrations/oauth/__init__.py @@ -3,6 +3,7 @@ from .github import GitHubOAuthHandler from .google import GoogleOAuthHandler from .notion import NotionOAuthHandler +# --8<-- [start:HANDLERS_BY_NAMEExample] HANDLERS_BY_NAME: dict[str, type[BaseOAuthHandler]] = { handler.PROVIDER_NAME: handler for handler in [ @@ -11,5 +12,6 @@ HANDLERS_BY_NAME: dict[str, type[BaseOAuthHandler]] = { NotionOAuthHandler, ] } +# --8<-- [end:HANDLERS_BY_NAMEExample] __all__ = ["HANDLERS_BY_NAME"] diff --git a/autogpt_platform/backend/backend/integrations/oauth/base.py b/autogpt_platform/backend/backend/integrations/oauth/base.py index fc278c7cff..61ea7e5b49 100644 --- a/autogpt_platform/backend/backend/integrations/oauth/base.py +++ b/autogpt_platform/backend/backend/integrations/oauth/base.py @@ -9,26 +9,37 @@ logger = logging.getLogger(__name__) class BaseOAuthHandler(ABC): + # --8<-- [start:BaseOAuthHandler1] PROVIDER_NAME: ClassVar[str] DEFAULT_SCOPES: ClassVar[list[str]] = [] + # --8<-- [end:BaseOAuthHandler1] @abstractmethod + # --8<-- [start:BaseOAuthHandler2] def __init__(self, client_id: str, client_secret: str, redirect_uri: str): ... + # --8<-- [end:BaseOAuthHandler2] + @abstractmethod + # --8<-- [start:BaseOAuthHandler3] def get_login_url(self, scopes: list[str], state: str) -> str: + # --8<-- [end:BaseOAuthHandler3] """Constructs a login URL that the user can be redirected to""" ... @abstractmethod + # --8<-- [start:BaseOAuthHandler4] def exchange_code_for_tokens( self, code: str, scopes: list[str] ) -> OAuth2Credentials: + # --8<-- [end:BaseOAuthHandler4] """Exchanges the acquired authorization code from login for a set of tokens""" ... @abstractmethod + # --8<-- [start:BaseOAuthHandler5] def _refresh_tokens(self, credentials: OAuth2Credentials) -> OAuth2Credentials: + # --8<-- [end:BaseOAuthHandler5] """Implements the token refresh mechanism""" ... diff --git a/autogpt_platform/backend/backend/integrations/oauth/github.py b/autogpt_platform/backend/backend/integrations/oauth/github.py index 9741a96beb..03da15f403 100644 --- a/autogpt_platform/backend/backend/integrations/oauth/github.py +++ b/autogpt_platform/backend/backend/integrations/oauth/github.py @@ -8,6 +8,7 @@ from autogpt_libs.supabase_integration_credentials_store import OAuth2Credential from .base import BaseOAuthHandler +# --8<-- [start:GithubOAuthHandlerExample] class GitHubOAuthHandler(BaseOAuthHandler): """ Based on the documentation at: @@ -119,3 +120,6 @@ class GitHubOAuthHandler(BaseOAuthHandler): # Get the login (username) return response.json().get("login") + + +# --8<-- [end:GithubOAuthHandlerExample] diff --git a/autogpt_platform/backend/backend/integrations/oauth/google.py b/autogpt_platform/backend/backend/integrations/oauth/google.py index 81ab34a3df..642627d29e 100644 --- a/autogpt_platform/backend/backend/integrations/oauth/google.py +++ b/autogpt_platform/backend/backend/integrations/oauth/google.py @@ -14,6 +14,7 @@ from .base import BaseOAuthHandler logger = logging.getLogger(__name__) +# --8<-- [start:GoogleOAuthHandlerExample] class GoogleOAuthHandler(BaseOAuthHandler): """ Based on the documentation at https://developers.google.com/identity/protocols/oauth2/web-server @@ -26,6 +27,7 @@ class GoogleOAuthHandler(BaseOAuthHandler): "https://www.googleapis.com/auth/userinfo.profile", "openid", ] + # --8<-- [end:GoogleOAuthHandlerExample] def __init__(self, client_id: str, client_secret: str, redirect_uri: str): self.client_id = client_id diff --git a/autogpt_platform/backend/backend/util/settings.py b/autogpt_platform/backend/backend/util/settings.py index 06222492b3..14af86a8a2 100644 --- a/autogpt_platform/backend/backend/util/settings.py +++ b/autogpt_platform/backend/backend/util/settings.py @@ -189,10 +189,12 @@ class Secrets(UpdateTrackingModel["Secrets"], BaseSettings): ) # OAuth server credentials for integrations + # --8<-- [start:OAuthServerCredentialsExample] github_client_id: str = Field(default="", description="GitHub OAuth client ID") github_client_secret: str = Field( default="", description="GitHub OAuth client secret" ) + # --8<-- [end:OAuthServerCredentialsExample] google_client_id: str = Field(default="", description="Google OAuth client ID") google_client_secret: str = Field( default="", description="Google OAuth client secret" diff --git a/autogpt_platform/frontend/src/components/integrations/credentials-input.tsx b/autogpt_platform/frontend/src/components/integrations/credentials-input.tsx index 8cb0b52401..dca42cb1bc 100644 --- a/autogpt_platform/frontend/src/components/integrations/credentials-input.tsx +++ b/autogpt_platform/frontend/src/components/integrations/credentials-input.tsx @@ -44,11 +44,13 @@ import { SelectValue, } from "@/components/ui/select"; +// --8<-- [start:ProviderIconsEmbed] const providerIcons: Record> = { github: FaGithub, google: FaGoogle, notion: NotionLogoIcon, }; +// --8<-- [end:ProviderIconsEmbed] export type OAuthPopupResultMessage = { message_type: "oauth_popup_result" } & ( | { diff --git a/autogpt_platform/frontend/src/components/integrations/credentials-provider.tsx b/autogpt_platform/frontend/src/components/integrations/credentials-provider.tsx index 96a37e40cd..4959c80e41 100644 --- a/autogpt_platform/frontend/src/components/integrations/credentials-provider.tsx +++ b/autogpt_platform/frontend/src/components/integrations/credentials-provider.tsx @@ -10,6 +10,7 @@ import { useState, } from "react"; +// --8<-- [start:CredentialsProviderNames] const CREDENTIALS_PROVIDER_NAMES = ["github", "google", "notion"] as const; type CredentialsProviderName = (typeof CREDENTIALS_PROVIDER_NAMES)[number]; @@ -19,6 +20,7 @@ const providerDisplayNames: Record = { google: "Google", notion: "Notion", }; +// --8<-- [end:CredentialsProviderNames] type APIKeyCredentialsCreatable = Omit< APIKeyCredentials, diff --git a/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts b/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts index 03a14f64c5..3ff52839c0 100644 --- a/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts +++ b/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts @@ -94,11 +94,13 @@ export type BlockIOBooleanSubSchema = BlockIOSubSchemaMeta & { export type CredentialsType = "api_key" | "oauth2"; +// --8<-- [start:BlockIOCredentialsSubSchema] export type BlockIOCredentialsSubSchema = BlockIOSubSchemaMeta & { credentials_provider: "github" | "google" | "notion"; credentials_scopes?: string[]; credentials_types: Array; }; +// --8<-- [end:BlockIOCredentialsSubSchema] export type BlockIONullSubSchema = BlockIOSubSchemaMeta & { type: "null"; diff --git a/docs/content/server/new_blocks.md b/docs/content/server/new_blocks.md index ae14f0bc38..a3085f1a7e 100644 --- a/docs/content/server/new_blocks.md +++ b/docs/content/server/new_blocks.md @@ -14,72 +14,72 @@ Follow these steps to create and test a new block: 2. **Import necessary modules and create a class that inherits from `Block`**. Make sure to include all necessary imports for your block. - Every block should contain the following: + Every block should contain the following: - ```python - from backend.data.block import Block, BlockSchema, BlockOutput - ``` + ```python + from backend.data.block import Block, BlockSchema, BlockOutput + ``` - Example for the Wikipedia summary block: + Example for the Wikipedia summary block: - ```python - from backend.data.block import Block, BlockSchema, BlockOutput - from backend.utils.get_request import GetRequest - import requests + ```python + from backend.data.block import Block, BlockSchema, BlockOutput + from backend.utils.get_request import GetRequest + import requests - class WikipediaSummaryBlock(Block, GetRequest): - # Block implementation will go here - ``` + class WikipediaSummaryBlock(Block, GetRequest): + # Block implementation will go here + ``` 3. **Define the input and output schemas** using `BlockSchema`. These schemas specify the data structure that the block expects to receive (input) and produce (output). - The input schema defines the structure of the data the block will process. Each field in the schema represents a required piece of input data. - The output schema defines the structure of the data the block will return after processing. Each field in the schema represents a piece of output data. - Example: + Example: - ```python - class Input(BlockSchema): - topic: str # The topic to get the Wikipedia summary for + ```python + class Input(BlockSchema): + topic: str # The topic to get the Wikipedia summary for - class Output(BlockSchema): - summary: str # The summary of the topic from Wikipedia - error: str # Any error message if the request fails - ``` + class Output(BlockSchema): + summary: str # The summary of the topic from Wikipedia + error: str # Any error message if the request fails + ``` 4. **Implement the `__init__` method, including test data and mocks:** !!! important - Use UUID generator (e.g. https://www.uuidgenerator.net/) for every new block `id` and *do not* make up your own. Alternatively, you can run this python code to generate an uuid: `print(__import__('uuid').uuid4())` + Use UUID generator (e.g. https://www.uuidgenerator.net/) for every new block `id` and *do not* make up your own. Alternatively, you can run this python code to generate an uuid: `print(__import__('uuid').uuid4())` - ```python - def __init__(self): - super().__init__( - # Unique ID for the block, used across users for templates - # If you are an AI leave it as is or change to "generate-proper-uuid" - id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", - input_schema=WikipediaSummaryBlock.Input, # Assign input schema - output_schema=WikipediaSummaryBlock.Output, # Assign output schema + ```python + def __init__(self): + super().__init__( + # Unique ID for the block, used across users for templates + # If you are an AI leave it as is or change to "generate-proper-uuid" + id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + input_schema=WikipediaSummaryBlock.Input, # Assign input schema + output_schema=WikipediaSummaryBlock.Output, # Assign output schema - # Provide sample input, output and test mock for testing the block + # Provide sample input, output and test mock for testing the block - test_input={"topic": "Artificial Intelligence"}, - test_output=("summary", "summary content"), - test_mock={"get_request": lambda url, json: {"extract": "summary content"}}, - ) - ``` + test_input={"topic": "Artificial Intelligence"}, + test_output=("summary", "summary content"), + test_mock={"get_request": lambda url, json: {"extract": "summary content"}}, + ) + ``` - - `id`: A unique identifier for the block. + - `id`: A unique identifier for the block. - - `input_schema` and `output_schema`: Define the structure of the input and output data. + - `input_schema` and `output_schema`: Define the structure of the input and output data. - Let's break down the testing components: + Let's break down the testing components: - - `test_input`: This is a sample input that will be used to test the block. It should be a valid input according to your Input schema. + - `test_input`: This is a sample input that will be used to test the block. It should be a valid input according to your Input schema. - - `test_output`: This is the expected output when running the block with the `test_input`. It should match your Output schema. For non-deterministic outputs or when you only want to assert the type, you can use Python types instead of specific values. In this example, `("summary", str)` asserts that the output key is "summary" and its value is a string. + - `test_output`: This is the expected output when running the block with the `test_input`. It should match your Output schema. For non-deterministic outputs or when you only want to assert the type, you can use Python types instead of specific values. In this example, `("summary", str)` asserts that the output key is "summary" and its value is a string. - - `test_mock`: This is crucial for blocks that make network calls. It provides a mock function that replaces the actual network call during testing. + - `test_mock`: This is crucial for blocks that make network calls. It provides a mock function that replaces the actual network call during testing. In this case, we're mocking the `get_request` method to always return a dictionary with an 'extract' key, simulating a successful API response. This allows us to test the block's logic without making actual network requests, which could be slow, unreliable, or rate-limited. @@ -105,7 +105,7 @@ Follow these steps to create and test a new block: - **Try block**: Contains the main logic to fetch and process the Wikipedia summary. - **API request**: Send a GET request to the Wikipedia API. - **Error handling**: Handle various exceptions that might occur during the API request and data processing. - - **Yield**: Use `yield` to output the results. + - **Yield**: Use `yield` to output the results. Prefer to output one result object at a time. If you are calling a function that returns a list, you can yield each item in the list separately. You can also yield the whole list as well, but do both rather than yielding the list. For example: If you were writing a block that outputs emails, you'd yield each email as a separate result object, but you could also yield the whole list as an additional single result object. ### Blocks with authentication @@ -115,6 +115,7 @@ for a service that we already have OAuth2 support for. Implementing the block itself is relatively simple. On top of the instructions above, you're going to add a `credentials` parameter to the `Input` model and the `run` method: + ```python from autogpt_libs.supabase_integration_credentials_store.types import ( APIKeyCredentials, @@ -129,10 +130,11 @@ from backend.data.model import CredentialsField # API Key auth: class BlockWithAPIKeyAuth(Block): class Input(BlockSchema): - credentials = CredentialsField( + # Note that the type hint below is require or you will get a type error. + # The first argument is the provider name, the second is the credential type. + credentials: CredentialsMetaInput[Literal['github'], Literal['api_key']] = CredentialsField( provider="github", supported_credential_types={"api_key"}, - required_scopes={"repo"}, description="The GitHub integration can be used with " "any API key with sufficient permissions for the blocks it is used on.", ) @@ -151,7 +153,9 @@ class BlockWithAPIKeyAuth(Block): # OAuth: class BlockWithOAuth(Block): class Input(BlockSchema): - credentials = CredentialsField( + # Note that the type hint below is require or you will get a type error. + # The first argument is the provider name, the second is the credential type. + credentials: CredentialsMetaInput[Literal['github'], Literal['oauth2']] = CredentialsField( provider="github", supported_credential_types={"oauth2"}, required_scopes={"repo"}, @@ -172,7 +176,9 @@ class BlockWithOAuth(Block): # API Key auth + OAuth: class BlockWithAPIKeyAndOAuth(Block): class Input(BlockSchema): - credentials = CredentialsField( + # Note that the type hint below is require or you will get a type error. + # The first argument is the provider name, the second is the credential type. + credentials: CredentialsMetaInput[Literal['github'], Literal['api_key', 'oauth2']] = CredentialsField( provider="github", supported_credential_types={"api_key", "oauth2"}, required_scopes={"repo"}, @@ -191,10 +197,12 @@ class BlockWithAPIKeyAndOAuth(Block): ) -> BlockOutput: ... ``` + The credentials will be automagically injected by the executor in the back end. The `APIKeyCredentials` and `OAuth2Credentials` models are defined [here](https://github.com/Significant-Gravitas/AutoGPT/blob/master/rnd/autogpt_libs/autogpt_libs/supabase_integration_credentials_store/types.py). To use them in e.g. an API request, you can either access the token directly: + ```python # credentials: APIKeyCredentials response = requests.post( @@ -212,7 +220,9 @@ response = requests.post( }, ) ``` + or use the shortcut `credentials.bearer()`: + ```python # credentials: APIKeyCredentials | OAuth2Credentials response = requests.post( @@ -227,25 +237,84 @@ To add support for a new OAuth2-authenticated service, you'll need to add an `OA All our existing handlers and the base class can be found [here][OAuth2 handlers]. Every handler must implement the following parts of the [`BaseOAuthHandler`] interface: -- `PROVIDER_NAME` -- `__init__(client_id, client_secret, redirect_uri)` -- `get_login_url(scopes, state)` -- `exchange_code_for_tokens(code)` -- `_refresh_tokens(credentials)` + +```python title="autogpt_platform/backend/backend/integrations/oauth/base.py" +--8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler1" +--8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler2" +--8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler3" +--8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler4" +--8<-- "autogpt_platform/backend/backend/integrations/oauth/base.py:BaseOAuthHandler5" +``` As you can see, this is modeled after the standard OAuth2 flow. Aside from implementing the `OAuthHandler` itself, adding a handler into the system requires two more things: -- Adding the handler class to `HANDLERS_BY_NAME` [here](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/__init__.py) -- Adding `{provider}_client_id` and `{provider}_client_secret` to the application's `Secrets` [here](https://github.com/Significant-Gravitas/AutoGPT/blob/e3f35d79c7e9fc6ee0cabefcb73e0fad15a0ce2d/autogpt_platform/backend/backend/util/settings.py#L132) + +- Adding the handler class to `HANDLERS_BY_NAME` under [`integrations/oauth/__init__.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/__init__.py) + +```python title="autogpt_platform/backend/backend/integrations/oauth/__init__.py" +--8<-- "autogpt_platform/backend/backend/integrations/oauth/__init__.py:HANDLERS_BY_NAMEExample" +``` + +- Adding `{provider}_client_id` and `{provider}_client_secret` to the application's `Secrets` under [`util/settings.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/util/settings.py) + +```python title="autogpt_platform/backend/backend/util/settings.py" +--8<-- "autogpt_platform/backend/backend/util/settings.py:OAuthServerCredentialsExample" +``` [OAuth2 handlers]: https://github.com/Significant-Gravitas/AutoGPT/tree/master/autogpt_platform/backend/backend/integrations/oauth [`BaseOAuthHandler`]: https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/base.py +#### Adding to the frontend + +You will need to add the provider (api or oauth) to the `CredentialsInput` component in [`frontend/src/components/integrations/credentials-input.tsx`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/frontend/src/components/integrations/credentials-input.tsx). + +```ts title="frontend/src/components/integrations/credentials-input.tsx" +--8<-- "autogpt_platform/frontend/src/components/integrations/credentials-input.tsx:ProviderIconsEmbed" +``` + +You will also need to add the provider to the `CredentialsProvider` component in [`frontend/src/components/integrations/credentials-provider.tsx`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/frontend/src/components/integrations/credentials-provider.tsx). + +```ts title="frontend/src/components/integrations/credentials-provider.tsx" +--8<-- "autogpt_platform/frontend/src/components/integrations/credentials-provider.tsx:CredentialsProviderNames" +``` + +Finally you will need to add the provider to the `CredentialsType` enum in [`frontend/src/lib/autogpt-server-api/types.ts`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts). + +```ts title="frontend/src/lib/autogpt-server-api/types.ts" +--8<-- "autogpt_platform/frontend/src/lib/autogpt-server-api/types.ts:BlockIOCredentialsSubSchema" +``` + #### Example: GitHub integration + - GitHub blocks with API key + OAuth2 support: [`blocks/github`](https://github.com/Significant-Gravitas/AutoGPT/tree/master/autogpt_platform/backend/backend/blocks/github/) + +```python title="blocks/github/issues.py" +--8<-- "autogpt_platform/backend/backend/blocks/github/issues.py:GithubCommentBlockExample" +``` + - GitHub OAuth2 handler: [`integrations/oauth/github.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/github.py) +```python title="blocks/github/github.py" +--8<-- "autogpt_platform/backend/backend/integrations/oauth/github.py:GithubOAuthHandlerExample" +``` + +#### Example: Google integration + +- Google OAuth2 handler: [`integrations/oauth/google.py`](https://github.com/Significant-Gravitas/AutoGPT/blob/master/autogpt_platform/backend/backend/integrations/oauth/google.py) + +```python title="integrations/oauth/google.py" +--8<-- "autogpt_platform/backend/backend/integrations/oauth/google.py:GoogleOAuthHandlerExample" +``` + +You can see that google has defined a `DEFAULT_SCOPES` variable, this is used to set the scopes that are requested no matter what the user asks for. + +```python title="blocks/google/_auth.py" +--8<-- "autogpt_platform/backend/backend/blocks/google/_auth.py:GoogleOAuthIsConfigured" +``` + +You can also see that `GOOGLE_OAUTH_IS_CONFIGURED` is used to disable the blocks that require OAuth if the oauth is not configured. This is in the `__init__` method of each block. This is because there is no api key fallback for google blocks so we need to make sure that the oauth is configured before we allow the user to use the blocks. + ## Key Points to Remember - **Unique ID**: Give your block a unique ID in the **init** method. @@ -275,7 +344,8 @@ This approach allows us to test the block's logic comprehensively without relyin 1. **Provide realistic test_input**: Ensure your test input covers typical use cases. -2. **Define appropriate test_output**: +2. **Define appropriate test_output**: + - For deterministic outputs, use specific expected values. - For non-deterministic outputs or when only the type matters, use Python types (e.g., `str`, `int`, `dict`). - You can mix specific values and types, e.g., `("key1", str), ("key2", 42)`. @@ -292,14 +362,14 @@ By following these steps, you can create new blocks that extend the functionalit ## Blocks we want to see -Below is a list of blocks that we would like to see implemented in the AutoGPT Agent Server. If you're interested in contributing, feel free to pick one of these blocks or suggest your own by editing [docs/content/server/new_blocks.md](https://github.com/Significant-Gravitas/AutoGPT/edit/master/docs/content/server/new_blocks.md) and opening a pull request. +Below is a list of blocks that we would like to see implemented in the AutoGPT Agent Server. If you're interested in contributing, feel free to pick one of these blocks or chose your own. If you would like to implement one of these blocks, open a pull request and we will start the review process. ### Consumer Services/Platforms -- Google sheets - Read/Append [Read in Progress](https://github.com/Significant-Gravitas/AutoGPT/pull/7521) -- Email - Read/Send with Gmail, Outlook, Yahoo, Proton, etc +- Google sheets - [~~Read/Append~~](https://github.com/Significant-Gravitas/AutoGPT/pull/8236) +- Email - Read/Send with [~~Gmail~~](https://github.com/Significant-Gravitas/AutoGPT/pull/8236), Outlook, Yahoo, Proton, etc - Calendar - Read/Write with Google Calendar, Outlook Calendar, etc - Home Assistant - Call Service, Get Status - Dominos - Order Pizza, Track Order @@ -346,7 +416,6 @@ If you would like to implement one of these blocks, open a pull request and we w ## Agent Templates we want to see - ### Data/Information - Summarize top news of today, of this week, this month via Apple News or other large media outlets BBC, TechCrunch, hackernews, etc @@ -358,9 +427,9 @@ If you would like to implement one of these blocks, open a pull request and we w - Get dates for specific shows across all streaming services - Suggest/Recommend/Get most watched shows in a given month, year, etc across all streaming platforms - Data analysis from xlsx data set - - Gather via Excel or Google Sheets data > Sample the data randomly (sample block takes top X, bottom X, randomly, etc) > pass that to LLM Block to generate a script for analysis of the full data > Python block to run the script> making a loop back through LLM Fix Block on error > create chart/visualization (potentially in the code block?) > show the image as output (this may require frontend changes to show) + - Gather via Excel or Google Sheets data > Sample the data randomly (sample block takes top X, bottom X, randomly, etc) > pass that to LLM Block to generate a script for analysis of the full data > Python block to run the script> making a loop back through LLM Fix Block on error > create chart/visualization (potentially in the code block?) > show the image as output (this may require frontend changes to show) - Tiktok video search and download -### Marketing +### Marketing - Portfolio site design and enhancements diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 28dc686c43..06025121a4 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -136,8 +136,9 @@ markdown_extensions: - pymdownx.mark - pymdownx.smartsymbols - pymdownx.snippets: - auto_append: - - includes/abbreviations.md + base_path: ['.','../'] + check_paths: true + dedent_subsections: true - pymdownx.superfences: custom_fences: - name: mermaid diff --git a/docs/netlify.toml b/docs/netlify.toml index e542e18240..c07b733a57 100644 --- a/docs/netlify.toml +++ b/docs/netlify.toml @@ -3,4 +3,3 @@ [build] publish = "public/" command = "mkdocs build -d public" - ignore = "git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF . ../CONTRIBUTING.md ../CODE_OF_CONDUCT.md" From bc1df92c294557152f3d1aca4560d304f9a5c00c Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Tue, 8 Oct 2024 20:20:18 +0100 Subject: [PATCH 059/155] fix(platform): Fix marketplace leaking secrets (#8281) * add hide secrets param * Update autogpt_platform/backend/backend/data/graph.py Co-authored-by: Reinier van der Leer * Update autogpt_platform/frontend/src/lib/autogpt-server-api/baseClient.ts Co-authored-by: Reinier van der Leer * rename hide secrets * use builtin dict * delete key --------- Co-authored-by: Reinier van der Leer --- .../backend/backend/data/graph.py | 27 ++++++++++++++++--- .../backend/backend/server/rest_api.py | 5 +++- .../src/app/marketplace/submit/page.tsx | 2 +- .../src/lib/autogpt-server-api/baseClient.ts | 16 ++++++++--- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/autogpt_platform/backend/backend/data/graph.py b/autogpt_platform/backend/backend/data/graph.py index 007c0030f1..7195c229e5 100644 --- a/autogpt_platform/backend/backend/data/graph.py +++ b/autogpt_platform/backend/backend/data/graph.py @@ -330,7 +330,7 @@ class Graph(GraphMeta): return input_schema @staticmethod - def from_db(graph: AgentGraph): + def from_db(graph: AgentGraph, hide_credentials: bool = False): nodes = [ *(graph.AgentNodes or []), *( @@ -341,7 +341,7 @@ class Graph(GraphMeta): ] return Graph( **GraphMeta.from_db(graph).model_dump(), - nodes=[Node.from_db(node) for node in nodes], + nodes=[Graph._process_node(node, hide_credentials) for node in nodes], links=list( { Link.from_db(link) @@ -355,6 +355,26 @@ class Graph(GraphMeta): }, ) + @staticmethod + def _process_node(node: AgentNode, hide_credentials: bool) -> Node: + node_dict = node.model_dump() + if hide_credentials and "constantInput" in node_dict: + constant_input = json.loads(node_dict["constantInput"]) + Graph._hide_credentials_in_input(constant_input) + node_dict["constantInput"] = json.dumps(constant_input) + return Node.from_db(AgentNode(**node_dict)) + + @staticmethod + def _hide_credentials_in_input(input_data: dict[str, Any]): + sensitive_keys = ["credentials", "api_key", "password", "token", "secret"] + for key, value in input_data.items(): + if isinstance(value, dict): + Graph._hide_credentials_in_input(value) + elif isinstance(value, str) and any( + sensitive_key in key.lower() for sensitive_key in sensitive_keys + ): + del input_data[key] + AGENT_NODE_INCLUDE: prisma.types.AgentNodeInclude = { "Input": True, @@ -431,6 +451,7 @@ async def get_graph( version: int | None = None, template: bool = False, user_id: str | None = None, + hide_credentials: bool = False, ) -> Graph | None: """ Retrieves a graph from the DB. @@ -456,7 +477,7 @@ async def get_graph( include=AGENT_GRAPH_INCLUDE, order={"version": "desc"}, ) - return Graph.from_db(graph) if graph else None + return Graph.from_db(graph, hide_credentials) if graph else None async def set_graph_active_version(graph_id: str, version: int, user_id: str) -> None: diff --git a/autogpt_platform/backend/backend/server/rest_api.py b/autogpt_platform/backend/backend/server/rest_api.py index 0f190dea43..4cbf6963bb 100644 --- a/autogpt_platform/backend/backend/server/rest_api.py +++ b/autogpt_platform/backend/backend/server/rest_api.py @@ -364,8 +364,11 @@ class AgentServer(AppService): graph_id: str, user_id: Annotated[str, Depends(get_user_id)], version: int | None = None, + hide_credentials: bool = False, ) -> graph_db.Graph: - graph = await graph_db.get_graph(graph_id, version, user_id=user_id) + graph = await graph_db.get_graph( + graph_id, version, user_id=user_id, hide_credentials=hide_credentials + ) if not graph: raise HTTPException(status_code=404, detail=f"Graph #{graph_id} not found.") return graph diff --git a/autogpt_platform/frontend/src/app/marketplace/submit/page.tsx b/autogpt_platform/frontend/src/app/marketplace/submit/page.tsx index a489e9087b..63ee9cfd2f 100644 --- a/autogpt_platform/frontend/src/app/marketplace/submit/page.tsx +++ b/autogpt_platform/frontend/src/app/marketplace/submit/page.tsx @@ -129,7 +129,7 @@ const SubmitPage: React.FC = () => { const fetchAgentGraph = async () => { if (selectedAgentId) { const api = new AutoGPTServerAPI(); - const graph = await api.getGraph(selectedAgentId); + const graph = await api.getGraph(selectedAgentId, undefined, true); setSelectedAgentGraph(graph); setValue("name", graph.name); setValue("description", graph.description); diff --git a/autogpt_platform/frontend/src/lib/autogpt-server-api/baseClient.ts b/autogpt_platform/frontend/src/lib/autogpt-server-api/baseClient.ts index 28b14b3ff5..8d0f0066ac 100644 --- a/autogpt_platform/frontend/src/lib/autogpt-server-api/baseClient.ts +++ b/autogpt_platform/frontend/src/lib/autogpt-server-api/baseClient.ts @@ -70,9 +70,19 @@ export default class BaseAutoGPTServerAPI { return this._get("/templates"); } - getGraph(id: string, version?: number): Promise { - const query = version !== undefined ? `?version=${version}` : ""; - return this._get(`/graphs/${id}` + query); + getGraph( + id: string, + version?: number, + hide_credentials?: boolean, + ): Promise { + let query: Record = {}; + if (version !== undefined) { + query["version"] = version; + } + if (hide_credentials !== undefined) { + query["hide_credentials"] = hide_credentials; + } + return this._get(`/graphs/${id}`, query); } getTemplate(id: string, version?: number): Promise { From e37744b9f2902dcae4be3247fc4609ca85c6c03c Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Tue, 8 Oct 2024 22:43:36 +0100 Subject: [PATCH 060/155] fix(platform): Update deletion of secret values to not do it in place (#8284) update deletion of secret values to not do it in place --- autogpt_platform/backend/backend/data/graph.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/autogpt_platform/backend/backend/data/graph.py b/autogpt_platform/backend/backend/data/graph.py index 7195c229e5..27be75ba55 100644 --- a/autogpt_platform/backend/backend/data/graph.py +++ b/autogpt_platform/backend/backend/data/graph.py @@ -360,20 +360,25 @@ class Graph(GraphMeta): node_dict = node.model_dump() if hide_credentials and "constantInput" in node_dict: constant_input = json.loads(node_dict["constantInput"]) - Graph._hide_credentials_in_input(constant_input) + constant_input = Graph._hide_credentials_in_input(constant_input) node_dict["constantInput"] = json.dumps(constant_input) return Node.from_db(AgentNode(**node_dict)) @staticmethod - def _hide_credentials_in_input(input_data: dict[str, Any]): + def _hide_credentials_in_input(input_data: dict[str, Any]) -> dict[str, Any]: sensitive_keys = ["credentials", "api_key", "password", "token", "secret"] + result = {} for key, value in input_data.items(): if isinstance(value, dict): - Graph._hide_credentials_in_input(value) + result[key] = Graph._hide_credentials_in_input(value) elif isinstance(value, str) and any( sensitive_key in key.lower() for sensitive_key in sensitive_keys ): - del input_data[key] + # Skip this key-value pair in the result + continue + else: + result[key] = value + return result AGENT_NODE_INCLUDE: prisma.types.AgentNodeInclude = { From e654aa1e7ae9142ece3f796867afd5ba6b21c781 Mon Sep 17 00:00:00 2001 From: Nicholas Tindle Date: Wed, 9 Oct 2024 04:12:48 -0500 Subject: [PATCH 061/155] feat(backend): add the capibility to disable llm models in the cloud env (#8285) * feat(backend): logic to disable enums based on python logic * feat(backend): add behave as setting and clarify its purpose and APP_ENV APP_ENV is used for not cloud vs local but the application environment such as local/dev/prod so we need BehaveAs as well * fix(backend): various uses of AppEnvironment without the Enum or incorrectly AppEnv in the logging library will never be cloud due to the restrictions applied when loading settings in by pydantic settings. This commit fixes this error, however the code path for logging may now be incorrect * feat(backend): use a metaclass to disable ollama in the cloud environment * fix: formatting * fix(backend): typing improvements * fix(backend): more linting :sob: --- autogpt_platform/backend/.env.example | 7 ++-- .../backend/backend/blocks/llm.py | 42 +++++++++++++++++-- .../backend/backend/server/rest_api.py | 4 +- .../backend/backend/server/ws_api.py | 4 +- .../backend/backend/util/logging.py | 9 +++- .../backend/backend/util/settings.py | 12 +++++- 6 files changed, 65 insertions(+), 13 deletions(-) diff --git a/autogpt_platform/backend/.env.example b/autogpt_platform/backend/.env.example index ed87d8fb75..0cb4d7abd7 100644 --- a/autogpt_platform/backend/.env.example +++ b/autogpt_platform/backend/.env.example @@ -12,7 +12,10 @@ REDIS_PORT=6379 REDIS_PASSWORD=password ENABLE_CREDIT=false -APP_ENV="local" +# What environment things should be logged under: local dev or prod +APP_ENV=local +# What environment to behave as: "local" or "cloud" +BEHAVE_AS=local PYRO_HOST=localhost SENTRY_DSN= @@ -98,5 +101,3 @@ ENABLE_CLOUD_LOGGING=false ENABLE_FILE_LOGGING=false # Use to manually set the log directory # LOG_DIR=./logs - -APP_ENV=local diff --git a/autogpt_platform/backend/backend/blocks/llm.py b/autogpt_platform/backend/backend/blocks/llm.py index 19d2e9621c..15f75ecc74 100644 --- a/autogpt_platform/backend/backend/blocks/llm.py +++ b/autogpt_platform/backend/backend/blocks/llm.py @@ -1,8 +1,12 @@ import ast import logging -from enum import Enum +from enum import Enum, EnumMeta from json import JSONDecodeError -from typing import Any, List, NamedTuple +from types import MappingProxyType +from typing import TYPE_CHECKING, Any, List, NamedTuple + +if TYPE_CHECKING: + from enum import _EnumMemberT import anthropic import ollama @@ -12,6 +16,7 @@ from groq import Groq from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema from backend.data.model import BlockSecret, SchemaField, SecretField from backend.util import json +from backend.util.settings import BehaveAs, Settings logger = logging.getLogger(__name__) @@ -29,7 +34,26 @@ class ModelMetadata(NamedTuple): cost_factor: int -class LlmModel(str, Enum): +class LlmModelMeta(EnumMeta): + @property + def __members__( + self: type["_EnumMemberT"], + ) -> MappingProxyType[str, "_EnumMemberT"]: + if Settings().config.behave_as == BehaveAs.LOCAL: + members = super().__members__ + return members + else: + removed_providers = ["ollama"] + existing_members = super().__members__ + members = { + name: member + for name, member in existing_members.items() + if LlmModel[name].provider not in removed_providers + } + return MappingProxyType(members) + + +class LlmModel(str, Enum, metaclass=LlmModelMeta): # OpenAI models O1_PREVIEW = "o1-preview" O1_MINI = "o1-mini" @@ -58,6 +82,18 @@ class LlmModel(str, Enum): def metadata(self) -> ModelMetadata: return MODEL_METADATA[self] + @property + def provider(self) -> str: + return self.metadata.provider + + @property + def context_window(self) -> int: + return self.metadata.context_window + + @property + def cost_factor(self) -> int: + return self.metadata.cost_factor + MODEL_METADATA = { LlmModel.O1_PREVIEW: ModelMetadata("openai", 32000, cost_factor=60), diff --git a/autogpt_platform/backend/backend/server/rest_api.py b/autogpt_platform/backend/backend/server/rest_api.py index 4cbf6963bb..cc978521c5 100644 --- a/autogpt_platform/backend/backend/server/rest_api.py +++ b/autogpt_platform/backend/backend/server/rest_api.py @@ -23,7 +23,7 @@ from backend.data.user import get_or_create_user from backend.executor import ExecutionManager, ExecutionScheduler from backend.server.model import CreateGraph, SetGraphActiveVersion from backend.util.service import AppService, expose, get_service_client -from backend.util.settings import Config, Settings +from backend.util.settings import AppEnvironment, Config, Settings from .utils import get_user_id @@ -52,7 +52,7 @@ class AgentServer(AppService): await db.disconnect() def run_service(self): - docs_url = "/docs" if settings.config.app_env == "local" else None + docs_url = "/docs" if settings.config.app_env == AppEnvironment.LOCAL else None app = FastAPI( title="AutoGPT Agent Server", description=( diff --git a/autogpt_platform/backend/backend/server/ws_api.py b/autogpt_platform/backend/backend/server/ws_api.py index 039ef718fd..e58c031c69 100644 --- a/autogpt_platform/backend/backend/server/ws_api.py +++ b/autogpt_platform/backend/backend/server/ws_api.py @@ -12,7 +12,7 @@ from backend.data.user import DEFAULT_USER_ID from backend.server.conn_manager import ConnectionManager from backend.server.model import ExecutionSubscription, Methods, WsMessage from backend.util.service import AppProcess -from backend.util.settings import Config, Settings +from backend.util.settings import AppEnvironment, Config, Settings logger = logging.getLogger(__name__) settings = Settings() @@ -28,7 +28,7 @@ async def lifespan(app: FastAPI): event_queue.close() -docs_url = "/docs" if settings.config.app_env == "local" else None +docs_url = "/docs" if settings.config.app_env == AppEnvironment.LOCAL else None app = FastAPI(lifespan=lifespan) event_queue = RedisEventQueue() _connection_manager = None diff --git a/autogpt_platform/backend/backend/util/logging.py b/autogpt_platform/backend/backend/util/logging.py index 68e6ff78c9..63166a84c2 100644 --- a/autogpt_platform/backend/backend/util/logging.py +++ b/autogpt_platform/backend/backend/util/logging.py @@ -1,4 +1,6 @@ -import os +from backend.util.settings import AppEnvironment, BehaveAs, Settings + +settings = Settings() def configure_logging(): @@ -6,7 +8,10 @@ def configure_logging(): import autogpt_libs.logging.config - if os.getenv("APP_ENV") != "cloud": + if ( + settings.config.behave_as == BehaveAs.LOCAL + or settings.config.app_env == AppEnvironment.LOCAL + ): autogpt_libs.logging.config.configure_logging(force_cloud_logging=False) else: autogpt_libs.logging.config.configure_logging(force_cloud_logging=True) diff --git a/autogpt_platform/backend/backend/util/settings.py b/autogpt_platform/backend/backend/util/settings.py index 14af86a8a2..4be7c98b1e 100644 --- a/autogpt_platform/backend/backend/util/settings.py +++ b/autogpt_platform/backend/backend/util/settings.py @@ -22,6 +22,11 @@ class AppEnvironment(str, Enum): PRODUCTION = "prod" +class BehaveAs(str, Enum): + LOCAL = "local" + CLOUD = "cloud" + + class UpdateTrackingModel(BaseModel, Generic[T]): _updated_fields: Set[str] = PrivateAttr(default_factory=set) @@ -130,7 +135,12 @@ class Config(UpdateTrackingModel["Config"], BaseSettings): app_env: AppEnvironment = Field( default=AppEnvironment.LOCAL, - description="The name of the app environment.", + description="The name of the app environment: local or dev or prod", + ) + + behave_as: BehaveAs = Field( + default=BehaveAs.LOCAL, + description="What environment to behave as: local or cloud", ) backend_cors_allow_origins: List[str] = Field(default_factory=list) From c582b5512a39d8641f76ede28bbf8990648639cb Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Wed, 9 Oct 2024 11:54:49 +0100 Subject: [PATCH 062/155] tweak(platform): Add Anthropic (#8286) add anthropic in helm --- autogpt_platform/infra/helm/autogpt-server/values.prod.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/autogpt_platform/infra/helm/autogpt-server/values.prod.yaml b/autogpt_platform/infra/helm/autogpt-server/values.prod.yaml index cafbe2f1dc..6eeb2996ea 100644 --- a/autogpt_platform/infra/helm/autogpt-server/values.prod.yaml +++ b/autogpt_platform/infra/helm/autogpt-server/values.prod.yaml @@ -95,6 +95,7 @@ env: ENABLE_AUTH: "true" REDIS_HOST: "redis-prod-master.redis-prod.svc.cluster.local" REDIS_PORT: "6379" + ANTHROPIC_API_KEY: "" OPENAI_API_KEY: "" REDIS_PASSWORD: "" NUM_GRAPH_WORKERS: 10 From dbc603c6ebafc8489ed0d8a1867d1b13b17bd3a0 Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Wed, 9 Oct 2024 23:29:13 +0300 Subject: [PATCH 063/155] fix(platform): Fix unexpected connection clash on two dynamic pins link with the same keys (#8252) --- autogpt_platform/frontend/package.json | 2 +- .../frontend/src/components/CustomNode.tsx | 3 + .../src/components/node-input-components.tsx | 44 +- autogpt_platform/frontend/yarn.lock | 996 ++++++++++++------ 4 files changed, 679 insertions(+), 366 deletions(-) diff --git a/autogpt_platform/frontend/package.json b/autogpt_platform/frontend/package.json index f9ba6ed2bf..ab1aaf2f67 100644 --- a/autogpt_platform/frontend/package.json +++ b/autogpt_platform/frontend/package.json @@ -39,7 +39,7 @@ "@supabase/ssr": "^0.4.0", "@supabase/supabase-js": "^2.45.0", "@tanstack/react-table": "^8.20.5", - "@xyflow/react": "^12.1.0", + "@xyflow/react": "^12.3.1", "ajv": "^8.17.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", diff --git a/autogpt_platform/frontend/src/components/CustomNode.tsx b/autogpt_platform/frontend/src/components/CustomNode.tsx index 91c275a0fe..c1a7da136a 100644 --- a/autogpt_platform/frontend/src/components/CustomNode.tsx +++ b/autogpt_platform/frontend/src/components/CustomNode.tsx @@ -172,6 +172,7 @@ export function CustomNode({ data, id, width, height }: NodeProps) {
{}}> {!isConnected && ( ) { )} {!isConnected && ( ) { )} {!isConnected && ( = ({ + nodeId, selfKey = "", schema, object, @@ -65,6 +67,7 @@ const NodeObjectInputTree: FC = ({ {propSchema.title || beautifyString(propKey)} = ({ export default NodeObjectInputTree; export const NodeGenericInputField: FC<{ + nodeId: string; propKey: string; propSchema: BlockIOSubSchema; currentValue?: any; @@ -95,6 +99,7 @@ export const NodeGenericInputField: FC<{ className?: string; displayName?: string; }> = ({ + nodeId, propKey, propSchema, currentValue, @@ -131,6 +136,7 @@ export const NodeGenericInputField: FC<{ if ("properties" in propSchema) { return ( = ({ + nodeId, selfKey, entries, schema, @@ -333,18 +344,15 @@ const NodeKeyValueInput: FC<{ displayName, }) => { const getPairValues = useCallback(() => { - let defaultEntries = new Map(); - + // Map will preserve the order of entries. + const defaultEntries = new Map( + Object.entries(entries ?? schema.default ?? {}), + ); + const prefix = getEntryKey(""); connections - .filter((c) => c.targetHandle.startsWith(`${selfKey}_`)) - .forEach((c) => { - const key = c.targetHandle.slice(`${selfKey}_#_`.length); - defaultEntries.set(key, ""); - }); - - Object.entries(entries ?? schema.default ?? {}).forEach(([key, value]) => { - defaultEntries.set(key, value); - }); + .filter((c) => c.targetHandle.startsWith(prefix)) + .map((c) => c.targetHandle.slice(prefix.length)) + .forEach((k) => !defaultEntries.has(k) && defaultEntries.set(k, "")); return Array.from(defaultEntries, ([key, value]) => ({ key, value })); }, [connections, entries, schema.default, selfKey]); @@ -380,7 +388,9 @@ const NodeKeyValueInput: FC<{ return `${selfKey}_#_${key}`; } function isConnected(key: string): boolean { - return connections.some((c) => c.targetHandle === getEntryKey(key)); + return connections.some( + (c) => c.targetHandle === getEntryKey(key) && c.target === nodeId, + ); } return ( @@ -388,7 +398,7 @@ const NodeKeyValueInput: FC<{ {displayName && {displayName}}
{keyValuePairs.map(({ key, value }, index) => ( -
+
{key && ( = ({ + nodeId, selfKey, schema, entries, @@ -491,7 +503,10 @@ const NodeArrayInput: FC<{ {entries.map((entry: any, index: number) => { const entryKey = `${selfKey}_$_${index}`; const isConnected = - connections && connections.some((c) => c.targetHandle === entryKey); + connections && + connections.some( + (c) => c.targetHandle === entryKey && c.target === nodeId, + ); return (
@@ -505,6 +520,7 @@ const NodeArrayInput: FC<{ {!isConnected && (schema.items ? ( =1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0": version "1.9.0" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== @@ -410,7 +378,7 @@ resolved "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz" integrity sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg== -"@opentelemetry/core@1.26.0", "@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.25.1", "@opentelemetry/core@^1.8.0": +"@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.25.1", "@opentelemetry/core@^1.8.0", "@opentelemetry/core@1.26.0": version "1.26.0" resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz" integrity sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ== @@ -528,6 +496,13 @@ "@opentelemetry/instrumentation" "^0.53.0" "@opentelemetry/semantic-conventions" "^1.27.0" +"@opentelemetry/instrumentation-lru-memoizer@0.40.0": + version "0.40.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.40.0.tgz" + integrity sha512-21xRwZsEdMPnROu/QsaOIODmzw59IYpGFmuC4aFWvMj6stA8+Ei1tX67nkarJttlNjoM94um0N4X26AD7ff54A== + dependencies: + "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/instrumentation-mongodb@0.47.0": version "0.47.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.47.0.tgz" @@ -546,15 +521,6 @@ "@opentelemetry/instrumentation" "^0.53.0" "@opentelemetry/semantic-conventions" "^1.27.0" -"@opentelemetry/instrumentation-mysql2@0.41.0": - version "0.41.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz" - integrity sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g== - dependencies: - "@opentelemetry/instrumentation" "^0.53.0" - "@opentelemetry/semantic-conventions" "^1.27.0" - "@opentelemetry/sql-common" "^0.40.1" - "@opentelemetry/instrumentation-mysql@0.41.0": version "0.41.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.41.0.tgz" @@ -564,6 +530,15 @@ "@opentelemetry/semantic-conventions" "^1.27.0" "@types/mysql" "2.15.26" +"@opentelemetry/instrumentation-mysql2@0.41.0": + version "0.41.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz" + integrity sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g== + dependencies: + "@opentelemetry/instrumentation" "^0.53.0" + "@opentelemetry/semantic-conventions" "^1.27.0" + "@opentelemetry/sql-common" "^0.40.1" + "@opentelemetry/instrumentation-nestjs-core@0.40.0": version "0.40.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.40.0.tgz" @@ -600,18 +575,6 @@ "@opentelemetry/core" "^1.8.0" "@opentelemetry/instrumentation" "^0.53.0" -"@opentelemetry/instrumentation@0.53.0", "@opentelemetry/instrumentation@^0.53.0": - version "0.53.0" - resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz" - integrity sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A== - dependencies: - "@opentelemetry/api-logs" "0.53.0" - "@types/shimmer" "^1.2.0" - import-in-the-middle "^1.8.1" - require-in-the-middle "^7.1.1" - semver "^7.5.2" - shimmer "^1.2.1" - "@opentelemetry/instrumentation@^0.49 || ^0.50 || ^0.51 || ^0.52.0": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz" @@ -624,12 +587,24 @@ semver "^7.5.2" shimmer "^1.2.1" +"@opentelemetry/instrumentation@^0.53.0", "@opentelemetry/instrumentation@0.53.0": + version "0.53.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz" + integrity sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A== + dependencies: + "@opentelemetry/api-logs" "0.53.0" + "@types/shimmer" "^1.2.0" + import-in-the-middle "^1.8.1" + require-in-the-middle "^7.1.1" + semver "^7.5.2" + shimmer "^1.2.1" + "@opentelemetry/redis-common@^0.36.2": version "0.36.2" resolved "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz" integrity sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g== -"@opentelemetry/resources@1.26.0", "@opentelemetry/resources@^1.26.0": +"@opentelemetry/resources@^1.26.0", "@opentelemetry/resources@1.26.0": version "1.26.0" resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz" integrity sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw== @@ -654,7 +629,7 @@ "@opentelemetry/resources" "1.26.0" "@opentelemetry/semantic-conventions" "1.27.0" -"@opentelemetry/semantic-conventions@1.27.0", "@opentelemetry/semantic-conventions@^1.27.0": +"@opentelemetry/semantic-conventions@^1.27.0", "@opentelemetry/semantic-conventions@1.27.0": version "1.27.0" resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz" integrity sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg== @@ -671,12 +646,12 @@ resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@playwright/test@^1.47.1": - version "1.47.1" - resolved "https://registry.npmjs.org/@playwright/test/-/test-1.47.1.tgz" - integrity sha512-dbWpcNQZ5nj16m+A5UNScYx7HX5trIy7g4phrcitn+Nk83S32EBX/CLU4hiF4RGKX/yRc93AAqtfaXB7JWBd4Q== +"@playwright/test@^1.41.2", "@playwright/test@^1.47.1": + version "1.47.2" + resolved "https://registry.npmjs.org/@playwright/test/-/test-1.47.2.tgz" + integrity sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ== dependencies: - playwright "1.47.1" + playwright "1.47.2" "@prisma/instrumentation@5.19.1": version "5.19.1" @@ -783,6 +758,26 @@ resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz" integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== +"@radix-ui/react-dialog@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz" + integrity sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.0" + "@radix-ui/react-focus-guards" "1.1.0" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.1" + "@radix-ui/react-presence" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.7" + "@radix-ui/react-dialog@1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz" @@ -804,26 +799,6 @@ aria-hidden "^1.1.1" react-remove-scroll "2.5.5" -"@radix-ui/react-dialog@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz" - integrity sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-focus-guards" "1.1.0" - "@radix-ui/react-focus-scope" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.7" - "@radix-ui/react-direction@1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz" @@ -1096,6 +1071,13 @@ dependencies: "@radix-ui/react-primitive" "2.0.0" +"@radix-ui/react-slot@^1.1.0", "@radix-ui/react-slot@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz" + integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-slot@1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz" @@ -1104,13 +1086,6 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.1" -"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz" - integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-switch@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz" @@ -1266,11 +1241,6 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rollup/rollup-linux-x64-gnu@^4.9.5": - version "4.22.5" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz#a135b040b21582e91cfed2267ccfc7d589e1dbc6" - integrity sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA== - "@rushstack/eslint-patch@^1.3.3": version "1.10.4" resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz" @@ -1281,61 +1251,61 @@ resolved "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.3.0.tgz" integrity sha512-lHKK8M5CTcpFj2hZDB3wIjb0KAbEOgDmiJGDv1WBRfQgRm/a8/XMEkG/N1iM01xgbUDsPQwi42D+dFo1XPAKew== -"@sentry-internal/browser-utils@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.32.0.tgz" - integrity sha512-DpUGhk5O1OVjT0fo9wsbEdO1R/S9gGBRDtn9+FFVeRtieJHwXpeZiLK+tZhTOvaILmtSoTPUEY3L5sK4j5Xq9g== +"@sentry-internal/browser-utils@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.33.1.tgz" + integrity sha512-TW6/r+Gl5jiXv54iK1xZ3mlVgTS/jaBp4vcQ0xGMdgiQ3WchEPcFSeYovL+YHT3tSud0GZqVtDQCz+5i76puqA== dependencies: - "@sentry/core" "8.32.0" - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" + "@sentry/core" "8.33.1" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" -"@sentry-internal/feedback@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.32.0.tgz" - integrity sha512-XB7hiVJQW1tNzpoXIHbvm3rjipIt7PZiJJtFg2vxaqu/FzdgOcYqQiwIKivJVAKuRZ9rIeJtK1jdXQFOc/TRJA== +"@sentry-internal/feedback@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.33.1.tgz" + integrity sha512-qauMRTm3qDaLqZ3ibI03cj4gLF40y0ij65nj+cns6iWxGCtPrO8tjvXFWuQsE7Aye9dGMnBgmv7uN+NTUtC3RA== dependencies: - "@sentry/core" "8.32.0" - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" + "@sentry/core" "8.33.1" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" -"@sentry-internal/replay-canvas@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.32.0.tgz" - integrity sha512-oBbhtDBkD+5z/T0NVJ5VenBWAid/S9QdVrod/UqxVqU7F8N+E9/INFQI48zCWr4iVlUMcszJPDElvJEsMDvvBQ== +"@sentry-internal/replay-canvas@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.33.1.tgz" + integrity sha512-nsxTFTPCT10Ty/v6+AiST3+yotGP1sUb8xqfKB9fPnS1hZHFryp0NnEls7xFjBsBbZPU1GpFkzrk/E6JFzixDQ== dependencies: - "@sentry-internal/replay" "8.32.0" - "@sentry/core" "8.32.0" - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" + "@sentry-internal/replay" "8.33.1" + "@sentry/core" "8.33.1" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" -"@sentry-internal/replay@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.32.0.tgz" - integrity sha512-yiEUnn2yyo1AIQIFNeRX3tdK8fmyKIkxdFS1WiVQmeYI/hFwYBTZPly0FcO/g3xnRMSA2tvrS+hZEaaXfK4WhA== +"@sentry-internal/replay@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.33.1.tgz" + integrity sha512-fm4coIOjmanU29NOVN9MyaP4fUCOYytbtFqVSKRFNZQ/xAgNeySiBIbUd6IjujMmnOk9bY0WEUMcdm3Uotjdog== dependencies: - "@sentry-internal/browser-utils" "8.32.0" - "@sentry/core" "8.32.0" - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" + "@sentry-internal/browser-utils" "8.33.1" + "@sentry/core" "8.33.1" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" "@sentry/babel-plugin-component-annotate@2.22.3": version "2.22.3" resolved "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.3.tgz" integrity sha512-OlHA+i+vnQHRIdry4glpiS/xTOtgjmpXOt6IBOUqynx5Jd/iK1+fj+t8CckqOx9wRacO/hru2wfW/jFq0iViLg== -"@sentry/browser@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry/browser/-/browser-8.32.0.tgz" - integrity sha512-AEKFj64g4iYwEMRvVcxiY0FswmClRXCP1IEvCqujn8OBS8AjMOr1z/RwYieEs0D90yNNB3YEqF8adrKENblJmw== +"@sentry/browser@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry/browser/-/browser-8.33.1.tgz" + integrity sha512-c6zI/igexkLwZuGk+u8Rj26ChjxGgkhe6ZbKFsXCYaKAp5ep5X7HQRkkqgbxApiqlC0LduHdd/ymzh139JLg8w== dependencies: - "@sentry-internal/browser-utils" "8.32.0" - "@sentry-internal/feedback" "8.32.0" - "@sentry-internal/replay" "8.32.0" - "@sentry-internal/replay-canvas" "8.32.0" - "@sentry/core" "8.32.0" - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" + "@sentry-internal/browser-utils" "8.33.1" + "@sentry-internal/feedback" "8.33.1" + "@sentry-internal/replay" "8.33.1" + "@sentry-internal/replay-canvas" "8.33.1" + "@sentry/core" "8.33.1" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" "@sentry/bundler-plugin-core@2.22.3": version "2.22.3" @@ -1356,36 +1326,6 @@ resolved "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.36.1.tgz" integrity sha512-JOHQjVD8Kqxm1jUKioAP5ohLOITf+Dh6+DBz4gQjCNdotsvNW5m63TKROwq2oB811p+Jzv5304ujmN4cAqW1Ww== -"@sentry/cli-linux-arm64@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.36.1.tgz#ff449d7e7e715166257998c02cf635ca02acbadd" - integrity sha512-R//3ZEkbzvoStr3IA7nxBZNiBYyxOljOqAhgiTnejXHmnuwDzM3TBA2n5vKPE/kBFxboEBEw0UTzTIRb1T0bgw== - -"@sentry/cli-linux-arm@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.36.1.tgz#1ae5d335a1b4cd217a34c2bd6c6f5e0670136eb3" - integrity sha512-gvEOKN0fWL2AVqUBKHNXPRZfJNvKTs8kQhS8cQqahZGgZHiPCI4BqW45cKMq+ZTt1UUbLmt6khx5Dz7wi+0i5A== - -"@sentry/cli-linux-i686@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.36.1.tgz#112b9e26357e918cbbba918114ec8cdab07cdf60" - integrity sha512-R7sW5Vk/HacVy2YgQoQB+PwccvFYf2CZVPSFSFm2z7MEfNe77UYHWUq+sjJ4vxWG6HDWGVmaX0fjxyDkE01JRA== - -"@sentry/cli-linux-x64@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.36.1.tgz#c3e5bdb0c9a4bb44c83927c62a3cd7e006709bf7" - integrity sha512-UMr3ik8ksA7zQfbzsfwCb+ztenLnaeAbX94Gp+bzANZwPfi/vVHf2bLyqsBs4OyVt9SPlN1bbM/RTGfMjZ3JOw== - -"@sentry/cli-win32-i686@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.36.1.tgz#819573320e885e1dbf59b0a01d3bd370c84c1708" - integrity sha512-CflvhnvxPEs5GWQuuDtYSLqPrBaPbcSJFlBuUIb+8WNzRxvVfjgw1qzfZmkQqABqiy/YEsEekllOoMFZAvCcVA== - -"@sentry/cli-win32-x64@2.36.1": - version "2.36.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.36.1.tgz#80779b4bffb4e2e32944eae72c60e6f40151b4dc" - integrity sha512-wWqht2xghcK3TGnooHZSzA3WSjdtno/xFjZLvWmw38rblGwgKMxLZnlxV6uDyS+OJ6CbfDTlCRay/0TIqA0N8g== - "@sentry/cli@^2.33.1": version "2.36.1" resolved "https://registry.npmjs.org/@sentry/cli/-/cli-2.36.1.tgz" @@ -1405,40 +1345,40 @@ "@sentry/cli-win32-i686" "2.36.1" "@sentry/cli-win32-x64" "2.36.1" -"@sentry/core@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry/core/-/core-8.32.0.tgz" - integrity sha512-+xidTr0lZ0c755tq4k75dXPEb8PA+qvIefW3U9+dQMORLokBrYoKYMf5zZTG2k/OfSJS6OSxatUj36NFuCs3aA== +"@sentry/core@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry/core/-/core-8.33.1.tgz" + integrity sha512-3SS41suXLFzxL3OQvTMZ6q92ZapELVq2l2SoWlZopcamWhog2Ru0dp2vkunq97kFHb2TzKRTlFH4+4gbT8SJug== dependencies: - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" "@sentry/nextjs@^8": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-8.32.0.tgz" - integrity sha512-rnnSsKFd4u9TXGr0XVQ7lEl/PkTfNyJ4kxwu9gW+OJjzmmjzIAC4RyY4YQTR1+p/q9QrruWrXLEsuCPqAHfqNw== + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-8.33.1.tgz" + integrity sha512-XLUyib6bCv2iynKaoYIotVKzLsGc9lr6QI4ZV3/PstiiXKwtTm1TPdBfIlrDJMGIMxH7Z/DmkvJNSESV19Ui6Q== dependencies: "@opentelemetry/instrumentation-http" "0.53.0" "@opentelemetry/semantic-conventions" "^1.27.0" "@rollup/plugin-commonjs" "26.0.1" - "@sentry-internal/browser-utils" "8.32.0" - "@sentry/core" "8.32.0" - "@sentry/node" "8.32.0" - "@sentry/opentelemetry" "8.32.0" - "@sentry/react" "8.32.0" - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" - "@sentry/vercel-edge" "8.32.0" + "@sentry-internal/browser-utils" "8.33.1" + "@sentry/core" "8.33.1" + "@sentry/node" "8.33.1" + "@sentry/opentelemetry" "8.33.1" + "@sentry/react" "8.33.1" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" + "@sentry/vercel-edge" "8.33.1" "@sentry/webpack-plugin" "2.22.3" chalk "3.0.0" resolve "1.22.8" rollup "3.29.5" stacktrace-parser "^0.1.10" -"@sentry/node@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry/node/-/node-8.32.0.tgz" - integrity sha512-a2PoFA9j/HmJVGF/zXJhLP6QhRHGye/2EznQdHOELsH1BkeMgBaXl7D52r2E/b7qki647lXrdbspB6jid8NycA== +"@sentry/node@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry/node/-/node-8.33.1.tgz" + integrity sha512-0Xmlrl5nU5Bx6YybaIfztyOIiIXW5X64vcK0u94Sg4uHcDO7YvEbhflKjp669ds2I6ZQ/czqxnaAY8gM6P2SCA== dependencies: "@opentelemetry/api" "^1.9.0" "@opentelemetry/context-async-hooks" "^1.25.1" @@ -1457,6 +1397,7 @@ "@opentelemetry/instrumentation-ioredis" "0.43.0" "@opentelemetry/instrumentation-kafkajs" "0.3.0" "@opentelemetry/instrumentation-koa" "0.43.0" + "@opentelemetry/instrumentation-lru-memoizer" "0.40.0" "@opentelemetry/instrumentation-mongodb" "0.47.0" "@opentelemetry/instrumentation-mongoose" "0.42.0" "@opentelemetry/instrumentation-mysql" "0.41.0" @@ -1469,52 +1410,52 @@ "@opentelemetry/sdk-trace-base" "^1.26.0" "@opentelemetry/semantic-conventions" "^1.27.0" "@prisma/instrumentation" "5.19.1" - "@sentry/core" "8.32.0" - "@sentry/opentelemetry" "8.32.0" - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" + "@sentry/core" "8.33.1" + "@sentry/opentelemetry" "8.33.1" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" import-in-the-middle "^1.11.0" -"@sentry/opentelemetry@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.32.0.tgz" - integrity sha512-YCD8EnwJJ2ab3zWWtu5VrvHP/6Ss6GGQH0TYx2cfeGG3c0wTA/5zYx9JR4i3hUtOh1pifN34HlY0yyQHD4yctg== +"@sentry/opentelemetry@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.33.1.tgz" + integrity sha512-D2aE2G0DUHLLnfbOXrTjiNJKAs/RZfOBJMidI4fC2AIwqCmrp55Aex4dRq4hxd8MPLR92Kt/ikHeJxlzWB15KA== dependencies: - "@sentry/core" "8.32.0" - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" + "@sentry/core" "8.33.1" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" -"@sentry/react@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry/react/-/react-8.32.0.tgz" - integrity sha512-YljqK+k80XOvyXjK2p2neTncRcSuwlpL7qHtNgwR1MHx18FEi7HXlnm13J4g3kxao4ORMxlCXCEPNXlLT+vqQg== +"@sentry/react@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry/react/-/react-8.33.1.tgz" + integrity sha512-SsEX05xfcfOvo7/pK1UyeyTAYWH8iSIsXXlsjvnSRsbuJkjb0c+q6yiZpj3A2PRdbcx43nTVE1n0lSpgaqj2HA== dependencies: - "@sentry/browser" "8.32.0" - "@sentry/core" "8.32.0" - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" + "@sentry/browser" "8.33.1" + "@sentry/core" "8.33.1" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" hoist-non-react-statics "^3.3.2" -"@sentry/types@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry/types/-/types-8.32.0.tgz" - integrity sha512-hxckvN2MzS5SgGDgVQ0/QpZXk13Vrq4BtZLwXhPhyeTmZtUiUfWvcL5TFQqLinfKdTKPe9q2MxeAJ0D4LalhMg== +"@sentry/types@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry/types/-/types-8.33.1.tgz" + integrity sha512-GjoAMvwtpIemoF/IiwZ7A60g4nQv3qwzR21GvJqDVUoKD0e8pv9OLX+HyXoUat4wEDGSuDUcUyUKD2G+od73QA== -"@sentry/utils@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry/utils/-/utils-8.32.0.tgz" - integrity sha512-t1WVERhgmYURxbBj9J4/H2P2X+VKqm7B3ce9iQyrZbdf5NekhcU4jHIecPUWCPHjQkFIqkVTorqeBmDTlg/UmQ== +"@sentry/utils@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-8.33.1.tgz" + integrity sha512-uzuYpiiJuFY3N4WNHMBWUQX5oNv2t/TbG0OHRp3Rr7yeu+HSfD542TIp9/gMZ+G0Cxd8AmVO3wkKIFbk0TL4Qg== dependencies: - "@sentry/types" "8.32.0" + "@sentry/types" "8.33.1" -"@sentry/vercel-edge@8.32.0": - version "8.32.0" - resolved "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-8.32.0.tgz" - integrity sha512-HxvQWQMjNsLPkYU0vArzjqh+p/vyw9CXyIruu3D89VQU0krL1JFhhhHWZj1UIb7MVTzNO4oq4HeldbOkI0AepA== +"@sentry/vercel-edge@8.33.1": + version "8.33.1" + resolved "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-8.33.1.tgz" + integrity sha512-YKAsFAm4ctsKRdoS3LkYF4oG5BD1chT4Uqy4AaBhlz0s5iHxBI7YzZFbcW4YiNnDWT80tdF+FS7AvUAjy+npoA== dependencies: - "@sentry/core" "8.32.0" - "@sentry/types" "8.32.0" - "@sentry/utils" "8.32.0" + "@sentry/core" "8.33.1" + "@sentry/types" "8.33.1" + "@sentry/utils" "8.33.1" "@sentry/webpack-plugin@2.22.3": version "2.22.3" @@ -1539,7 +1480,7 @@ dependencies: "@supabase/node-fetch" "^2.6.14" -"@supabase/node-fetch@2.6.15", "@supabase/node-fetch@^2.6.14": +"@supabase/node-fetch@^2.6.14", "@supabase/node-fetch@2.6.15": version "2.6.15" resolved "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz" integrity sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ== @@ -1579,7 +1520,7 @@ dependencies: "@supabase/node-fetch" "^2.6.14" -"@supabase/supabase-js@^2.45.0": +"@supabase/supabase-js@^2.43.4", "@supabase/supabase-js@^2.45.0": version "2.45.1" resolved "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.45.1.tgz" integrity sha512-/PVe3lXmalazD8BGMIoI7+ttvT1mLXy13lNcoAPtjP1TDDY83g8csZbVR6l+0/RZtvJxl3LGXfTJT4bjWgC5Nw== @@ -1715,7 +1656,7 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0": +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -1727,6 +1668,11 @@ dependencies: "@types/unist" "*" +"@types/json-schema@^7.0.8": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" @@ -1751,17 +1697,10 @@ dependencies: "@types/node" "*" -"@types/node@*": - version "20.16.1" - resolved "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz" - integrity sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ== - dependencies: - undici-types "~6.19.2" - -"@types/node@^22.7.3": - version "22.7.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.3.tgz#7ddf1ddf13078692b4cfadb835852b2a718ee1ef" - integrity sha512-qXKfhXXqGTyBskvWEzJZPUxSslAiLaB6JGP1ic/XTH9ctGgzdgYguuLP1C601aRTSDNlLb0jbKqXjZ48GNraSA== +"@types/node@*", "@types/node@^22.7.3": + version "22.7.4" + resolved "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz" + integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== dependencies: undici-types "~6.19.2" @@ -1791,7 +1730,7 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@^18": +"@types/react-dom@*", "@types/react-dom@^18": version "18.3.0" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== @@ -1805,7 +1744,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18": +"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^18", "@types/react@>=16.8", "@types/react@>=18": version "18.3.4" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz" integrity sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw== @@ -1886,19 +1825,150 @@ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@xyflow/react@^12.1.0": - version "12.1.1" - resolved "https://registry.npmjs.org/@xyflow/react/-/react-12.1.1.tgz" - integrity sha512-0/ToFd7YY6fKAWdz+NstK5K190xONpdEBPGTWIcNT0CjiCZ6Wj8qRPlg4oxYHtKkTyBQfsEvBWayJaxhwDIOGw== +"@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: - "@xyflow/system" "0.0.39" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@xyflow/react@^12.3.1": + version "12.3.1" + resolved "https://registry.npmjs.org/@xyflow/react/-/react-12.3.1.tgz" + integrity sha512-PurYFxwzJa0U6RRX9k4VbNRU+vQd6mRKFR8Uk1dF81diCKZDj495y6AupqsjMHtkO66tGHV0LdenLpIHvnOEFw== + dependencies: + "@xyflow/system" "0.0.43" classcat "^5.0.3" zustand "^4.4.0" -"@xyflow/system@0.0.39": - version "0.0.39" - resolved "https://registry.npmjs.org/@xyflow/system/-/system-0.0.39.tgz" - integrity sha512-0WSdTCoA6kF/BqIFyUVinoK32Qj8scfLVxPdDahW1eYBKi5F1SYSouzVjpF2loYskyRbGl4KgxwaHiCgrBYFmA== +"@xyflow/system@0.0.43": + version "0.0.43" + resolved "https://registry.npmjs.org/@xyflow/system/-/system-0.0.43.tgz" + integrity sha512-1zHgad1cWr1mKm2xbFaarK0Jg8WRgaQ8ubSBIo/pRdq3fEgCuqgNkL9NSAP6Rvm8zi3+Lu4JPUMN+EEx5QgX9A== dependencies: "@types/d3-drag" "^3.0.7" "@types/d3-selection" "^3.0.10" @@ -1918,7 +1988,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: version "8.12.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -1930,6 +2000,11 @@ agent-base@6: dependencies: debug "4" +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -1940,6 +2015,16 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^8.17.1: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" @@ -2171,7 +2256,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.23.1: +browserslist@^4.21.10, browserslist@^4.23.1, "browserslist@>= 4.21.0": version "4.23.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz" integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== @@ -2181,6 +2266,11 @@ browserslist@^4.23.1: node-releases "^2.0.18" update-browserslist-db "^1.1.0" +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + busboy@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" @@ -2219,14 +2309,6 @@ ccount@^2.0.0: resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chalk@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -2244,6 +2326,14 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + character-entities-html4@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" @@ -2279,6 +2369,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chrome-trace-event@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== + cjs-module-lexer@^1.2.2: version "1.4.1" resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz" @@ -2301,16 +2396,16 @@ client-only@0.0.1: resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -clsx@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" - integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== - clsx@^2.0.0, clsx@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== +clsx@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + cmdk@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz" @@ -2333,21 +2428,26 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + comma-separated-tokens@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^4.0.0: version "4.1.1" resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" @@ -2392,7 +2492,7 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: +d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3": version "3.2.4" resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== @@ -2409,7 +2509,7 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz" integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== -"d3-drag@2 - 3", d3-drag@^3.0.0: +d3-drag@^3.0.0, "d3-drag@2 - 3": version "3.0.0" resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz" integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== @@ -2417,7 +2517,7 @@ csstype@^3.0.2: d3-dispatch "1 - 3" d3-selection "3" -"d3-ease@1 - 3", d3-ease@^3.0.1: +d3-ease@^3.0.1, "d3-ease@1 - 3": version "3.0.1" resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== @@ -2427,7 +2527,7 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== -"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: +d3-interpolate@^3.0.1, "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3": version "3.0.1" resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== @@ -2450,7 +2550,7 @@ d3-scale@^4.0.2: d3-time "2.1.1 - 3" d3-time-format "2 - 4" -"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: +d3-selection@^3.0.0, "d3-selection@2 - 3", d3-selection@3: version "3.0.0" resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz" integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== @@ -2469,14 +2569,14 @@ d3-shape@^3.1.0: dependencies: d3-time "1 - 3" -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: +d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3": version "3.1.0" resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" -"d3-timer@1 - 3", d3-timer@^3.0.1: +d3-timer@^3.0.1, "d3-timer@1 - 3": version "3.0.1" resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== @@ -2535,18 +2635,11 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -date-fns@^3.6.0: +"date-fns@^2.28.0 || ^3.0.0", date-fns@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz" integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: - version "4.3.7" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -2554,6 +2647,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@4: + version "4.3.7" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decimal.js-light@^2.4.1: version "2.5.1" resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" @@ -2699,7 +2799,7 @@ emoji-regex@^9.2.2: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -enhanced-resolve@^5.12.0: +enhanced-resolve@^5.12.0, enhanced-resolve@^5.17.1: version "5.17.1" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz" integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== @@ -2806,6 +2906,11 @@ es-iterator-helpers@^1.0.19: iterator.prototype "^1.1.2" safe-array-concat "^1.1.2" +es-module-lexer@^1.2.1: + version "1.5.4" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== + es-object-atoms@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" @@ -2897,7 +3002,7 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" -eslint-plugin-import@^2.28.1: +eslint-plugin-import@*, eslint-plugin-import@^2.28.1: version "2.29.1" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== @@ -2979,12 +3084,20 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8, eslint@^8.56.0: version "8.57.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== @@ -3051,6 +3164,11 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" @@ -3076,6 +3194,11 @@ eventemitter3@^4.0.1: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + exenv@^1.2.0: version "1.2.2" resolved "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz" @@ -3185,7 +3308,12 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@2.3.2, fsevents@~2.3.2: +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +fsevents@2.3.2: version "2.3.2" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -3247,7 +3375,7 @@ get-tsconfig@^4.5.0: dependencies: resolve-pkg-maps "^1.0.0" -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3261,16 +3389,17 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@10.3.10: - version "10.3.10" - resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^10.3.10, glob@^10.4.1: version "10.4.5" @@ -3306,6 +3435,17 @@ glob@^9.3.2: minipass "^4.2.4" path-scurry "^1.6.1" +glob@10.3.10: + version "10.3.10" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -3345,7 +3485,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.2.11, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4: 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== @@ -3463,9 +3603,9 @@ import-fresh@^3.2.1: resolve-from "^4.0.0" import-in-the-middle@^1.11.0, import-in-the-middle@^1.8.1: - version "1.11.1" - resolved "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.1.tgz" - integrity sha512-lGdg70ECFGv/OHQXL/IPhcxkFPeQ7YA4zborlA54XHVr58oM50QNxItRiayHMqj1MspC5Y9zaHf+QHod/gq7Ug== + version "1.11.2" + resolved "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz" + integrity sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA== dependencies: acorn "^8.8.2" acorn-import-attributes "^1.9.5" @@ -3780,6 +3920,15 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jiti@^1.21.0: version "1.21.6" resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz" @@ -3807,6 +3956,11 @@ json-buffer@3.0.1: resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -3886,6 +4040,11 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" @@ -3932,13 +4091,6 @@ lucide-react@^0.407.0: resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.407.0.tgz" integrity sha512-+dRIu9Sry+E8wPF9+sY5eKld2omrU4X5IKXxrgqBt+o11IIHVU0QOfNoVWFuj0ZRDrxr4Wci26o2mKZqLGE0lA== -magic-string@0.30.8: - version "0.30.8" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz" - integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - magic-string@^0.30.3: version "0.30.11" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz" @@ -3946,6 +4098,13 @@ magic-string@^0.30.3: dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" +magic-string@0.30.8: + version "0.30.8" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + mdast-util-from-markdown@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz" @@ -4051,6 +4210,11 @@ mdast-util-to-string@^4.0.0: dependencies: "@types/mdast" "^4.0.0" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" @@ -4258,12 +4422,17 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.3" picomatch "^2.3.1" -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - brace-expansion "^2.0.1" + mime-db "1.52.0" minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" @@ -4279,13 +4448,27 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1, minimatch@^9.0.4: +minimatch@^9.0.1: version "9.0.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" @@ -4335,12 +4518,17 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + next-themes@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz" integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== -next@^14.2.13: +"next@^13.0.0 || ^14.0.0", "next@^13.2.0 || ^14.0 || ^15.0.0-rc.0", next@^14.2.13: version "14.2.13" resolved "https://registry.npmjs.org/next/-/next-14.2.13.tgz" integrity sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg== @@ -4588,17 +4776,17 @@ pirates@^4.0.1: resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== -playwright-core@1.47.1: - version "1.47.1" - resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.1.tgz" - integrity sha512-i1iyJdLftqtt51mEk6AhYFaAJCDx0xQ/O5NU8EKaWFgMjItPVma542Nh/Aq8aLCjIJSzjaiEQGW/nyqLkGF1OQ== +playwright-core@1.47.2: + version "1.47.2" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.2.tgz" + integrity sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ== -playwright@1.47.1: - version "1.47.1" - resolved "https://registry.npmjs.org/playwright/-/playwright-1.47.1.tgz" - integrity sha512-SUEKi6947IqYbKxRiqnbUobVZY4bF1uu+ZnZNJX9DfU1tlf2UhWfvVjLf01pQx9URsOr18bFVUKXmanYWhbfkw== +playwright@1.47.2: + version "1.47.2" + resolved "https://registry.npmjs.org/playwright/-/playwright-1.47.2.tgz" + integrity sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA== dependencies: - playwright-core "1.47.1" + playwright-core "1.47.2" optionalDependencies: fsevents "2.3.2" @@ -4651,6 +4839,15 @@ postcss-value-parser@^4.0.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@^8, postcss@^8.0.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9: + version "8.4.41" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + postcss@8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" @@ -4660,15 +4857,6 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8, postcss@^8.4.23: - version "8.4.41" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz" - integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" - postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" @@ -4701,7 +4889,7 @@ prettier-plugin-tailwindcss@^0.6.6: resolved "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.6.tgz" integrity sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng== -prettier@^3.3.3: +prettier@^3.0, prettier@^3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== @@ -4740,12 +4928,19 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + react-day-picker@^8.10.1: version "8.10.1" resolved "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz" integrity sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA== -react-dom@^18: +"react-dom@^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8 || ^17 || ^18", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", react-dom@^18, react-dom@^18.0.0, react-dom@^18.2.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=17: version "18.3.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== @@ -4753,7 +4948,7 @@ react-dom@^18: loose-envify "^1.1.0" scheduler "^0.23.2" -react-hook-form@^7.52.1: +react-hook-form@^7.0.0, react-hook-form@^7.52.1: version "7.52.2" resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.52.2.tgz" integrity sha512-pqfPEbERnxxiNMPd0bzmt1tuaPcVccywFDpyk2uV5xCIBphHV5T8SVnX9/o3kplPE1zzKt77+YIoq+EMwJp56A== @@ -4864,7 +5059,7 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -react@^18: +react@*, "react@^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.14.0 || 17.x || 18.x || 19.x", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.x || ^17.x || ^18.x", react@^18, react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=17, react@>=18: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -4979,7 +5174,7 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@1.22.8, resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.22.8: +resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.22.8, resolve@1.22.8: version "1.22.8" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -5009,7 +5204,7 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup@3.29.5: +rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.68.0||^3.0.0||^4.0.0, rollup@3.29.5: version "3.29.5" resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz" integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w== @@ -5033,6 +5228,11 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" @@ -5049,6 +5249,15 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" +schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" @@ -5059,6 +5268,13 @@ semver@^7.5.2, semver@^7.5.4: resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" @@ -5132,6 +5348,19 @@ source-map-js@^1.0.2, source-map-js@^1.2.0: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" @@ -5325,6 +5554,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -5340,7 +5576,7 @@ tailwindcss-animate@^1.0.7: resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== -tailwindcss@^3.4.1: +tailwindcss@^3.4.1, "tailwindcss@>=3.0.0 || insiders": version "3.4.10" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz" integrity sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w== @@ -5368,11 +5604,32 @@ tailwindcss@^3.4.1: resolve "^1.22.2" sucrase "^3.32.0" -tapable@^2.2.0: +tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.26.0: + version "5.33.0" + resolved "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz" + integrity sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -5515,7 +5772,7 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^5: +typescript@^5, typescript@^5.0.0, typescript@>=3.3.1, typescript@>=4.2.0: version "5.5.4" resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== @@ -5698,6 +5955,14 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -5713,6 +5978,35 @@ webpack-virtual-modules@^0.5.0: resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz" integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== +webpack@^5.1.0, webpack@>=4.40.0, webpack@>=5.0.0: + version "5.94.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz" + integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== + dependencies: + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.7.1" + acorn-import-attributes "^1.9.5" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" From c03e2fb9492550cc7c543cf4a5d6b6f352c86a0b Mon Sep 17 00:00:00 2001 From: Aarushi <50577581+aarushik93@users.noreply.github.com> Date: Thu, 10 Oct 2024 00:13:46 +0100 Subject: [PATCH 064/155] tweak(platform): Remove importing templates from local dir (#8276) * always filter on user id * add user id to doc string * fix linting * fix imports function * remove import templates from local directory --- .../backend/backend/data/graph.py | 31 ------------------- .../backend/backend/server/rest_api.py | 3 -- 2 files changed, 34 deletions(-) diff --git a/autogpt_platform/backend/backend/data/graph.py b/autogpt_platform/backend/backend/data/graph.py index 27be75ba55..991bef1f3f 100644 --- a/autogpt_platform/backend/backend/data/graph.py +++ b/autogpt_platform/backend/backend/data/graph.py @@ -2,7 +2,6 @@ import asyncio import logging import uuid from datetime import datetime, timezone -from pathlib import Path from typing import Any, Literal import prisma.types @@ -15,7 +14,6 @@ from backend.blocks.basic import AgentInputBlock, AgentOutputBlock from backend.data.block import BlockInput, get_block, get_blocks from backend.data.db import BaseDbModel, transaction from backend.data.execution import ExecutionStatus -from backend.data.user import DEFAULT_USER_ID from backend.util import json logger = logging.getLogger(__name__) @@ -611,32 +609,3 @@ async def __create_graph(tx, graph: Graph, user_id: str): for link in graph.links ] ) - - -# --------------------- Helper functions --------------------- # - - -TEMPLATES_DIR = Path(__file__).parent.parent.parent / "graph_templates" - - -async def import_packaged_templates() -> None: - templates_in_db = await get_graphs_meta( - user_id=DEFAULT_USER_ID, filter_by="template" - ) - - logging.info("Loading templates...") - for template_file in TEMPLATES_DIR.glob("*.json"): - template_data = json.loads(template_file.read_bytes()) - - template = Graph.model_validate(template_data) - if not template.is_template: - logging.warning( - f"pre-packaged graph file {template_file} is not a template" - ) - continue - if ( - exists := next((t for t in templates_in_db if t.id == template.id), None) - ) and exists.version >= template.version: - continue - await create_graph(template, DEFAULT_USER_ID) - logging.info(f"Loaded template '{template.name}' ({template.id})") diff --git a/autogpt_platform/backend/backend/server/rest_api.py b/autogpt_platform/backend/backend/server/rest_api.py index cc978521c5..f768d3927c 100644 --- a/autogpt_platform/backend/backend/server/rest_api.py +++ b/autogpt_platform/backend/backend/server/rest_api.py @@ -15,7 +15,6 @@ from typing_extensions import TypedDict from backend.data import block, db from backend.data import execution as execution_db from backend.data import graph as graph_db -from backend.data import user as user_db from backend.data.block import BlockInput, CompletedBlockOutput from backend.data.credit import get_block_costs, get_user_credit_model from backend.data.queue import RedisEventQueue @@ -45,8 +44,6 @@ class AgentServer(AppService): await db.connect() self.event_queue.connect() await block.initialize_blocks() - if await user_db.create_default_user(settings.config.enable_auth): - await graph_db.import_packaged_templates() yield self.event_queue.close() await db.disconnect() From 7b92bae9424d44e2c3b976370680fe9f7ccb686c Mon Sep 17 00:00:00 2001 From: vishesh10 Date: Thu, 10 Oct 2024 08:29:26 +0530 Subject: [PATCH 065/155] Fix block execution status in case of error (#8267) --- autogpt_platform/backend/backend/data/block.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/autogpt_platform/backend/backend/data/block.py b/autogpt_platform/backend/backend/data/block.py index 02ae317911..554dfc237c 100644 --- a/autogpt_platform/backend/backend/data/block.py +++ b/autogpt_platform/backend/backend/data/block.py @@ -272,6 +272,8 @@ class Block(ABC, Generic[BlockSchemaInputType, BlockSchemaOutputType]): for output_name, output_data in self.run( self.input_schema(**input_data), **kwargs ): + if "error" in output_name: + raise ValueError(output_data) if error := self.output_schema.validate_field(output_name, output_data): raise ValueError(f"Block produced an invalid output data: {error}") yield output_name, output_data From 9ad5e1f80833f697514a1ee263ed7e4e7daeefcf Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Thu, 10 Oct 2024 19:25:29 +0300 Subject: [PATCH 066/155] fix(platform): Remove blind try-except for yielding error on block (#8287) --- .../backend/backend/blocks/__init__.py | 13 +- .../blocks/ai_shortform_video_block.py | 116 ++++++++-------- .../backend/backend/blocks/basic.py | 48 +++---- .../backend/backend/blocks/block.py | 8 +- .../backend/backend/blocks/decoder_block.py | 7 +- .../backend/backend/blocks/email_block.py | 37 +++-- .../backend/backend/blocks/github/issues.py | 126 +++++++----------- .../backend/blocks/github/pull_requests.py | 74 ++++------ .../backend/backend/blocks/github/repo.py | 122 +++++++---------- .../backend/backend/blocks/google/gmail.py | 61 +++------ .../backend/backend/blocks/google/sheets.py | 30 ++--- .../backend/backend/blocks/google_maps.py | 19 ++- .../backend/backend/blocks/ideogram.py | 43 +++--- .../backend/backend/blocks/llm.py | 57 ++++---- .../backend/backend/blocks/medium.py | 48 +++---- .../backend/blocks/replicate_flux_advanced.py | 33 +++-- .../backend/backend/blocks/search.py | 85 ++++-------- .../backend/backend/blocks/talking_head.py | 65 +++++---- .../backend/blocks/text_to_speech_block.py | 15 +-- .../backend/backend/blocks/youtube.py | 15 +-- .../backend/backend/data/block.py | 4 +- docs/content/server/new_blocks.md | 12 +- 22 files changed, 428 insertions(+), 610 deletions(-) diff --git a/autogpt_platform/backend/backend/blocks/__init__.py b/autogpt_platform/backend/backend/blocks/__init__.py index d090aa41be..1fd85aef46 100644 --- a/autogpt_platform/backend/backend/blocks/__init__.py +++ b/autogpt_platform/backend/backend/blocks/__init__.py @@ -53,15 +53,22 @@ for cls in all_subclasses(Block): if block.id in AVAILABLE_BLOCKS: raise ValueError(f"Block ID {block.name} error: {block.id} is already in use") + input_schema = block.input_schema.model_fields + output_schema = block.output_schema.model_fields + # Prevent duplicate field name in input_schema and output_schema - duplicate_field_names = set(block.input_schema.model_fields.keys()) & set( - block.output_schema.model_fields.keys() - ) + duplicate_field_names = set(input_schema.keys()) & set(output_schema.keys()) if duplicate_field_names: raise ValueError( f"{block.name} has duplicate field names in input_schema and output_schema: {duplicate_field_names}" ) + # Make sure `error` field is a string in the output schema + if "error" in output_schema and output_schema["error"].annotation is not str: + raise ValueError( + f"{block.name} `error` field in output_schema must be a string" + ) + for field in block.input_schema.model_fields.values(): if field.annotation is bool and field.default not in (True, False): raise ValueError(f"{block.name} has a boolean field with no default value") diff --git a/autogpt_platform/backend/backend/blocks/ai_shortform_video_block.py b/autogpt_platform/backend/backend/blocks/ai_shortform_video_block.py index f4f12c9fe1..127bb3ae8b 100644 --- a/autogpt_platform/backend/backend/blocks/ai_shortform_video_block.py +++ b/autogpt_platform/backend/backend/blocks/ai_shortform_video_block.py @@ -1,7 +1,6 @@ import logging import time from enum import Enum -from typing import Optional import requests from pydantic import Field @@ -156,7 +155,7 @@ class AIShortformVideoCreatorBlock(Block): class Output(BlockSchema): video_url: str = Field(description="The URL of the created video") - error: Optional[str] = Field(description="Error message if the request failed") + error: str = Field(description="Error message if the request failed") def __init__(self): super().__init__( @@ -239,69 +238,58 @@ class AIShortformVideoCreatorBlock(Block): raise TimeoutError("Video creation timed out") def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - # Create a new Webhook.site URL - webhook_token, webhook_url = self.create_webhook() - logger.debug(f"Webhook URL: {webhook_url}") + # Create a new Webhook.site URL + webhook_token, webhook_url = self.create_webhook() + logger.debug(f"Webhook URL: {webhook_url}") - audio_url = input_data.background_music.audio_url + audio_url = input_data.background_music.audio_url - payload = { - "frameRate": input_data.frame_rate, - "resolution": input_data.resolution, - "frameDurationMultiplier": 18, - "webhook": webhook_url, - "creationParams": { - "mediaType": input_data.video_style, - "captionPresetName": "Wrap 1", - "selectedVoice": input_data.voice.voice_id, - "hasEnhancedGeneration": True, - "generationPreset": input_data.generation_preset.name, - "selectedAudio": input_data.background_music, - "origin": "/create", - "inputText": input_data.script, - "flowType": "text-to-video", - "slug": "create-tiktok-video", - "hasToGenerateVoice": True, - "hasToTranscript": False, - "hasToSearchMedia": True, - "hasAvatar": False, - "hasWebsiteRecorder": False, - "hasTextSmallAtBottom": False, - "ratio": input_data.ratio, - "sourceType": "contentScraping", - "selectedStoryStyle": {"value": "custom", "label": "Custom"}, - "hasToGenerateVideos": input_data.video_style - != VisualMediaType.STOCK_VIDEOS, - "audioUrl": audio_url, - }, - } + payload = { + "frameRate": input_data.frame_rate, + "resolution": input_data.resolution, + "frameDurationMultiplier": 18, + "webhook": webhook_url, + "creationParams": { + "mediaType": input_data.video_style, + "captionPresetName": "Wrap 1", + "selectedVoice": input_data.voice.voice_id, + "hasEnhancedGeneration": True, + "generationPreset": input_data.generation_preset.name, + "selectedAudio": input_data.background_music, + "origin": "/create", + "inputText": input_data.script, + "flowType": "text-to-video", + "slug": "create-tiktok-video", + "hasToGenerateVoice": True, + "hasToTranscript": False, + "hasToSearchMedia": True, + "hasAvatar": False, + "hasWebsiteRecorder": False, + "hasTextSmallAtBottom": False, + "ratio": input_data.ratio, + "sourceType": "contentScraping", + "selectedStoryStyle": {"value": "custom", "label": "Custom"}, + "hasToGenerateVideos": input_data.video_style + != VisualMediaType.STOCK_VIDEOS, + "audioUrl": audio_url, + }, + } - logger.debug("Creating video...") - response = self.create_video(input_data.api_key.get_secret_value(), payload) - pid = response.get("pid") + logger.debug("Creating video...") + response = self.create_video(input_data.api_key.get_secret_value(), payload) + pid = response.get("pid") - if not pid: - logger.error( - f"Failed to create video: No project ID returned. API Response: {response}" - ) - yield "error", "Failed to create video: No project ID returned" - else: - logger.debug( - f"Video created with project ID: {pid}. Waiting for completion..." - ) - video_url = self.wait_for_video( - input_data.api_key.get_secret_value(), pid, webhook_token - ) - logger.debug(f"Video ready: {video_url}") - yield "video_url", video_url - - except requests.RequestException as e: - logger.exception("Error creating video") - yield "error", f"Error creating video: {str(e)}" - except ValueError as e: - logger.exception("Error in video creation process") - yield "error", str(e) - except TimeoutError as e: - logger.exception("Video creation timed out") - yield "error", str(e) + if not pid: + logger.error( + f"Failed to create video: No project ID returned. API Response: {response}" + ) + raise RuntimeError("Failed to create video: No project ID returned") + else: + logger.debug( + f"Video created with project ID: {pid}. Waiting for completion..." + ) + video_url = self.wait_for_video( + input_data.api_key.get_secret_value(), pid, webhook_token + ) + logger.debug(f"Video ready: {video_url}") + yield "video_url", video_url diff --git a/autogpt_platform/backend/backend/blocks/basic.py b/autogpt_platform/backend/backend/blocks/basic.py index 095c3b0e92..60992e0f45 100644 --- a/autogpt_platform/backend/backend/blocks/basic.py +++ b/autogpt_platform/backend/backend/blocks/basic.py @@ -330,20 +330,17 @@ class AddToDictionaryBlock(Block): ) def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - # If no dictionary is provided, create a new one - if input_data.dictionary is None: - updated_dict = {} - else: - # Create a copy of the input dictionary to avoid modifying the original - updated_dict = input_data.dictionary.copy() + # If no dictionary is provided, create a new one + if input_data.dictionary is None: + updated_dict = {} + else: + # Create a copy of the input dictionary to avoid modifying the original + updated_dict = input_data.dictionary.copy() - # Add the new key-value pair - updated_dict[input_data.key] = input_data.value + # Add the new key-value pair + updated_dict[input_data.key] = input_data.value - yield "updated_dictionary", updated_dict - except Exception as e: - yield "error", f"Failed to add entry to dictionary: {str(e)}" + yield "updated_dictionary", updated_dict class AddToListBlock(Block): @@ -401,23 +398,20 @@ class AddToListBlock(Block): ) def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - # If no list is provided, create a new one - if input_data.list is None: - updated_list = [] - else: - # Create a copy of the input list to avoid modifying the original - updated_list = input_data.list.copy() + # If no list is provided, create a new one + if input_data.list is None: + updated_list = [] + else: + # Create a copy of the input list to avoid modifying the original + updated_list = input_data.list.copy() - # Add the new entry - if input_data.position is None: - updated_list.append(input_data.entry) - else: - updated_list.insert(input_data.position, input_data.entry) + # Add the new entry + if input_data.position is None: + updated_list.append(input_data.entry) + else: + updated_list.insert(input_data.position, input_data.entry) - yield "updated_list", updated_list - except Exception as e: - yield "error", f"Failed to add entry to list: {str(e)}" + yield "updated_list", updated_list class NoteBlock(Block): diff --git a/autogpt_platform/backend/backend/blocks/block.py b/autogpt_platform/backend/backend/blocks/block.py index a4bea7aee7..a4bf8f6ac5 100644 --- a/autogpt_platform/backend/backend/blocks/block.py +++ b/autogpt_platform/backend/backend/blocks/block.py @@ -37,14 +37,12 @@ class BlockInstallationBlock(Block): if search := re.search(r"class (\w+)\(Block\):", code): class_name = search.group(1) else: - yield "error", "No class found in the code." - return + raise RuntimeError("No class found in the code.") if search := re.search(r"id=\"(\w+-\w+-\w+-\w+-\w+)\"", code): file_name = search.group(1) else: - yield "error", "No UUID found in the code." - return + raise RuntimeError("No UUID found in the code.") block_dir = os.path.dirname(__file__) file_path = f"{block_dir}/{file_name}.py" @@ -63,4 +61,4 @@ class BlockInstallationBlock(Block): yield "success", "Block installed successfully." except Exception as e: os.remove(file_path) - yield "error", f"[Code]\n{code}\n\n[Error]\n{str(e)}" + raise RuntimeError(f"[Code]\n{code}\n\n[Error]\n{str(e)}") diff --git a/autogpt_platform/backend/backend/blocks/decoder_block.py b/autogpt_platform/backend/backend/blocks/decoder_block.py index fb23ef2c56..033cdfb0b3 100644 --- a/autogpt_platform/backend/backend/blocks/decoder_block.py +++ b/autogpt_platform/backend/backend/blocks/decoder_block.py @@ -35,8 +35,5 @@ This is a "quoted" string.""", ) def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - decoded_text = codecs.decode(input_data.text, "unicode_escape") - yield "decoded_text", decoded_text - except Exception as e: - yield "error", f"Error decoding text: {str(e)}" + decoded_text = codecs.decode(input_data.text, "unicode_escape") + yield "decoded_text", decoded_text diff --git a/autogpt_platform/backend/backend/blocks/email_block.py b/autogpt_platform/backend/backend/blocks/email_block.py index 96e69e1ffc..a7f0f82dce 100644 --- a/autogpt_platform/backend/backend/blocks/email_block.py +++ b/autogpt_platform/backend/backend/blocks/email_block.py @@ -67,35 +67,28 @@ class SendEmailBlock(Block): def send_email( creds: EmailCredentials, to_email: str, subject: str, body: str ) -> str: - try: - smtp_server = creds.smtp_server - smtp_port = creds.smtp_port - smtp_username = creds.smtp_username.get_secret_value() - smtp_password = creds.smtp_password.get_secret_value() + smtp_server = creds.smtp_server + smtp_port = creds.smtp_port + smtp_username = creds.smtp_username.get_secret_value() + smtp_password = creds.smtp_password.get_secret_value() - msg = MIMEMultipart() - msg["From"] = smtp_username - msg["To"] = to_email - msg["Subject"] = subject - msg.attach(MIMEText(body, "plain")) + msg = MIMEMultipart() + msg["From"] = smtp_username + msg["To"] = to_email + msg["Subject"] = subject + msg.attach(MIMEText(body, "plain")) - with smtplib.SMTP(smtp_server, smtp_port) as server: - server.starttls() - server.login(smtp_username, smtp_password) - server.sendmail(smtp_username, to_email, msg.as_string()) + with smtplib.SMTP(smtp_server, smtp_port) as server: + server.starttls() + server.login(smtp_username, smtp_password) + server.sendmail(smtp_username, to_email, msg.as_string()) - return "Email sent successfully" - except Exception as e: - return f"Failed to send email: {str(e)}" + return "Email sent successfully" def run(self, input_data: Input, **kwargs) -> BlockOutput: - status = self.send_email( + yield "status", self.send_email( input_data.creds, input_data.to_email, input_data.subject, input_data.body, ) - if "successfully" in status: - yield "status", status - else: - yield "error", status diff --git a/autogpt_platform/backend/backend/blocks/github/issues.py b/autogpt_platform/backend/backend/blocks/github/issues.py index 0ddeb547ee..ee9391545d 100644 --- a/autogpt_platform/backend/backend/blocks/github/issues.py +++ b/autogpt_platform/backend/backend/blocks/github/issues.py @@ -93,16 +93,13 @@ class GithubCommentBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - id, url = self.post_comment( - credentials, - input_data.issue_url, - input_data.comment, - ) - yield "id", id - yield "url", url - except Exception as e: - yield "error", f"Failed to post comment: {str(e)}" + id, url = self.post_comment( + credentials, + input_data.issue_url, + input_data.comment, + ) + yield "id", id + yield "url", url # --8<-- [end:GithubCommentBlockExample] @@ -179,17 +176,14 @@ class GithubMakeIssueBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - number, url = self.create_issue( - credentials, - input_data.repo_url, - input_data.title, - input_data.body, - ) - yield "number", number - yield "url", url - except Exception as e: - yield "error", f"Failed to create issue: {str(e)}" + number, url = self.create_issue( + credentials, + input_data.repo_url, + input_data.title, + input_data.body, + ) + yield "number", number + yield "url", url class GithubReadIssueBlock(Block): @@ -262,16 +256,13 @@ class GithubReadIssueBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - title, body, user = self.read_issue( - credentials, - input_data.issue_url, - ) - yield "title", title - yield "body", body - yield "user", user - except Exception as e: - yield "error", f"Failed to read issue: {str(e)}" + title, body, user = self.read_issue( + credentials, + input_data.issue_url, + ) + yield "title", title + yield "body", body + yield "user", user class GithubListIssuesBlock(Block): @@ -350,14 +341,11 @@ class GithubListIssuesBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - issues = self.list_issues( - credentials, - input_data.repo_url, - ) - yield from (("issue", issue) for issue in issues) - except Exception as e: - yield "error", f"Failed to list issues: {str(e)}" + issues = self.list_issues( + credentials, + input_data.repo_url, + ) + yield from (("issue", issue) for issue in issues) class GithubAddLabelBlock(Block): @@ -428,15 +416,12 @@ class GithubAddLabelBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - status = self.add_label( - credentials, - input_data.issue_url, - input_data.label, - ) - yield "status", status - except Exception as e: - yield "error", f"Failed to add label: {str(e)}" + status = self.add_label( + credentials, + input_data.issue_url, + input_data.label, + ) + yield "status", status class GithubRemoveLabelBlock(Block): @@ -512,15 +497,12 @@ class GithubRemoveLabelBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - status = self.remove_label( - credentials, - input_data.issue_url, - input_data.label, - ) - yield "status", status - except Exception as e: - yield "error", f"Failed to remove label: {str(e)}" + status = self.remove_label( + credentials, + input_data.issue_url, + input_data.label, + ) + yield "status", status class GithubAssignIssueBlock(Block): @@ -594,15 +576,12 @@ class GithubAssignIssueBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - status = self.assign_issue( - credentials, - input_data.issue_url, - input_data.assignee, - ) - yield "status", status - except Exception as e: - yield "error", f"Failed to assign issue: {str(e)}" + status = self.assign_issue( + credentials, + input_data.issue_url, + input_data.assignee, + ) + yield "status", status class GithubUnassignIssueBlock(Block): @@ -676,12 +655,9 @@ class GithubUnassignIssueBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - status = self.unassign_issue( - credentials, - input_data.issue_url, - input_data.assignee, - ) - yield "status", status - except Exception as e: - yield "error", f"Failed to unassign issue: {str(e)}" + status = self.unassign_issue( + credentials, + input_data.issue_url, + input_data.assignee, + ) + yield "status", status diff --git a/autogpt_platform/backend/backend/blocks/github/pull_requests.py b/autogpt_platform/backend/backend/blocks/github/pull_requests.py index 87540b66df..b04c730dc3 100644 --- a/autogpt_platform/backend/backend/blocks/github/pull_requests.py +++ b/autogpt_platform/backend/backend/blocks/github/pull_requests.py @@ -87,14 +87,11 @@ class GithubListPullRequestsBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - pull_requests = self.list_prs( - credentials, - input_data.repo_url, - ) - yield from (("pull_request", pr) for pr in pull_requests) - except Exception as e: - yield "error", f"Failed to list pull requests: {str(e)}" + pull_requests = self.list_prs( + credentials, + input_data.repo_url, + ) + yield from (("pull_request", pr) for pr in pull_requests) class GithubMakePullRequestBlock(Block): @@ -203,9 +200,7 @@ class GithubMakePullRequestBlock(Block): error_message = error_details.get("message", "Unknown error") else: error_message = str(http_err) - yield "error", f"Failed to create pull request: {error_message}" - except Exception as e: - yield "error", f"Failed to create pull request: {str(e)}" + raise RuntimeError(f"Failed to create pull request: {error_message}") class GithubReadPullRequestBlock(Block): @@ -313,23 +308,20 @@ class GithubReadPullRequestBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - title, body, author = self.read_pr( + title, body, author = self.read_pr( + credentials, + input_data.pr_url, + ) + yield "title", title + yield "body", body + yield "author", author + + if input_data.include_pr_changes: + changes = self.read_pr_changes( credentials, input_data.pr_url, ) - yield "title", title - yield "body", body - yield "author", author - - if input_data.include_pr_changes: - changes = self.read_pr_changes( - credentials, - input_data.pr_url, - ) - yield "changes", changes - except Exception as e: - yield "error", f"Failed to read pull request: {str(e)}" + yield "changes", changes class GithubAssignPRReviewerBlock(Block): @@ -418,9 +410,7 @@ class GithubAssignPRReviewerBlock(Block): ) else: error_msg = f"HTTP error: {http_err} - {http_err.response.text}" - yield "error", error_msg - except Exception as e: - yield "error", f"Failed to assign reviewer: {str(e)}" + raise RuntimeError(error_msg) class GithubUnassignPRReviewerBlock(Block): @@ -490,15 +480,12 @@ class GithubUnassignPRReviewerBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - status = self.unassign_reviewer( - credentials, - input_data.pr_url, - input_data.reviewer, - ) - yield "status", status - except Exception as e: - yield "error", f"Failed to unassign reviewer: {str(e)}" + status = self.unassign_reviewer( + credentials, + input_data.pr_url, + input_data.reviewer, + ) + yield "status", status class GithubListPRReviewersBlock(Block): @@ -586,11 +573,8 @@ class GithubListPRReviewersBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - reviewers = self.list_reviewers( - credentials, - input_data.pr_url, - ) - yield from (("reviewer", reviewer) for reviewer in reviewers) - except Exception as e: - yield "error", f"Failed to list reviewers: {str(e)}" + reviewers = self.list_reviewers( + credentials, + input_data.pr_url, + ) + yield from (("reviewer", reviewer) for reviewer in reviewers) diff --git a/autogpt_platform/backend/backend/blocks/github/repo.py b/autogpt_platform/backend/backend/blocks/github/repo.py index 63dcc7e1a1..29eeb757e2 100644 --- a/autogpt_platform/backend/backend/blocks/github/repo.py +++ b/autogpt_platform/backend/backend/blocks/github/repo.py @@ -96,14 +96,11 @@ class GithubListTagsBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - tags = self.list_tags( - credentials, - input_data.repo_url, - ) - yield from (("tag", tag) for tag in tags) - except Exception as e: - yield "error", f"Failed to list tags: {str(e)}" + tags = self.list_tags( + credentials, + input_data.repo_url, + ) + yield from (("tag", tag) for tag in tags) class GithubListBranchesBlock(Block): @@ -183,14 +180,11 @@ class GithubListBranchesBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - branches = self.list_branches( - credentials, - input_data.repo_url, - ) - yield from (("branch", branch) for branch in branches) - except Exception as e: - yield "error", f"Failed to list branches: {str(e)}" + branches = self.list_branches( + credentials, + input_data.repo_url, + ) + yield from (("branch", branch) for branch in branches) class GithubListDiscussionsBlock(Block): @@ -294,13 +288,10 @@ class GithubListDiscussionsBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - discussions = self.list_discussions( - credentials, input_data.repo_url, input_data.num_discussions - ) - yield from (("discussion", discussion) for discussion in discussions) - except Exception as e: - yield "error", f"Failed to list discussions: {str(e)}" + discussions = self.list_discussions( + credentials, input_data.repo_url, input_data.num_discussions + ) + yield from (("discussion", discussion) for discussion in discussions) class GithubListReleasesBlock(Block): @@ -381,14 +372,11 @@ class GithubListReleasesBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - releases = self.list_releases( - credentials, - input_data.repo_url, - ) - yield from (("release", release) for release in releases) - except Exception as e: - yield "error", f"Failed to list releases: {str(e)}" + releases = self.list_releases( + credentials, + input_data.repo_url, + ) + yield from (("release", release) for release in releases) class GithubReadFileBlock(Block): @@ -474,18 +462,15 @@ class GithubReadFileBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - raw_content, size = self.read_file( - credentials, - input_data.repo_url, - input_data.file_path.lstrip("/"), - input_data.branch, - ) - yield "raw_content", raw_content - yield "text_content", base64.b64decode(raw_content).decode("utf-8") - yield "size", size - except Exception as e: - yield "error", f"Failed to read file: {str(e)}" + raw_content, size = self.read_file( + credentials, + input_data.repo_url, + input_data.file_path.lstrip("/"), + input_data.branch, + ) + yield "raw_content", raw_content + yield "text_content", base64.b64decode(raw_content).decode("utf-8") + yield "size", size class GithubReadFolderBlock(Block): @@ -612,17 +597,14 @@ class GithubReadFolderBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - files, dirs = self.read_folder( - credentials, - input_data.repo_url, - input_data.folder_path.lstrip("/"), - input_data.branch, - ) - yield from (("file", file) for file in files) - yield from (("dir", dir) for dir in dirs) - except Exception as e: - yield "error", f"Failed to read folder: {str(e)}" + files, dirs = self.read_folder( + credentials, + input_data.repo_url, + input_data.folder_path.lstrip("/"), + input_data.branch, + ) + yield from (("file", file) for file in files) + yield from (("dir", dir) for dir in dirs) class GithubMakeBranchBlock(Block): @@ -703,16 +685,13 @@ class GithubMakeBranchBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - status = self.create_branch( - credentials, - input_data.repo_url, - input_data.new_branch, - input_data.source_branch, - ) - yield "status", status - except Exception as e: - yield "error", f"Failed to create branch: {str(e)}" + status = self.create_branch( + credentials, + input_data.repo_url, + input_data.new_branch, + input_data.source_branch, + ) + yield "status", status class GithubDeleteBranchBlock(Block): @@ -775,12 +754,9 @@ class GithubDeleteBranchBlock(Block): credentials: GithubCredentials, **kwargs, ) -> BlockOutput: - try: - status = self.delete_branch( - credentials, - input_data.repo_url, - input_data.branch, - ) - yield "status", status - except Exception as e: - yield "error", f"Failed to delete branch: {str(e)}" + status = self.delete_branch( + credentials, + input_data.repo_url, + input_data.branch, + ) + yield "status", status diff --git a/autogpt_platform/backend/backend/blocks/google/gmail.py b/autogpt_platform/backend/backend/blocks/google/gmail.py index 9cecac81f1..beb96f3439 100644 --- a/autogpt_platform/backend/backend/blocks/google/gmail.py +++ b/autogpt_platform/backend/backend/blocks/google/gmail.py @@ -104,16 +104,11 @@ class GmailReadBlock(Block): def run( self, input_data: Input, *, credentials: GoogleCredentials, **kwargs ) -> BlockOutput: - try: - service = self._build_service(credentials, **kwargs) - messages = self._read_emails( - service, input_data.query, input_data.max_results - ) - for email in messages: - yield "email", email - yield "emails", messages - except Exception as e: - yield "error", str(e) + service = self._build_service(credentials, **kwargs) + messages = self._read_emails(service, input_data.query, input_data.max_results) + for email in messages: + yield "email", email + yield "emails", messages @staticmethod def _build_service(credentials: GoogleCredentials, **kwargs): @@ -267,14 +262,11 @@ class GmailSendBlock(Block): def run( self, input_data: Input, *, credentials: GoogleCredentials, **kwargs ) -> BlockOutput: - try: - service = GmailReadBlock._build_service(credentials, **kwargs) - send_result = self._send_email( - service, input_data.to, input_data.subject, input_data.body - ) - yield "result", send_result - except Exception as e: - yield "error", str(e) + service = GmailReadBlock._build_service(credentials, **kwargs) + send_result = self._send_email( + service, input_data.to, input_data.subject, input_data.body + ) + yield "result", send_result def _send_email(self, service, to: str, subject: str, body: str) -> dict: if not to or not subject or not body: @@ -342,12 +334,9 @@ class GmailListLabelsBlock(Block): def run( self, input_data: Input, *, credentials: GoogleCredentials, **kwargs ) -> BlockOutput: - try: - service = GmailReadBlock._build_service(credentials, **kwargs) - labels = self._list_labels(service) - yield "result", labels - except Exception as e: - yield "error", str(e) + service = GmailReadBlock._build_service(credentials, **kwargs) + labels = self._list_labels(service) + yield "result", labels def _list_labels(self, service) -> list[dict]: results = service.users().labels().list(userId="me").execute() @@ -406,14 +395,9 @@ class GmailAddLabelBlock(Block): def run( self, input_data: Input, *, credentials: GoogleCredentials, **kwargs ) -> BlockOutput: - try: - service = GmailReadBlock._build_service(credentials, **kwargs) - result = self._add_label( - service, input_data.message_id, input_data.label_name - ) - yield "result", result - except Exception as e: - yield "error", str(e) + service = GmailReadBlock._build_service(credentials, **kwargs) + result = self._add_label(service, input_data.message_id, input_data.label_name) + yield "result", result def _add_label(self, service, message_id: str, label_name: str) -> dict: label_id = self._get_or_create_label(service, label_name) @@ -494,14 +478,11 @@ class GmailRemoveLabelBlock(Block): def run( self, input_data: Input, *, credentials: GoogleCredentials, **kwargs ) -> BlockOutput: - try: - service = GmailReadBlock._build_service(credentials, **kwargs) - result = self._remove_label( - service, input_data.message_id, input_data.label_name - ) - yield "result", result - except Exception as e: - yield "error", str(e) + service = GmailReadBlock._build_service(credentials, **kwargs) + result = self._remove_label( + service, input_data.message_id, input_data.label_name + ) + yield "result", result def _remove_label(self, service, message_id: str, label_name: str) -> dict: label_id = self._get_label_id(service, label_name) diff --git a/autogpt_platform/backend/backend/blocks/google/sheets.py b/autogpt_platform/backend/backend/blocks/google/sheets.py index e4318225cc..e7878ff4b6 100644 --- a/autogpt_platform/backend/backend/blocks/google/sheets.py +++ b/autogpt_platform/backend/backend/blocks/google/sheets.py @@ -68,14 +68,9 @@ class GoogleSheetsReadBlock(Block): def run( self, input_data: Input, *, credentials: GoogleCredentials, **kwargs ) -> BlockOutput: - try: - service = self._build_service(credentials, **kwargs) - data = self._read_sheet( - service, input_data.spreadsheet_id, input_data.range - ) - yield "result", data - except Exception as e: - yield "error", str(e) + service = self._build_service(credentials, **kwargs) + data = self._read_sheet(service, input_data.spreadsheet_id, input_data.range) + yield "result", data @staticmethod def _build_service(credentials: GoogleCredentials, **kwargs): @@ -162,17 +157,14 @@ class GoogleSheetsWriteBlock(Block): def run( self, input_data: Input, *, credentials: GoogleCredentials, **kwargs ) -> BlockOutput: - try: - service = GoogleSheetsReadBlock._build_service(credentials, **kwargs) - result = self._write_sheet( - service, - input_data.spreadsheet_id, - input_data.range, - input_data.values, - ) - yield "result", result - except Exception as e: - yield "error", str(e) + service = GoogleSheetsReadBlock._build_service(credentials, **kwargs) + result = self._write_sheet( + service, + input_data.spreadsheet_id, + input_data.range, + input_data.values, + ) + yield "result", result def _write_sheet( self, service, spreadsheet_id: str, range: str, values: list[list[str]] diff --git a/autogpt_platform/backend/backend/blocks/google_maps.py b/autogpt_platform/backend/backend/blocks/google_maps.py index 4edd74113d..3be57b93e8 100644 --- a/autogpt_platform/backend/backend/blocks/google_maps.py +++ b/autogpt_platform/backend/backend/blocks/google_maps.py @@ -82,17 +82,14 @@ class GoogleMapsSearchBlock(Block): ) def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - places = self.search_places( - input_data.api_key.get_secret_value(), - input_data.query, - input_data.radius, - input_data.max_results, - ) - for place in places: - yield "place", place - except Exception as e: - yield "error", str(e) + places = self.search_places( + input_data.api_key.get_secret_value(), + input_data.query, + input_data.radius, + input_data.max_results, + ) + for place in places: + yield "place", place def search_places(self, api_key, query, radius, max_results): client = googlemaps.Client(key=api_key) diff --git a/autogpt_platform/backend/backend/blocks/ideogram.py b/autogpt_platform/backend/backend/blocks/ideogram.py index 0bf20ee6bd..66dd220614 100644 --- a/autogpt_platform/backend/backend/blocks/ideogram.py +++ b/autogpt_platform/backend/backend/blocks/ideogram.py @@ -128,9 +128,7 @@ class IdeogramModelBlock(Block): class Output(BlockSchema): result: str = SchemaField(description="Generated image URL") - error: Optional[str] = SchemaField( - description="Error message if the model run failed" - ) + error: str = SchemaField(description="Error message if the model run failed") def __init__(self): super().__init__( @@ -166,30 +164,27 @@ class IdeogramModelBlock(Block): def run(self, input_data: Input, **kwargs) -> BlockOutput: seed = input_data.seed - try: - # Step 1: Generate the image - result = self.run_model( + # Step 1: Generate the image + result = self.run_model( + api_key=input_data.api_key.get_secret_value(), + model_name=input_data.ideogram_model_name.value, + prompt=input_data.prompt, + seed=seed, + aspect_ratio=input_data.aspect_ratio.value, + magic_prompt_option=input_data.magic_prompt_option.value, + style_type=input_data.style_type.value, + negative_prompt=input_data.negative_prompt, + color_palette_name=input_data.color_palette_name.value, + ) + + # Step 2: Upscale the image if requested + if input_data.upscale == UpscaleOption.AI_UPSCALE: + result = self.upscale_image( api_key=input_data.api_key.get_secret_value(), - model_name=input_data.ideogram_model_name.value, - prompt=input_data.prompt, - seed=seed, - aspect_ratio=input_data.aspect_ratio.value, - magic_prompt_option=input_data.magic_prompt_option.value, - style_type=input_data.style_type.value, - negative_prompt=input_data.negative_prompt, - color_palette_name=input_data.color_palette_name.value, + image_url=result, ) - # Step 2: Upscale the image if requested - if input_data.upscale == UpscaleOption.AI_UPSCALE: - result = self.upscale_image( - api_key=input_data.api_key.get_secret_value(), - image_url=result, - ) - - yield "result", result - except Exception as e: - yield "error", str(e) + yield "result", result def run_model( self, diff --git a/autogpt_platform/backend/backend/blocks/llm.py b/autogpt_platform/backend/backend/blocks/llm.py index 15f75ecc74..f38b5f5da7 100644 --- a/autogpt_platform/backend/backend/blocks/llm.py +++ b/autogpt_platform/backend/backend/blocks/llm.py @@ -344,7 +344,7 @@ class AIStructuredResponseGeneratorBlock(Block): logger.error(f"Error calling LLM: {e}") retry_prompt = f"Error calling LLM: {e}" - yield "error", retry_prompt + raise RuntimeError(retry_prompt) class AITextGeneratorBlock(Block): @@ -390,14 +390,11 @@ class AITextGeneratorBlock(Block): raise ValueError("Failed to get a response from the LLM.") def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - object_input_data = AIStructuredResponseGeneratorBlock.Input( - **{attr: getattr(input_data, attr) for attr in input_data.model_fields}, - expected_format={}, - ) - yield "response", self.llm_call(object_input_data) - except Exception as e: - yield "error", str(e) + object_input_data = AIStructuredResponseGeneratorBlock.Input( + **{attr: getattr(input_data, attr) for attr in input_data.model_fields}, + expected_format={}, + ) + yield "response", self.llm_call(object_input_data) class SummaryStyle(Enum): @@ -445,11 +442,8 @@ class AITextSummarizerBlock(Block): ) def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - for output in self._run(input_data): - yield output - except Exception as e: - yield "error", str(e) + for output in self._run(input_data): + yield output def _run(self, input_data: Input) -> BlockOutput: chunks = self._split_text( @@ -642,24 +636,21 @@ class AIConversationBlock(Block): raise ValueError(f"Unsupported LLM provider: {provider}") def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - api_key = ( - input_data.api_key.get_secret_value() - or LlmApiKeys[input_data.model.metadata.provider].get_secret_value() - ) + api_key = ( + input_data.api_key.get_secret_value() + or LlmApiKeys[input_data.model.metadata.provider].get_secret_value() + ) - messages = [message.model_dump() for message in input_data.messages] + messages = [message.model_dump() for message in input_data.messages] - response = self.llm_call( - api_key=api_key, - model=input_data.model, - messages=messages, - max_tokens=input_data.max_tokens, - ) + response = self.llm_call( + api_key=api_key, + model=input_data.model, + messages=messages, + max_tokens=input_data.max_tokens, + ) - yield "response", response - except Exception as e: - yield "error", f"Error calling LLM: {str(e)}" + yield "response", response class AIListGeneratorBlock(Block): @@ -777,9 +768,7 @@ class AIListGeneratorBlock(Block): or LlmApiKeys[input_data.model.metadata.provider].get_secret_value() ) if not api_key_check: - logger.error("No LLM API key provided.") - yield "error", "No LLM API key provided." - return + raise ValueError("No LLM API key provided.") # Prepare the system prompt sys_prompt = """You are a Python list generator. Your task is to generate a Python list based on the user's prompt. @@ -873,7 +862,9 @@ class AIListGeneratorBlock(Block): logger.error( f"Failed to generate a valid Python list after {input_data.max_retries} attempts" ) - yield "error", f"Failed to generate a valid Python list after {input_data.max_retries} attempts. Last error: {str(e)}" + raise RuntimeError( + f"Failed to generate a valid Python list after {input_data.max_retries} attempts. Last error: {str(e)}" + ) else: # Add a retry prompt logger.debug("Preparing retry prompt") diff --git a/autogpt_platform/backend/backend/blocks/medium.py b/autogpt_platform/backend/backend/blocks/medium.py index 9ca9b41bf4..04ebe8fab0 100644 --- a/autogpt_platform/backend/backend/blocks/medium.py +++ b/autogpt_platform/backend/backend/blocks/medium.py @@ -138,31 +138,25 @@ class PublishToMediumBlock(Block): return response.json() def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - response = self.create_post( - input_data.api_key.get_secret_value(), - input_data.author_id.get_secret_value(), - input_data.title, - input_data.content, - input_data.content_format, - input_data.tags, - input_data.canonical_url, - input_data.publish_status, - input_data.license, - input_data.notify_followers, + response = self.create_post( + input_data.api_key.get_secret_value(), + input_data.author_id.get_secret_value(), + input_data.title, + input_data.content, + input_data.content_format, + input_data.tags, + input_data.canonical_url, + input_data.publish_status, + input_data.license, + input_data.notify_followers, + ) + + if "data" in response: + yield "post_id", response["data"]["id"] + yield "post_url", response["data"]["url"] + yield "published_at", response["data"]["publishedAt"] + else: + error_message = response.get("errors", [{}])[0].get( + "message", "Unknown error occurred" ) - - if "data" in response: - yield "post_id", response["data"]["id"] - yield "post_url", response["data"]["url"] - yield "published_at", response["data"]["publishedAt"] - else: - error_message = response.get("errors", [{}])[0].get( - "message", "Unknown error occurred" - ) - yield "error", f"Failed to create Medium post: {error_message}" - - except requests.RequestException as e: - yield "error", f"Network error occurred while creating Medium post: {str(e)}" - except Exception as e: - yield "error", f"Error occurred while creating Medium post: {str(e)}" + raise RuntimeError(f"Failed to create Medium post: {error_message}") diff --git a/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py b/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py index 6795c3c587..38abc8da20 100644 --- a/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py +++ b/autogpt_platform/backend/backend/blocks/replicate_flux_advanced.py @@ -139,24 +139,21 @@ class ReplicateFluxAdvancedModelBlock(Block): if seed is None: seed = int.from_bytes(os.urandom(4), "big") - try: - # Run the model using the provided inputs - result = self.run_model( - api_key=input_data.api_key.get_secret_value(), - model_name=input_data.replicate_model_name.api_name, - prompt=input_data.prompt, - seed=seed, - steps=input_data.steps, - guidance=input_data.guidance, - interval=input_data.interval, - aspect_ratio=input_data.aspect_ratio, - output_format=input_data.output_format, - output_quality=input_data.output_quality, - safety_tolerance=input_data.safety_tolerance, - ) - yield "result", result - except Exception as e: - yield "error", str(e) + # Run the model using the provided inputs + result = self.run_model( + api_key=input_data.api_key.get_secret_value(), + model_name=input_data.replicate_model_name.api_name, + prompt=input_data.prompt, + seed=seed, + steps=input_data.steps, + guidance=input_data.guidance, + interval=input_data.interval, + aspect_ratio=input_data.aspect_ratio, + output_format=input_data.output_format, + output_quality=input_data.output_quality, + safety_tolerance=input_data.safety_tolerance, + ) + yield "result", result def run_model( self, diff --git a/autogpt_platform/backend/backend/blocks/search.py b/autogpt_platform/backend/backend/blocks/search.py index f8fc783e56..ecd63e2ee6 100644 --- a/autogpt_platform/backend/backend/blocks/search.py +++ b/autogpt_platform/backend/backend/blocks/search.py @@ -36,20 +36,12 @@ class GetWikipediaSummaryBlock(Block, GetRequest): ) def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - topic = input_data.topic - url = f"https://en.wikipedia.org/api/rest_v1/page/summary/{topic}" - response = self.get_request(url, json=True) - yield "summary", response["extract"] - - except requests.exceptions.HTTPError as http_err: - yield "error", f"HTTP error occurred: {http_err}" - - except requests.RequestException as e: - yield "error", f"Request to Wikipedia failed: {e}" - - except KeyError as e: - yield "error", f"Error parsing Wikipedia response: {e}" + topic = input_data.topic + url = f"https://en.wikipedia.org/api/rest_v1/page/summary/{topic}" + response = self.get_request(url, json=True) + if "extract" not in response: + raise RuntimeError(f"Unable to parse Wikipedia response: {response}") + yield "summary", response["extract"] class SearchTheWebBlock(Block, GetRequest): @@ -73,24 +65,17 @@ class SearchTheWebBlock(Block, GetRequest): ) def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - # Encode the search query - encoded_query = quote(input_data.query) + # Encode the search query + encoded_query = quote(input_data.query) - # Prepend the Jina Search URL to the encoded query - jina_search_url = f"https://s.jina.ai/{encoded_query}" + # Prepend the Jina Search URL to the encoded query + jina_search_url = f"https://s.jina.ai/{encoded_query}" - # Make the request to Jina Search - response = self.get_request(jina_search_url, json=False) + # Make the request to Jina Search + response = self.get_request(jina_search_url, json=False) - # Output the search results - yield "results", response - - except requests.exceptions.HTTPError as http_err: - yield "error", f"HTTP error occurred: {http_err}" - - except requests.RequestException as e: - yield "error", f"Request to Jina Search failed: {e}" + # Output the search results + yield "results", response class ExtractWebsiteContentBlock(Block, GetRequest): @@ -125,13 +110,8 @@ class ExtractWebsiteContentBlock(Block, GetRequest): else: url = f"https://r.jina.ai/{input_data.url}" - try: - content = self.get_request(url, json=False) - yield "content", content - except requests.exceptions.HTTPError as http_err: - yield "error", f"HTTP error occurred: {http_err}" - except requests.RequestException as e: - yield "error", f"Request to URL failed: {e}" + content = self.get_request(url, json=False) + yield "content", content class GetWeatherInformationBlock(Block, GetRequest): @@ -171,26 +151,15 @@ class GetWeatherInformationBlock(Block, GetRequest): ) def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - units = "metric" if input_data.use_celsius else "imperial" - api_key = input_data.api_key.get_secret_value() - location = input_data.location - url = f"http://api.openweathermap.org/data/2.5/weather?q={quote(location)}&appid={api_key}&units={units}" - weather_data = self.get_request(url, json=True) + units = "metric" if input_data.use_celsius else "imperial" + api_key = input_data.api_key.get_secret_value() + location = input_data.location + url = f"http://api.openweathermap.org/data/2.5/weather?q={quote(location)}&appid={api_key}&units={units}" + weather_data = self.get_request(url, json=True) - if "main" in weather_data and "weather" in weather_data: - yield "temperature", str(weather_data["main"]["temp"]) - yield "humidity", str(weather_data["main"]["humidity"]) - yield "condition", weather_data["weather"][0]["description"] - else: - yield "error", f"Expected keys not found in response: {weather_data}" - - except requests.exceptions.HTTPError as http_err: - if http_err.response.status_code == 403: - yield "error", "Request to weather API failed: 403 Forbidden. Check your API key and permissions." - else: - yield "error", f"HTTP error occurred: {http_err}" - except requests.RequestException as e: - yield "error", f"Request to weather API failed: {e}" - except KeyError as e: - yield "error", f"Error processing weather data: {e}" + if "main" in weather_data and "weather" in weather_data: + yield "temperature", str(weather_data["main"]["temp"]) + yield "humidity", str(weather_data["main"]["humidity"]) + yield "condition", weather_data["weather"][0]["description"] + else: + raise RuntimeError(f"Expected keys not found in response: {weather_data}") diff --git a/autogpt_platform/backend/backend/blocks/talking_head.py b/autogpt_platform/backend/backend/blocks/talking_head.py index e1851ae030..e93b69ed85 100644 --- a/autogpt_platform/backend/backend/blocks/talking_head.py +++ b/autogpt_platform/backend/backend/blocks/talking_head.py @@ -106,41 +106,40 @@ class CreateTalkingAvatarVideoBlock(Block): return response.json() def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - # Create the clip - payload = { - "script": { - "type": "text", - "subtitles": str(input_data.subtitles).lower(), - "provider": { - "type": input_data.provider, - "voice_id": input_data.voice_id, - }, - "ssml": str(input_data.ssml).lower(), - "input": input_data.script_input, + # Create the clip + payload = { + "script": { + "type": "text", + "subtitles": str(input_data.subtitles).lower(), + "provider": { + "type": input_data.provider, + "voice_id": input_data.voice_id, }, - "config": {"result_format": input_data.result_format}, - "presenter_config": {"crop": {"type": input_data.crop_type}}, - "presenter_id": input_data.presenter_id, - "driver_id": input_data.driver_id, - } + "ssml": str(input_data.ssml).lower(), + "input": input_data.script_input, + }, + "config": {"result_format": input_data.result_format}, + "presenter_config": {"crop": {"type": input_data.crop_type}}, + "presenter_id": input_data.presenter_id, + "driver_id": input_data.driver_id, + } - response = self.create_clip(input_data.api_key.get_secret_value(), payload) - clip_id = response["id"] + response = self.create_clip(input_data.api_key.get_secret_value(), payload) + clip_id = response["id"] - # Poll for clip status - for _ in range(input_data.max_polling_attempts): - status_response = self.get_clip_status( - input_data.api_key.get_secret_value(), clip_id + # Poll for clip status + for _ in range(input_data.max_polling_attempts): + status_response = self.get_clip_status( + input_data.api_key.get_secret_value(), clip_id + ) + if status_response["status"] == "done": + yield "video_url", status_response["result_url"] + return + elif status_response["status"] == "error": + raise RuntimeError( + f"Clip creation failed: {status_response.get('error', 'Unknown error')}" ) - if status_response["status"] == "done": - yield "video_url", status_response["result_url"] - return - elif status_response["status"] == "error": - yield "error", f"Clip creation failed: {status_response.get('error', 'Unknown error')}" - return - time.sleep(input_data.polling_interval) - yield "error", "Clip creation timed out" - except Exception as e: - yield "error", str(e) + time.sleep(input_data.polling_interval) + + raise TimeoutError("Clip creation timed out") diff --git a/autogpt_platform/backend/backend/blocks/text_to_speech_block.py b/autogpt_platform/backend/backend/blocks/text_to_speech_block.py index 5239142ee2..4141276340 100644 --- a/autogpt_platform/backend/backend/blocks/text_to_speech_block.py +++ b/autogpt_platform/backend/backend/blocks/text_to_speech_block.py @@ -68,12 +68,9 @@ class UnrealTextToSpeechBlock(Block): return response.json() def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - api_response = self.call_unreal_speech_api( - input_data.api_key.get_secret_value(), - input_data.text, - input_data.voice_id, - ) - yield "mp3_url", api_response["OutputUri"] - except Exception as e: - yield "error", str(e) + api_response = self.call_unreal_speech_api( + input_data.api_key.get_secret_value(), + input_data.text, + input_data.voice_id, + ) + yield "mp3_url", api_response["OutputUri"] diff --git a/autogpt_platform/backend/backend/blocks/youtube.py b/autogpt_platform/backend/backend/blocks/youtube.py index e299b121aa..cec50109bd 100644 --- a/autogpt_platform/backend/backend/blocks/youtube.py +++ b/autogpt_platform/backend/backend/blocks/youtube.py @@ -64,14 +64,11 @@ class TranscribeYouTubeVideoBlock(Block): return YouTubeTranscriptApi.get_transcript(video_id) def run(self, input_data: Input, **kwargs) -> BlockOutput: - try: - video_id = self.extract_video_id(input_data.youtube_url) - yield "video_id", video_id + video_id = self.extract_video_id(input_data.youtube_url) + yield "video_id", video_id - transcript = self.get_transcript(video_id) - formatter = TextFormatter() - transcript_text = formatter.format_transcript(transcript) + transcript = self.get_transcript(video_id) + formatter = TextFormatter() + transcript_text = formatter.format_transcript(transcript) - yield "transcript", transcript_text - except Exception as e: - yield "error", str(e) + yield "transcript", transcript_text diff --git a/autogpt_platform/backend/backend/data/block.py b/autogpt_platform/backend/backend/data/block.py index 554dfc237c..594fd10e76 100644 --- a/autogpt_platform/backend/backend/data/block.py +++ b/autogpt_platform/backend/backend/data/block.py @@ -272,8 +272,8 @@ class Block(ABC, Generic[BlockSchemaInputType, BlockSchemaOutputType]): for output_name, output_data in self.run( self.input_schema(**input_data), **kwargs ): - if "error" in output_name: - raise ValueError(output_data) + if output_name == "error": + raise RuntimeError(output_data) if error := self.output_schema.validate_field(output_name, output_data): raise ValueError(f"Block produced an invalid output data: {error}") yield output_name, output_data diff --git a/docs/content/server/new_blocks.md b/docs/content/server/new_blocks.md index a3085f1a7e..a56675810b 100644 --- a/docs/content/server/new_blocks.md +++ b/docs/content/server/new_blocks.md @@ -44,7 +44,7 @@ Follow these steps to create and test a new block: class Output(BlockSchema): summary: str # The summary of the topic from Wikipedia - error: str # Any error message if the request fails + error: str # Any error message if the request fails, error field needs to be named `error`. ``` 4. **Implement the `__init__` method, including test data and mocks:** @@ -95,17 +95,13 @@ Follow these steps to create and test a new block: yield "summary", response['extract'] except requests.exceptions.HTTPError as http_err: - yield "error", f"HTTP error occurred: {http_err}" - except requests.RequestException as e: - yield "error", f"Request to Wikipedia failed: {e}" - except KeyError as e: - yield "error", f"Error parsing Wikipedia response: {e}" + raise RuntimeError(f"HTTP error occurred: {http_err}") ``` - **Try block**: Contains the main logic to fetch and process the Wikipedia summary. - **API request**: Send a GET request to the Wikipedia API. - - **Error handling**: Handle various exceptions that might occur during the API request and data processing. - - **Yield**: Use `yield` to output the results. Prefer to output one result object at a time. If you are calling a function that returns a list, you can yield each item in the list separately. You can also yield the whole list as well, but do both rather than yielding the list. For example: If you were writing a block that outputs emails, you'd yield each email as a separate result object, but you could also yield the whole list as an additional single result object. + - **Error handling**: Handle various exceptions that might occur during the API request and data processing. We don't need to catch all exceptions, only the ones we expect and can handle. The uncaught exceptions will be automatically yielded as `error` in the output. Any block that raises an exception (or yields an `error` output) will be marked as failed. Prefer raising exceptions over yielding `error`, as it will stop the execution immediately. + - **Yield**: Use `yield` to output the results. Prefer to output one result object at a time. If you are calling a function that returns a list, you can yield each item in the list separately. You can also yield the whole list as well, but do both rather than yielding the list. For example: If you were writing a block that outputs emails, you'd yield each email as a separate result object, but you could also yield the whole list as an additional single result object. Yielding output named `error` will break the execution right away and mark the block execution as failed. ### Blocks with authentication From d8145c158ce5bb0a8c53e19bd5b2b7fc22220537 Mon Sep 17 00:00:00 2001 From: Swifty Date: Thu, 10 Oct 2024 18:35:05 +0200 Subject: [PATCH 067/155] tool(platform): Add storybooks to aid UI development (#8274) * storybook init * alert stories * Avatar stories * badge stories * button stories * calander stories * stories default * card stories * checkbox stories * formatting * added tailwind config * add collapsible story * added command story * rename use-toast.ts to tsx * added more stories * fix linting issues * added stories for input * added stories for label * Added tests to button story * added multiselect stories * added popover stories * added render stories * scroll area stories * more stories * Added rest of the stories for the default components * fmt * add test runner * added ci * fix tests * fixing ci * remove storybook from ci * removed styling * added new line --- autogpt_platform/frontend/.eslintrc.json | 2 +- autogpt_platform/frontend/.gitignore | 3 + autogpt_platform/frontend/.storybook/main.ts | 18 + .../frontend/.storybook/preview.ts | 15 + autogpt_platform/frontend/README.md | 47 ++ autogpt_platform/frontend/package.json | 19 +- .../src/components/ui/alert.stories.tsx | 90 ++++ .../src/components/ui/avatar.stories.tsx | 60 +++ .../src/components/ui/badge.stories.tsx | 59 +++ .../src/components/ui/button.stories.tsx | 219 +++++++++ .../src/components/ui/calendar.stories.tsx | 70 +++ .../src/components/ui/card.stories.tsx | 100 ++++ .../src/components/ui/checkbox.stories.tsx | 73 +++ .../src/components/ui/collapsible.stories.tsx | 84 ++++ .../src/components/ui/command.stories.tsx | 98 ++++ .../src/components/ui/data-table.stories.tsx | 72 +++ .../src/components/ui/dialog.stories.tsx | 102 ++++ .../components/ui/dropdown-menu.stories.tsx | 102 ++++ .../src/components/ui/form.stories.tsx | 169 +++++++ .../src/components/ui/icons.stories.tsx | 95 ++++ .../src/components/ui/input.stories.tsx | 70 +++ .../src/components/ui/label.stories.tsx | 49 ++ .../src/components/ui/multiselect.stories.tsx | 103 ++++ .../src/components/ui/popover.stories.tsx | 102 ++++ .../src/components/ui/render.stories.tsx | 70 +++ .../src/components/ui/scroll-area.stories.tsx | 126 +++++ .../src/components/ui/select.stories.tsx | 96 ++++ .../src/components/ui/separator.stories.tsx | 91 ++++ .../src/components/ui/sheet.stories.tsx | 83 ++++ .../src/components/ui/switch.stories.tsx | 55 +++ .../src/components/ui/table.stories.tsx | 113 +++++ .../src/components/ui/textarea.stories.tsx | 59 +++ .../src/components/ui/toast.stories.tsx | 100 ++++ .../src/components/ui/toaster.stories.tsx | 125 +++++ .../src/components/ui/tooltip.stories.tsx | 99 ++++ .../src/components/ui/use-toast.stories.tsx | 111 +++++ .../ui/{use-toast.ts => use-toast.tsx} | 0 .../frontend/src/stories/Button.stories.ts | 60 +++ .../frontend/src/stories/Button.tsx | 45 ++ .../frontend/src/stories/Configure.mdx | 451 ++++++++++++++++++ .../frontend/src/stories/Header.stories.ts | 33 ++ .../frontend/src/stories/Header.tsx | 71 +++ .../frontend/src/stories/Page.stories.ts | 32 ++ .../frontend/src/stories/Page.tsx | 91 ++++ .../src/stories/assets/accessibility.png | Bin 0 -> 42336 bytes .../src/stories/assets/accessibility.svg | 1 + .../src/stories/assets/addon-library.png | Bin 0 -> 467366 bytes .../frontend/src/stories/assets/assets.png | Bin 0 -> 3899 bytes .../src/stories/assets/avif-test-image.avif | Bin 0 -> 829 bytes .../frontend/src/stories/assets/context.png | Bin 0 -> 6119 bytes .../frontend/src/stories/assets/discord.svg | 1 + .../frontend/src/stories/assets/docs.png | Bin 0 -> 27875 bytes .../src/stories/assets/figma-plugin.png | Bin 0 -> 44246 bytes .../frontend/src/stories/assets/github.svg | 1 + .../frontend/src/stories/assets/share.png | Bin 0 -> 40767 bytes .../frontend/src/stories/assets/styling.png | Bin 0 -> 7237 bytes .../frontend/src/stories/assets/testing.png | Bin 0 -> 49313 bytes .../frontend/src/stories/assets/theming.png | Bin 0 -> 44374 bytes .../frontend/src/stories/assets/tutorials.svg | 1 + .../frontend/src/stories/assets/youtube.svg | 1 + .../frontend/src/stories/button.css | 30 ++ .../frontend/src/stories/header.css | 32 ++ .../frontend/src/stories/page.css | 69 +++ .../frontend/test-runner-jest.config.js | 16 + autogpt_platform/frontend/tsconfig.json | 8 +- 65 files changed, 3889 insertions(+), 3 deletions(-) create mode 100644 autogpt_platform/frontend/.storybook/main.ts create mode 100644 autogpt_platform/frontend/.storybook/preview.ts create mode 100644 autogpt_platform/frontend/src/components/ui/alert.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/avatar.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/badge.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/button.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/calendar.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/card.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/checkbox.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/collapsible.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/command.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/data-table.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/dialog.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/dropdown-menu.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/form.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/icons.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/input.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/label.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/multiselect.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/popover.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/render.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/scroll-area.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/select.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/separator.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/sheet.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/switch.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/table.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/textarea.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/toast.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/toaster.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/tooltip.stories.tsx create mode 100644 autogpt_platform/frontend/src/components/ui/use-toast.stories.tsx rename autogpt_platform/frontend/src/components/ui/{use-toast.ts => use-toast.tsx} (100%) create mode 100644 autogpt_platform/frontend/src/stories/Button.stories.ts create mode 100644 autogpt_platform/frontend/src/stories/Button.tsx create mode 100644 autogpt_platform/frontend/src/stories/Configure.mdx create mode 100644 autogpt_platform/frontend/src/stories/Header.stories.ts create mode 100644 autogpt_platform/frontend/src/stories/Header.tsx create mode 100644 autogpt_platform/frontend/src/stories/Page.stories.ts create mode 100644 autogpt_platform/frontend/src/stories/Page.tsx create mode 100644 autogpt_platform/frontend/src/stories/assets/accessibility.png create mode 100644 autogpt_platform/frontend/src/stories/assets/accessibility.svg create mode 100644 autogpt_platform/frontend/src/stories/assets/addon-library.png create mode 100644 autogpt_platform/frontend/src/stories/assets/assets.png create mode 100644 autogpt_platform/frontend/src/stories/assets/avif-test-image.avif create mode 100644 autogpt_platform/frontend/src/stories/assets/context.png create mode 100644 autogpt_platform/frontend/src/stories/assets/discord.svg create mode 100644 autogpt_platform/frontend/src/stories/assets/docs.png create mode 100644 autogpt_platform/frontend/src/stories/assets/figma-plugin.png create mode 100644 autogpt_platform/frontend/src/stories/assets/github.svg create mode 100644 autogpt_platform/frontend/src/stories/assets/share.png create mode 100644 autogpt_platform/frontend/src/stories/assets/styling.png create mode 100644 autogpt_platform/frontend/src/stories/assets/testing.png create mode 100644 autogpt_platform/frontend/src/stories/assets/theming.png create mode 100644 autogpt_platform/frontend/src/stories/assets/tutorials.svg create mode 100644 autogpt_platform/frontend/src/stories/assets/youtube.svg create mode 100644 autogpt_platform/frontend/src/stories/button.css create mode 100644 autogpt_platform/frontend/src/stories/header.css create mode 100644 autogpt_platform/frontend/src/stories/page.css create mode 100644 autogpt_platform/frontend/test-runner-jest.config.js diff --git a/autogpt_platform/frontend/.eslintrc.json b/autogpt_platform/frontend/.eslintrc.json index bffb357a71..bb8b1c099d 100644 --- a/autogpt_platform/frontend/.eslintrc.json +++ b/autogpt_platform/frontend/.eslintrc.json @@ -1,3 +1,3 @@ { - "extends": "next/core-web-vitals" + "extends": ["next/core-web-vitals", "plugin:storybook/recommended"] } diff --git a/autogpt_platform/frontend/.gitignore b/autogpt_platform/frontend/.gitignore index cfe0cde0bb..2611438bd9 100644 --- a/autogpt_platform/frontend/.gitignore +++ b/autogpt_platform/frontend/.gitignore @@ -42,3 +42,6 @@ node_modules/ /playwright-report/ /blob-report/ /playwright/.cache/ + +*storybook.log +storybook-static diff --git a/autogpt_platform/frontend/.storybook/main.ts b/autogpt_platform/frontend/.storybook/main.ts new file mode 100644 index 0000000000..d6f94d7958 --- /dev/null +++ b/autogpt_platform/frontend/.storybook/main.ts @@ -0,0 +1,18 @@ +import type { StorybookConfig } from "@storybook/nextjs"; + +const config: StorybookConfig = { + stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], + addons: [ + "@storybook/addon-onboarding", + "@storybook/addon-links", + "@storybook/addon-essentials", + "@chromatic-com/storybook", + "@storybook/addon-interactions", + ], + framework: { + name: "@storybook/nextjs", + options: {}, + }, + staticDirs: ["../public"], +}; +export default config; diff --git a/autogpt_platform/frontend/.storybook/preview.ts b/autogpt_platform/frontend/.storybook/preview.ts new file mode 100644 index 0000000000..2c5c6ea845 --- /dev/null +++ b/autogpt_platform/frontend/.storybook/preview.ts @@ -0,0 +1,15 @@ +import type { Preview } from "@storybook/react"; +import "../src/app/globals.css"; + +const preview: Preview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + }, +}; + +export default preview; diff --git a/autogpt_platform/frontend/README.md b/autogpt_platform/frontend/README.md index c7fe91a26a..a89d28f406 100644 --- a/autogpt_platform/frontend/README.md +++ b/autogpt_platform/frontend/README.md @@ -39,3 +39,50 @@ This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-opti ## Deploy TODO + +## Storybook + +Storybook is a powerful development environment for UI components. It allows you to build UI components in isolation, making it easier to develop, test, and document your components independently from your main application. + +### Purpose in the Development Process + +1. **Component Development**: Develop and test UI components in isolation. +2. **Visual Testing**: Easily spot visual regressions. +3. **Documentation**: Automatically document components and their props. +4. **Collaboration**: Share components with your team or stakeholders for feedback. + +### How to Use Storybook + +1. **Start Storybook**: + Run the following command to start the Storybook development server: + + ```bash + npm run storybook + ``` + + This will start Storybook on port 6006. Open [http://localhost:6006](http://localhost:6006) in your browser to view your component library. + +2. **Build Storybook**: + To build a static version of Storybook for deployment, use: + + ```bash + npm run build-storybook + ``` + +3. **Running Storybook Tests**: + Storybook tests can be run using: + + ```bash + npm run test-storybook + ``` + + For CI environments, use: + + ```bash + npm run test-storybook:ci + ``` + +4. **Writing Stories**: + Create `.stories.tsx` files alongside your components to define different states and variations of your components. + +By integrating Storybook into our development workflow, we can streamline UI development, improve component reusability, and maintain a consistent design system across the project. diff --git a/autogpt_platform/frontend/package.json b/autogpt_platform/frontend/package.json index ab1aaf2f67..c602606313 100644 --- a/autogpt_platform/frontend/package.json +++ b/autogpt_platform/frontend/package.json @@ -12,7 +12,11 @@ "format": "prettier --write .", "test": "playwright test", "test-ui": "playwright test --ui", - "gentests": "playwright codegen http://localhost:3000" + "gentests": "playwright codegen http://localhost:3000", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build", + "test-storybook": "test-storybook", + "test-storybook:ci": "concurrently -k -s first -n \"SB,TEST\" -c \"magenta,blue\" \"npm run build-storybook -- --quiet && npx http-server storybook-static --port 6006 --silent\" \"wait-on tcp:6006 && npm run test-storybook\"" }, "browserslist": [ "defaults" @@ -65,16 +69,29 @@ "zod": "^3.23.8" }, "devDependencies": { + "@chromatic-com/storybook": "^1.9.0", "@playwright/test": "^1.47.1", + "@storybook/addon-essentials": "^8.3.5", + "@storybook/addon-interactions": "^8.3.5", + "@storybook/addon-links": "^8.3.5", + "@storybook/addon-onboarding": "^8.3.5", + "@storybook/blocks": "^8.3.5", + "@storybook/nextjs": "^8.3.5", + "@storybook/react": "^8.3.5", + "@storybook/test": "^8.3.5", + "@storybook/test-runner": "^0.19.1", "@types/node": "^22.7.3", "@types/react": "^18", "@types/react-dom": "^18", "@types/react-modal": "^3.16.3", + "concurrently": "^9.0.1", "eslint": "^8", "eslint-config-next": "14.2.4", + "eslint-plugin-storybook": "^0.9.0", "postcss": "^8", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.6", + "storybook": "^8.3.5", "tailwindcss": "^3.4.1", "typescript": "^5" } diff --git a/autogpt_platform/frontend/src/components/ui/alert.stories.tsx b/autogpt_platform/frontend/src/components/ui/alert.stories.tsx new file mode 100644 index 0000000000..178f103192 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/alert.stories.tsx @@ -0,0 +1,90 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { Alert, AlertTitle, AlertDescription } from "./alert"; + +const meta = { + title: "UI/Alert", + component: Alert, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + variant: { + control: "select", + options: ["default", "destructive"], + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + children: ( + <> + Default Alert + + This is a default alert description. + + + ), + }, +}; + +export const Destructive: Story = { + args: { + variant: "destructive", + children: ( + <> + Destructive Alert + + This is a destructive alert description. + + + ), + }, +}; + +export const WithIcon: Story = { + args: { + children: ( + <> + + + + + + Alert with Icon + This alert includes an icon. + + ), + }, +}; + +export const TitleOnly: Story = { + args: { + children: Alert with Title Only, + }, +}; + +export const DescriptionOnly: Story = { + args: { + children: ( + + This is an alert with only a description. + + ), + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/avatar.stories.tsx b/autogpt_platform/frontend/src/components/ui/avatar.stories.tsx new file mode 100644 index 0000000000..b03eaba988 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/avatar.stories.tsx @@ -0,0 +1,60 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { Avatar, AvatarImage, AvatarFallback } from "./avatar"; + +const meta = { + title: "UI/Avatar", + component: Avatar, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + // Add any specific controls for Avatar props here if needed + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + children: , + }, +}; + +export const WithFallback: Story = { + args: { + children: ( + <> + + CN + + ), + }, +}; + +export const FallbackOnly: Story = { + args: { + children: JD, + }, +}; + +export const CustomSize: Story = { + args: { + className: "h-16 w-16", + children: , + }, +}; + +export const CustomContent: Story = { + args: { + children: ( + + + 🚀 + + + ), + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/badge.stories.tsx b/autogpt_platform/frontend/src/components/ui/badge.stories.tsx new file mode 100644 index 0000000000..f43e015011 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/badge.stories.tsx @@ -0,0 +1,59 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { Badge } from "./badge"; + +const meta = { + title: "UI/Badge", + component: Badge, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + variant: { + control: "select", + options: ["default", "secondary", "destructive", "outline"], + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + children: "Badge", + }, +}; + +export const Secondary: Story = { + args: { + variant: "secondary", + children: "Secondary", + }, +}; + +export const Destructive: Story = { + args: { + variant: "destructive", + children: "Destructive", + }, +}; + +export const Outline: Story = { + args: { + variant: "outline", + children: "Outline", + }, +}; + +export const CustomContent: Story = { + args: { + children: ( + <> + 🚀 + Custom Content + + ), + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/button.stories.tsx b/autogpt_platform/frontend/src/components/ui/button.stories.tsx new file mode 100644 index 0000000000..f19d44a5d8 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/button.stories.tsx @@ -0,0 +1,219 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import { Button } from "./button"; +import { userEvent, within, expect } from "@storybook/test"; + +const meta = { + title: "UI/Button", + component: Button, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + variant: { + control: "select", + options: [ + "default", + "destructive", + "outline", + "secondary", + "ghost", + "link", + ], + }, + size: { + control: "select", + options: ["default", "sm", "lg", "primary", "icon"], + }, + disabled: { + control: "boolean", + }, + asChild: { + control: "boolean", + }, + children: { + control: "text", + }, + onClick: { action: "clicked" }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + children: "Button", + }, +}; + +export const Interactive: Story = { + args: { + children: "Interactive Button", + }, + argTypes: { + onClick: { action: "clicked" }, + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const button = canvas.getByRole("button", { name: /Interactive Button/i }); + await userEvent.click(button); + await expect(button).toHaveFocus(); + }, +}; + +export const Variants: Story = { + render: (args) => ( +
+ + + + + + +
+ ), + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const buttons = canvas.getAllByRole("button"); + expect(buttons).toHaveLength(6); + for (const button of buttons) { + await userEvent.hover(button); + await expect(button).toHaveAttribute( + "class", + expect.stringContaining("hover:"), + ); + } + }, +}; + +export const Sizes: Story = { + render: (args) => ( +
+ + + + + +
+ ), + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const buttons = canvas.getAllByRole("button"); + expect(buttons).toHaveLength(5); + const sizes = ["sm", "default", "lg", "primary", "icon"]; + const sizeClasses = [ + "h-8 rounded-md px-3 text-xs", + "h-9 px-4 py-2", + "h-10 rounded-md px-8", + "md:h-14 md:w-44 rounded-2xl h-10 w-28", + "h-9 w-9", + ]; + buttons.forEach((button, index) => { + expect(button).toHaveAttribute( + "class", + expect.stringContaining(sizeClasses[index]), + ); + }); + }, +}; + +export const Disabled: Story = { + args: { + children: "Disabled Button", + disabled: true, + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const button = canvas.getByRole("button", { name: /Disabled Button/i }); + await expect(button).toBeDisabled(); + await expect(button).toHaveStyle("pointer-events: none"); + await expect(button).not.toHaveFocus(); + }, +}; + +export const WithIcon: Story = { + args: { + children: ( + <> + + + + Button with Icon + + ), + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const button = canvas.getByRole("button", { name: /Button with Icon/i }); + const icon = button.querySelector("svg"); + await expect(icon).toBeInTheDocument(); + await expect(button).toHaveTextContent("Button with Icon"); + }, +}; + +export const LoadingState: Story = { + args: { + children: "Loading...", + disabled: true, + }, + render: (args) => ( + + ), + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const button = canvas.getByRole("button", { name: /Loading.../i }); + expect(button).toBeDisabled(); + const spinner = button.querySelector("svg"); + await expect(spinner).toHaveClass("animate-spin"); + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/calendar.stories.tsx b/autogpt_platform/frontend/src/components/ui/calendar.stories.tsx new file mode 100644 index 0000000000..2414a7448a --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/calendar.stories.tsx @@ -0,0 +1,70 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { Calendar } from "./calendar"; + +const meta = { + title: "UI/Calendar", + component: Calendar, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + mode: { + control: "select", + options: ["single", "multiple", "range"], + }, + selected: { + control: "date", + }, + showOutsideDays: { + control: "boolean", + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: {}, +}; + +export const SingleSelection: Story = { + args: { + mode: "single", + selected: new Date(), + }, +}; + +export const MultipleSelection: Story = { + args: { + mode: "multiple", + selected: [ + new Date(), + new Date(new Date().setDate(new Date().getDate() + 5)), + ], + }, +}; + +export const RangeSelection: Story = { + args: { + mode: "range", + selected: { + from: new Date(), + to: new Date(new Date().setDate(new Date().getDate() + 7)), + }, + }, +}; + +export const HideOutsideDays: Story = { + args: { + showOutsideDays: false, + }, +}; + +export const CustomClassName: Story = { + args: { + className: "border rounded-lg shadow-lg", + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/card.stories.tsx b/autogpt_platform/frontend/src/components/ui/card.stories.tsx new file mode 100644 index 0000000000..cc804aad5c --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/card.stories.tsx @@ -0,0 +1,100 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { + Card, + CardHeader, + CardFooter, + CardTitle, + CardDescription, + CardContent, +} from "./card"; + +const meta = { + title: "UI/Card", + component: Card, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + // Add any specific controls for Card props here if needed + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + children: ( + <> + + Card Title + Card Description + + +

Card Content

+
+ +

Card Footer

+
+ + ), + }, +}; + +export const HeaderOnly: Story = { + args: { + children: ( + + Header Only Card + This card has only a header. + + ), + }, +}; + +export const ContentOnly: Story = { + args: { + children: ( + +

This card has only content.

+
+ ), + }, +}; + +export const FooterOnly: Story = { + args: { + children: ( + +

This card has only a footer.

+
+ ), + }, +}; + +export const CustomContent: Story = { + args: { + children: ( + <> + + Custom Content + + +
+ + 🚀 + +
+
+ + +

Footer text

+
+ + ), + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/checkbox.stories.tsx b/autogpt_platform/frontend/src/components/ui/checkbox.stories.tsx new file mode 100644 index 0000000000..3310c3f4c9 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/checkbox.stories.tsx @@ -0,0 +1,73 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { Checkbox } from "./checkbox"; + +const meta = { + title: "UI/Checkbox", + component: Checkbox, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + checked: { + control: "boolean", + }, + disabled: { + control: "boolean", + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: {}, +}; + +export const Checked: Story = { + args: { + checked: true, + }, +}; + +export const Unchecked: Story = { + args: { + checked: false, + }, +}; + +export const Disabled: Story = { + args: { + disabled: true, + }, +}; + +export const DisabledChecked: Story = { + args: { + disabled: true, + checked: true, + }, +}; + +export const WithLabel: Story = { + args: {}, + render: (args) => ( +
+ + +
+ ), +}; + +export const CustomSize: Story = { + args: { + className: "h-6 w-6", + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/collapsible.stories.tsx b/autogpt_platform/frontend/src/components/ui/collapsible.stories.tsx new file mode 100644 index 0000000000..dbd22d10c2 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/collapsible.stories.tsx @@ -0,0 +1,84 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import { + Collapsible, + CollapsibleTrigger, + CollapsibleContent, +} from "./collapsible"; +import { Button } from "./button"; + +const meta = { + title: "UI/Collapsible", + component: Collapsible, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( + + + + + +

This is the collapsible content.

+
+
+ ), +}; + +export const OpenByDefault: Story = { + render: () => ( + + + + + +

This collapsible is open by default.

+
+
+ ), +}; + +export const CustomTrigger: Story = { + render: () => ( + + + + + +

Custom trigger example.

+
+
+ ), +}; + +export const NestedContent: Story = { + render: () => ( + + + + + +

Main Content

+

This is the main collapsible content.

+ + + + + +

This is nested collapsible content.

+
+
+
+
+ ), +}; diff --git a/autogpt_platform/frontend/src/components/ui/command.stories.tsx b/autogpt_platform/frontend/src/components/ui/command.stories.tsx new file mode 100644 index 0000000000..2d0aec23e3 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/command.stories.tsx @@ -0,0 +1,98 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { + Command, + CommandDialog, + CommandInput, + CommandList, + CommandEmpty, + CommandGroup, + CommandItem, + CommandShortcut, +} from "./command"; + +const meta = { + title: "UI/Command", + component: Command, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( + + + + No results found. + + + Calendar + + + Search Emoji + + + Calculator + + + + + Profile + ⌘P + + + Billing + ⌘B + + + Settings + ⌘S + + + + + ), +}; + +export const WithDialog: Story = { + render: () => ( + + + + No results found. + + Calendar + Search Emoji + Calculator + + + + ), +}; + +export const CustomContent: Story = { + render: () => ( + + + + No fruits found. + + + 🍎 Apple + + + 🍌 Banana + + + 🍊 Orange + + + + + ), +}; diff --git a/autogpt_platform/frontend/src/components/ui/data-table.stories.tsx b/autogpt_platform/frontend/src/components/ui/data-table.stories.tsx new file mode 100644 index 0000000000..7fb34630aa --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/data-table.stories.tsx @@ -0,0 +1,72 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import { DataTable } from "./data-table"; +import { Button } from "./button"; + +const meta = { + title: "UI/DataTable", + component: DataTable, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const sampleData = [ + { id: 1, name: "John Doe", age: 30, city: "New York" }, + { id: 2, name: "Jane Smith", age: 25, city: "Los Angeles" }, + { id: 3, name: "Bob Johnson", age: 35, city: "Chicago" }, +]; + +const sampleColumns = [ + { accessorKey: "name", header: "Name" }, + { accessorKey: "age", header: "Age" }, + { accessorKey: "city", header: "City" }, +]; + +export const Default: Story = { + args: { + columns: sampleColumns, + data: sampleData, + filterPlaceholder: "Filter by name...", + filterColumn: "name", + }, +}; + +export const WithGlobalActions: Story = { + args: { + ...Default.args, + globalActions: [ + { + component: , + action: async (rows) => { + console.log("Deleting:", rows); + }, + }, + ], + }, +}; + +export const NoResults: Story = { + args: { + ...Default.args, + data: [], + }, +}; + +export const CustomFilterPlaceholder: Story = { + args: { + ...Default.args, + filterPlaceholder: "Search for a user...", + }, +}; + +export const WithoutFilter: Story = { + args: { + columns: sampleColumns, + data: sampleData, + filterPlaceholder: "", + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/dialog.stories.tsx b/autogpt_platform/frontend/src/components/ui/dialog.stories.tsx new file mode 100644 index 0000000000..dcbfe943e2 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/dialog.stories.tsx @@ -0,0 +1,102 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import { Button } from "./button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "./dialog"; + +const meta = { + title: "UI/Dialog", + component: Dialog, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( + + + + + + + Are you sure? + + This action cannot be undone. This will permanently delete your + account and remove your data from our servers. + + + + + + + + ), +}; + +export const WithForm: Story = { + render: () => ( + + + + + + + Edit profile + + Make changes to your profile here. Click save when you're done. + + +
+
+ + +
+
+ + +
+
+ + + +
+
+ ), +}; + +export const CustomContent: Story = { + render: () => ( + + + + + + + Custom Content + +
+ 🎉 +

This is a custom dialog content!

+
+ + + +
+
+ ), +}; diff --git a/autogpt_platform/frontend/src/components/ui/dropdown-menu.stories.tsx b/autogpt_platform/frontend/src/components/ui/dropdown-menu.stories.tsx new file mode 100644 index 0000000000..71130935aa --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/dropdown-menu.stories.tsx @@ -0,0 +1,102 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import { Button } from "./button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "./dropdown-menu"; + +const meta = { + title: "UI/DropdownMenu", + component: DropdownMenu, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( + + + + + + My Account + + Profile + Billing + Team + Subscription + + + ), +}; + +export const WithDisabledItem: Story = { + render: () => ( + + + + + + Profile + Billing + Team (disabled) + Subscription + + + ), +}; + +export const WithIcons: Story = { + render: () => ( + + + + + + + 👤 Profile + + + 💳 Billing + + + 👥 Team + + + 📅 Subscription + + + + ), +}; + +export const NestedDropdowns: Story = { + render: () => ( + + + + + + Profile + Billing + + Team + + Add Member + Remove Member + + + Subscription + + + ), +}; diff --git a/autogpt_platform/frontend/src/components/ui/form.stories.tsx b/autogpt_platform/frontend/src/components/ui/form.stories.tsx new file mode 100644 index 0000000000..e10797b825 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/form.stories.tsx @@ -0,0 +1,169 @@ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; + +import { + Form, + FormField, + FormItem, + FormLabel, + FormControl, + FormDescription, + FormMessage, +} from "./form"; +import { Input } from "./input"; +import { Button } from "./button"; + +const formSchema = z.object({ + username: z.string().min(2, { + message: "Username must be at least 2 characters.", + }), +}); + +const meta = { + title: "UI/Form", + component: Form, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const FormExample = () => { + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + username: "", + }, + }); + + function onSubmit(values: z.infer) { + console.log(values); + } + + return ( +
+ + ( + + Username + + + + + This is your public display name. + + + + )} + /> + + + + ); +}; + +export const Default: Story = { + render: () => , +}; + +export const WithError: Story = { + render: () => { + const FormWithError = () => { + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + username: "", + }, + }); + + React.useEffect(() => { + form.setError("username", { + type: "manual", + message: "This username is already taken.", + }); + }, [form]); + + function onSubmit(values: z.infer) { + console.log(values); + } + + return ( +
+ + ( + + Username + + + + + This is your public display name. + + + + )} + /> + + + + ); + }; + + return ; + }, +}; + +export const WithDefaultValue: Story = { + render: () => { + const FormWithDefaultValue = () => { + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + username: "johndoe", + }, + }); + + function onSubmit(values: z.infer) { + console.log(values); + } + + return ( +
+ + ( + + Username + + + + + This is your public display name. + + + + )} + /> + + + + ); + }; + + return ; + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/icons.stories.tsx b/autogpt_platform/frontend/src/components/ui/icons.stories.tsx new file mode 100644 index 0000000000..cadc91bdb7 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/icons.stories.tsx @@ -0,0 +1,95 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import { + IconUser, + IconUserPlus, + IconKey, + IconKeyPlus, + IconWorkFlow, + IconPlay, + IconSquare, + IconSquareActivity, + IconRefresh, + IconSave, + IconUndo2, + IconRedo2, + IconToyBrick, + IconCircleAlert, + IconCircleUser, + IconPackage2, + IconMegaphone, + IconMenu, + IconCoin, +} from "./icons"; + +const meta = { + title: "UI/Icons", + component: IconUser, // Add a component property + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + size: { + control: "select", + options: ["default", "sm", "lg"], + }, + className: { control: "text" }, + }, +} satisfies Meta; // Specify the type parameter + +export default meta; +type Story = StoryObj; + +const IconWrapper = ({ children }: { children: React.ReactNode }) => ( +
{children}
+); + +export const AllIcons: Story = { + render: (args) => ( + + + + + + + + + + + + + + + + + + + + + + ), +}; + +export const DefaultSize: Story = { + args: { + size: "default", + }, +}; + +export const SmallSize: Story = { + args: { + size: "sm", + }, +}; + +export const LargeSize: Story = { + args: { + size: "lg", + }, +}; + +export const CustomColor: Story = { + args: { + className: "text-blue-500", + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/input.stories.tsx b/autogpt_platform/frontend/src/components/ui/input.stories.tsx new file mode 100644 index 0000000000..fdfc589282 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/input.stories.tsx @@ -0,0 +1,70 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { Input } from "./input"; + +const meta = { + title: "UI/Input", + component: Input, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + type: { + control: "select", + options: ["text", "password", "email", "number", "file"], + }, + placeholder: { control: "text" }, + disabled: { control: "boolean" }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + placeholder: "Enter text...", + }, +}; + +export const Password: Story = { + args: { + type: "password", + placeholder: "Enter password...", + }, +}; + +export const Email: Story = { + args: { + type: "email", + placeholder: "Enter email...", + }, +}; + +export const Number: Story = { + args: { + type: "number", + placeholder: "Enter number...", + }, +}; + +export const File: Story = { + args: { + type: "file", + }, +}; + +export const Disabled: Story = { + args: { + placeholder: "Disabled input", + disabled: true, + }, +}; + +export const WithCustomClassName: Story = { + args: { + placeholder: "Custom class", + className: "border-2 border-blue-500", + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/label.stories.tsx b/autogpt_platform/frontend/src/components/ui/label.stories.tsx new file mode 100644 index 0000000000..2d18f60dcb --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/label.stories.tsx @@ -0,0 +1,49 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { Label } from "./label"; + +const meta = { + title: "UI/Label", + component: Label, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + htmlFor: { control: "text" }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + children: "Default Label", + }, +}; + +export const WithHtmlFor: Story = { + args: { + htmlFor: "example-input", + children: "Label with htmlFor", + }, +}; + +export const CustomContent: Story = { + args: { + children: ( + <> + 📝 + Custom Label Content + + ), + }, +}; + +export const WithClassName: Story = { + args: { + className: "text-blue-500 font-bold", + children: "Styled Label", + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/multiselect.stories.tsx b/autogpt_platform/frontend/src/components/ui/multiselect.stories.tsx new file mode 100644 index 0000000000..2fe16feef1 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/multiselect.stories.tsx @@ -0,0 +1,103 @@ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; + +import { + MultiSelector, + MultiSelectorTrigger, + MultiSelectorInput, + MultiSelectorContent, + MultiSelectorList, + MultiSelectorItem, +} from "./multiselect"; + +const meta = { + title: "UI/MultiSelector", + component: MultiSelector, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + loop: { + control: "boolean", + }, + values: { + control: "object", + }, + onValuesChange: { action: "onValuesChange" }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const MultiSelectorExample = (args: any) => { + const [values, setValues] = React.useState(args.values || []); + + return ( + + + + + + + Apple + Banana + Cherry + Date + Elderberry + + + + ); +}; + +export const Default: Story = { + render: (args) => , + args: { + values: [], + onValuesChange: (value: string[]) => {}, + }, +}; + +export const WithLoop: Story = { + render: (args) => , + args: { + values: [], + onValuesChange: (value: string[]) => {}, + loop: true, + }, +}; + +export const WithInitialValues: Story = { + render: (args) => , + args: { + values: ["apple", "banana"], + onValuesChange: (value: string[]) => {}, + }, +}; + +export const WithDisabledItem: Story = { + render: (args) => ( + + + + + + + Apple + Banana + + Cherry (Disabled) + + Date + Elderberry + + + + ), + args: { + values: [], + onValuesChange: (value: string[]) => {}, + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/popover.stories.tsx b/autogpt_platform/frontend/src/components/ui/popover.stories.tsx new file mode 100644 index 0000000000..901e551493 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/popover.stories.tsx @@ -0,0 +1,102 @@ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; + +import { Popover, PopoverTrigger, PopoverContent } from "./popover"; +import { Button } from "./button"; + +const meta = { + title: "UI/Popover", + component: Popover, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const PopoverExample = (args: any) => ( + + + + + +
+

Popover Content

+

This is the content of the popover.

+
+
+
+); + +export const Default: Story = { + render: () => , +}; + +export const AlignStart: Story = { + render: () => ( + + + + + +
+

Popover Content

+

This is the content of the popover.

+
+
+
+ ), +}; + +export const AlignEnd: Story = { + render: () => ( + + + + + +
+

Popover Content

+

This is the content of the popover.

+
+
+
+ ), +}; + +export const CustomOffset: Story = { + render: () => ( + + + + + +
+

Popover Content

+

This is the content of the popover.

+
+
+
+ ), +}; + +export const CustomContent: Story = { + render: () => ( + + + + + +
+

Custom Content

+

This popover has custom content.

+ +
+
+
+ ), +}; diff --git a/autogpt_platform/frontend/src/components/ui/render.stories.tsx b/autogpt_platform/frontend/src/components/ui/render.stories.tsx new file mode 100644 index 0000000000..a453f79124 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/render.stories.tsx @@ -0,0 +1,70 @@ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; + +import { ContentRenderer } from "./render"; + +const meta = { + title: "UI/ContentRenderer", + component: ContentRenderer, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + value: { control: "text" }, + truncateLongData: { control: "boolean" }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Text: Story = { + args: { + value: "This is a simple text content.", + }, +}; + +export const LongText: Story = { + args: { + value: + "This is a very long text that will be truncated when the truncateLongData prop is set to true. It contains more than 100 characters to demonstrate the truncation feature.", + truncateLongData: true, + }, +}; + +export const Image: Story = { + args: { + value: "https://example.com/image.jpg", + }, +}; + +export const Video: Story = { + args: { + value: "https://example.com/video.mp4", + }, +}; + +export const YouTubeVideo: Story = { + args: { + value: "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + }, +}; + +export const JsonObject: Story = { + args: { + value: { key: "value", nested: { array: [1, 2, 3] } }, + }, +}; + +export const TruncatedJsonObject: Story = { + args: { + value: { + key: "value", + nested: { array: [1, 2, 3] }, + longText: + "This is a very long text that will be truncated when rendered as part of the JSON object.", + }, + truncateLongData: true, + }, +}; diff --git a/autogpt_platform/frontend/src/components/ui/scroll-area.stories.tsx b/autogpt_platform/frontend/src/components/ui/scroll-area.stories.tsx new file mode 100644 index 0000000000..0e2ee1bfb1 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/scroll-area.stories.tsx @@ -0,0 +1,126 @@ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; + +import { ScrollArea } from "./scroll-area"; + +const meta = { + title: "UI/ScrollArea", + component: ScrollArea, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + className: { control: "text" }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + className: "h-[200px] w-[350px] rounded-md border p-4", + children: ( +
+

This is a scrollable area with some content.

+ {Array(20) + .fill(0) + .map((_, i) => ( +
+ Item {i + 1} +
+ ))} +
+ ), + }, +}; + +export const HorizontalScroll: Story = { + args: { + className: "h-[100px] w-[350px] rounded-md border", + children: ( +
+ {Array(20) + .fill(0) + .map((_, i) => ( +
+ {i + 1} +
+ ))} +
+ ), + }, +}; + +export const NestedScrollAreas: Story = { + args: { + className: "h-[300px] w-[350px] rounded-md border p-4", + children: ( +
+

+ Outer Scroll Area +

+ {Array(3) + .fill(0) + .map((_, i) => ( +
+

Section {i + 1}

+ +
+
+ Inner Scroll Area +
+ {Array(10) + .fill(0) + .map((_, j) => ( +
+ Nested Item {j + 1} +
+ ))} +
+
+
+ ))} +
+ ), + }, +}; + +export const CustomScrollbarColors: Story = { + args: { + className: "h-[200px] w-[350px] rounded-md border p-4", + children: ( +
+

Customized scrollbar colors.

+ {Array(20) + .fill(0) + .map((_, i) => ( +
+ Item {i + 1} +
+ ))} +
+ ), + }, + parameters: { + backgrounds: { default: "dark" }, + }, + decorators: [ + (Story) => ( +
+ + +
+ ), + ], +}; diff --git a/autogpt_platform/frontend/src/components/ui/select.stories.tsx b/autogpt_platform/frontend/src/components/ui/select.stories.tsx new file mode 100644 index 0000000000..0c6995779a --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/select.stories.tsx @@ -0,0 +1,96 @@ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; + +import { + Select, + SelectTrigger, + SelectValue, + SelectContent, + SelectItem, +} from "./select"; + +const meta = { + title: "UI/Select", + component: Select, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + disabled: { + control: "boolean", + }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const SelectExample = (args: any) => ( + +); + +export const Default: Story = { + render: (args) => , +}; + +export const Disabled: Story = { + render: (args) => , + args: { + disabled: true, + }, +}; + +export const WithPlaceholder: Story = { + render: (args) => ( + + ), +}; + +export const WithDefaultValue: Story = { + render: (args) => ( + + ), +}; + +export const CustomTriggerWidth: Story = { + render: (args) => ( + + ), +}; diff --git a/autogpt_platform/frontend/src/components/ui/separator.stories.tsx b/autogpt_platform/frontend/src/components/ui/separator.stories.tsx new file mode 100644 index 0000000000..2fb3a5f8f9 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/separator.stories.tsx @@ -0,0 +1,91 @@ +import React from "react"; +import type { Meta, StoryObj } from "@storybook/react"; + +import { Separator } from "./separator"; + +const meta = { + title: "UI/Separator", + component: Separator, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + orientation: { + control: "select", + options: ["horizontal", "vertical"], + }, + className: { control: "text" }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: {}, +}; + +export const Horizontal: Story = { + args: { + orientation: "horizontal", + }, + decorators: [ + (Story) => ( +
+
Above
+ +
Below
+
+ ), + ], +}; + +export const Vertical: Story = { + args: { + orientation: "vertical", + }, + decorators: [ + (Story) => ( +
+
Left
+ +
Right
+
+ ), + ], +}; + +export const CustomStyle: Story = { + args: { + className: "bg-red-500", + }, + decorators: [ + (Story) => ( +
+
Above
+ +
Below
+
+ ), + ], +}; + +export const WithContent: Story = { + render: (args) => ( +
+

Radix Primitives

+

+ An open-source UI component library. +

+ +
+
Blog
+ +
Docs
+ +
Source
+
+
+ ), +}; diff --git a/autogpt_platform/frontend/src/components/ui/sheet.stories.tsx b/autogpt_platform/frontend/src/components/ui/sheet.stories.tsx new file mode 100644 index 0000000000..aa78d73367 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/sheet.stories.tsx @@ -0,0 +1,83 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { + Sheet, + SheetTrigger, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription, +} from "./sheet"; +import { Button } from "./button"; + +const meta = { + title: "UI/Sheet", + component: Sheet, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const SheetDemo = ({ side }: { side: "top" | "right" | "bottom" | "left" }) => ( + + + + + + + Sheet Title + + This is a description of the sheet content. + + +
Sheet content goes here.
+ + + +
+
+); + +export const Default: Story = { + render: () => , +}; + +export const Left: Story = { + render: () => , +}; + +export const Top: Story = { + render: () => , +}; + +export const Bottom: Story = { + render: () => , +}; + +export const CustomContent: Story = { + render: () => ( + + + + + + + Custom Sheet + +
+

This sheet has custom content.

+
    +
  • Item 1
  • +
  • Item 2
  • +
  • Item 3
  • +
+
+
+
+ ), +}; diff --git a/autogpt_platform/frontend/src/components/ui/switch.stories.tsx b/autogpt_platform/frontend/src/components/ui/switch.stories.tsx new file mode 100644 index 0000000000..20f1b48ea6 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/switch.stories.tsx @@ -0,0 +1,55 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { Switch } from "./switch"; + +const meta = { + title: "UI/Switch", + component: Switch, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + checked: { control: "boolean" }, + disabled: { control: "boolean" }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: {}, +}; + +export const Checked: Story = { + args: { + checked: true, + }, +}; + +export const Disabled: Story = { + args: { + disabled: true, + }, +}; + +export const CheckedAndDisabled: Story = { + args: { + checked: true, + disabled: true, + }, +}; + +export const WithLabel: Story = { + render: (args) => ( +
+ + +
+ ), +}; + +export const CustomSized: Story = { + render: (args) => , +}; diff --git a/autogpt_platform/frontend/src/components/ui/table.stories.tsx b/autogpt_platform/frontend/src/components/ui/table.stories.tsx new file mode 100644 index 0000000000..9a51b5a971 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/table.stories.tsx @@ -0,0 +1,113 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} from "./table"; + +const meta = { + title: "UI/Table", + component: Table, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( + + A list of your recent invoices. + + + Invoice + Status + Method + Amount + + + + + INV001 + Paid + Credit Card + $250.00 + + + INV002 + Pending + PayPal + $150.00 + + + + + Total + $400.00 + + +
+ ), +}; + +export const WithoutFooter: Story = { + render: () => ( + + + + Name + Email + Role + + + + + Alice Johnson + alice@example.com + Admin + + + Bob Smith + bob@example.com + User + + +
+ ), +}; + +export const WithCustomStyles: Story = { + render: () => ( + + + + + Column 1 + + + Column 2 + + + + + + Value 1 + Value 2 + + + Value 3 + Value 4 + + +
+ ), +}; diff --git a/autogpt_platform/frontend/src/components/ui/textarea.stories.tsx b/autogpt_platform/frontend/src/components/ui/textarea.stories.tsx new file mode 100644 index 0000000000..a2a3c28da3 --- /dev/null +++ b/autogpt_platform/frontend/src/components/ui/textarea.stories.tsx @@ -0,0 +1,59 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import { Textarea } from "./textarea"; + +const meta = { + title: "UI/Textarea", + component: Textarea, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], + argTypes: { + placeholder: { control: "text" }, + disabled: { control: "boolean" }, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + placeholder: "Type your message here.", + }, +}; + +export const Disabled: Story = { + args: { + placeholder: "This textarea is disabled", + disabled: true, + }, +}; + +export const WithValue: Story = { + args: { + value: "This is some pre-filled text in the textarea.", + }, +}; + +export const CustomSized: Story = { + args: { + placeholder: "Custom sized textarea", + className: "w-[300px] h-[150px]", + }, +}; + +export const WithLabel: Story = { + render: (args) => ( +
+ +