diff --git a/apps/billing/cursor/drizzle_instructions.txt b/apps/billing/cursor/drizzle_instructions.txt new file mode 100644 index 0000000000..71a3c245ad --- /dev/null +++ b/apps/billing/cursor/drizzle_instructions.txt @@ -0,0 +1,159 @@ +Drizzle ORM MySQL Model Generation Guide + +1. Table Definition: + - Use `mysqlTable` to define tables + - Example: + ```typescript + import { mysqlTable, varchar, text, timestamp, int } from 'drizzle-orm/mysql-core'; + + export const tableName = mysqlTable('table_name', { + id: varchar('id', { length: 255 }).primaryKey(), + name: varchar('name', { length: 255 }).notNull(), + description: text('description'), + createdAt: timestamp('created_at').notNull().defaultNow(), + updatedAt: timestamp('updated_at').notNull().$onUpdate(() => new Date()), + }); + ``` + +2. Relations: + - Use `relations` to define relationships between tables + - Ensure that relations are defined in the appropriate files that contain their related models + - Note: Schemas are defined in the src/lib/db-marketing/schemas folder with an index.ts file as barrel. + - Example: + ```typescript + import { relations } from 'drizzle-orm'; + + export const usersRelations = relations(users, ({ many }) => ({ + posts: many(posts), + })); + + export const postsRelations = relations(posts, ({ one }) => ({ + author: one(users, { + fields: [posts.authorId], + references: [users.id], + }), + })); + ``` + +3. Schemas: + - Use `createInsertSchema` and `createSelectSchema` from 'drizzle-zod' for Zod schemas + - Example: + ```typescript + import { createInsertSchema, createSelectSchema } from 'drizzle-zod'; + + export const insertTableNameSchema = createInsertSchema(tableName); + export const selectTableNameSchema = createSelectSchema(tableName); + ``` + - Override or refine fields when creating schemas: + ```typescript + const insertUserSchema = createInsertSchema(users, { + role: z.string(), + id: (schema) => schema.id.positive(), + email: (schema) => schema.email.email(), + }); + ``` + - Prefer extending or omitting from these exported schemas instead of creating new ones, as they serve as the source of truth + - Example: + ```typescript + export const customTableNameSchema = selectTableNameSchema.extend({ + newField: z.string(), + }); + ``` + +4. Types: + - Use Zod's infer utility with the generated schemas + - Example: + ```typescript + export type InsertTableName = z.infer; + export type SelectTableName = z.infer; + ``` + +5. Junction Tables: + - For many-to-many relationships, create a junction table + - Example: + ```typescript + export const junctionTable = mysqlTable('junction_table', { + table1Id: varchar('table1_id', { length: 255 }).notNull(), + table2Id: varchar('table2_id', { length: 255 }).notNull(), + }, (t) => ({ + pk: primaryKey({ columns: [t.table1Id, t.table2Id] }), + })); + ``` + +6. Timestamps: + - For `createdAt` and `updatedAt` fields: + ```typescript + createdAt: timestamp('created_at').notNull().defaultNow(), + updatedAt: timestamp('updated_at').notNull().$onUpdate(() => new Date()), + ``` + +7. Prefer Relational Data Modeling: + - Use relational data modeling and separate tables instead of JSON fields when possible + - This improves query performance and maintains better data integrity + - Example: Instead of storing an array of items as JSON, create a separate table and use a foreign key relationship + ```typescript + // Instead of: + const users = mysqlTable('users', { + id: varchar('id', { length: 255 }).primaryKey(), + name: varchar('name', { length: 255 }).notNull(), + items: json('items'), // Stores an array of items as JSON + }); + + // Prefer: + const users = mysqlTable('users', { + id: varchar('id', { length: 255 }).primaryKey(), + name: varchar('name', { length: 255 }).notNull(), + }); + + const items = mysqlTable('items', { + id: varchar('id', { length: 255 }).primaryKey(), + userId: varchar('user_id', { length: 255 }).notNull(), + name: varchar('name', { length: 255 }).notNull(), + }); + + const usersRelations = relations(users, ({ many }) => ({ + items: many(items), + })); + ``` + +8. Column Types: + - Drizzle supports various MySQL column types, including: + ```typescript + import { int, tinyint, smallint, mediumint, bigint } from 'drizzle-orm/mysql-core'; + + const table = mysqlTable('table', { + tinyIntColumn: tinyint('tiny_int_column'), + smallIntColumn: smallint('small_int_column'), + mediumIntColumn: mediumint('medium_int_column'), + intColumn: int('int_column'), + bigIntColumn: bigint('big_int_column'), + }); + ``` + +9. Default Values and Constraints: + - Set default values and constraints on columns: + ```typescript + const table = mysqlTable('table', { + intWithDefault: int('int_with_default').default(3), + notNullInt: int('not_null_int').notNull(), + }); + ``` + +10. Relational Queries: + - Perform nested relational queries: + ```typescript + const result = await db.query.users.findMany({ + with: { + posts: true + }, + }); + ``` + +11. Best Practices: + - Co-locate relations, schemas, and types with their respective model definitions + - Use meaningful and consistent naming conventions + - Define primary keys and foreign keys appropriately + - Use the correct data types and lengths for your fields + +Remember to import necessary functions and types from 'drizzle-orm' and 'drizzle-orm/mysql-core'. +Remember that these are just guidelines & examples. Ensure you use the correct types & schemas for your tables and relations. \ No newline at end of file diff --git a/apps/billing/cursor/prompt-engineering.md b/apps/billing/cursor/prompt-engineering.md new file mode 100644 index 0000000000..05e1b1a46f --- /dev/null +++ b/apps/billing/cursor/prompt-engineering.md @@ -0,0 +1,797 @@ +# Prompt Engineering Guide for Language Models + +As an AI language model, your ability to generate high-quality responses depends heavily on the prompts you receive. This guide will help you understand the key principles of effective prompt engineering. + +## Executive Summary + +This guide provides comprehensive strategies for effective prompt engineering when working with large language models (LLMs). Key points include: + +1. Understanding LLMs: Their capabilities, limitations, and how they process input. +2. Importance of prompts: How they shape and guide model outputs. +3. Key principles: Clear instructions, including examples, considering temperature settings, and iterative refinement. +4. Advanced techniques: Command grammars, embedding data, citations, and programmatic consumption of outputs. +5. Practical strategies: Chain-of-thought prompting, handling nested data, and working with various data formats. + +By mastering these concepts and techniques, you can significantly improve the quality and reliability of LLM-generated responses for a wide range of applications. + +## Understanding Large Language Models (LLMs) + +- LLMs are prediction engines that take a sequence of words as input and predict the most likely sequence to follow. +- They assign probabilities to potential next sequences and select one. +- Their knowledge comes from training on massive text corpora, which influences their strengths and limitations. +- While LLM responses often seem plausible, they may sometimes be random or not grounded in reality. This is a problem, always write prompts that are specific and avoid ambiguity or hallucinations. +- When tasking the AI to write prompts, consider these characteristics to craft effective instructions. + +## The Importance of Prompts + +- Prompts are the starting points for your text generation. +- Crafting your prompt is the means by which you "instruct" or "program" the model. +- They shape your responses and guide you towards the desired output. + +## Key Principles of Prompt Engineering + +1. Start with Clear Instructions: + - Begin with a clear, specific instruction about the desired output. + - Example: "Create a slogan for an organic coffee shop" is more specific than "Create a slogan for a coffee shop." + - The results for these two prompts are the following: + - "Fueling your day, one cup at a time." + - "Fuel your day the natural way with our organic brews!" + - Note how introducing a single descriptive term to our prompt influences the completion. + +2. Include Examples: + - Demonstrate patterns or subtleties by providing examples in the prompt. + - This helps convey the expected format and style of the output. + - Without examples: + Prompt: + + ``` + Create three slogans for a coffee shop with live music. + ``` + + Completion: + + ``` + 1. "Sip, savor, and sway to the rhythm at our coffee shop with live music!" + 2. "Fuel your day with a cup of joe and a side of soulful tunes at our coffee shop." + 3. "Where the coffee is hot and the music is live - come enjoy the vibe!" + ``` + + Evaluation: + - These slogans are fine, but could be even better + - It appears the model overlooked the 'live' part in our prompt + - With examples: + Prompt: + + ``` + Create three slogans for a business with unique features. + Business: Bookstore with cats + Slogans: "Purr-fect Pages", "Books and Whiskers", "Novels and Nuzzles" + Business: Gym with rock climbing + Slogans: "Peak Performance", "Reach New Heights", "Climb Your Way Fit" + Business: Coffee shop with live music + Slogans: + ``` + + Completion: + + ``` + "Java Jams", "Brews and Beats", "Caffeine and Concerts" + ``` + + Evaluation: + - Incorporating examples of expected output for a certain input prompted the model to generate the kind of names we aimed for. + +- When including examples, comment above that you want me to review the examples and potentially provide placeholders for me to fill in + +3. Consider Temperature Settings: + - Temperature (0 to 1) controls the randomness of your outputs. + - Lower temperature (0) leads to more deterministic, focused responses. + - Higher temperature (1) produces more diverse, creative outputs. + - Choose based on the task: lower for factual tasks, higher for creative tasks. + - Comment on the nature of the task you're prompting for to guide the model's creativity & adjust the temperature accordingly. + - Example with temperature 1: + Prompt: + + ``` + Create three slogans for a business with unique features. + Business: Bookstore with cats + Slogans: "Purr-fect Pages", "Books and Whiskers", "Novels and Nuzzles" + Business: Gym with rock climbing + Slogans: "Peak Performance", "Reach New Heights", "Climb Your Way Fit" + Business: Coffee shop with live music + Slogans: + ``` + + Completion: + - first completion: + + ``` + "Beans and Beats", "Espresso and Echoes", "Music, Mocha, and More" + ``` + + - second completion: + + ``` + "Jazz up your Java", "Sip, Sit, and Listen", "Groove and Grind" + ``` + + - third completion: + + ``` + "Java Jams", "A Sip of Sound", "Caffeine and Concerts" + ``` + + - fourth completion: + + ``` + "Beans and Beats", "Caffeine and Concerts", "Music to Your Mocha" + ``` + + Evaluation: + - With a temperature above 0, the same prompt delivers varied completions each time. + - Keep in mind that the model forecasts the text most likely to follow the preceding text. + +4. Iterate and Refine: + - If the initial output isn't satisfactory, refine the prompt and try again. + - Add more context, examples, or specific instructions as needed. + +### Teach a Bot to Fish + +Sometimes you’ll want the bot to have the capability to perform actions on the user’s behalf, like adding a memo to a receipt or plotting a chart. Or perhaps we want it to retrieve data in more nuanced ways than semantic search would allow for, like retrieving the past 90 days of expenses. + +In these scenarios, we need to teach the bot how to fish. + +#### Command Grammars + +We can give the bot a list of commands for our system to interpret, along with descriptions and examples for the commands, and then have it produce programs composed of those commands. + +There are many caveats to consider when going with this approach. With complex command grammars, the bot will tend to hallucinate commands or arguments that could plausibly exist, but don’t actually. The art to getting this right is enumerating commands that have relatively high levels of abstraction, while giving the bot sufficient flexibility to compose them in novel and useful ways. + +For example, giving the bot a `plot-the-last-90-days-of-expenses` command is not particularly flexible or composable in what the bot can do with it. Similarly, a `draw-pixel-at-x-y [x] [y] [rgb]` command would be far too low-level. But giving the bot a `plot-expenses` and `list-expenses` command provides some good primitives that the bot has some flexibility with. + +In an example below, we use this list of commands: + +| Command | Arguments | Description | +| ------------------ | --------------------------- | ------------------------------------------------ | +| list-expenses | budget | Returns a list of expenses for a given budget | +| converse | message | A message to show to the user | +| plot-expenses | expenses[] | Plots a list of expenses | +| get-budget-by-name | budget_name | Retrieves a budget by name | +| list-budgets | | Returns a list of budgets the user has access to | +| add-memo | inbox_item_id, memo message | Adds a memo to the provided inbox item | + +We provide this table to the model in Markdown format, which the language model handles incredibly well – presumably because OpenAI trains heavily on data from GitHub. + +In this example below, we ask the model to output the commands in [reverse polish notation](https://en.wikipedia.org/wiki/Reverse_Polish_notation)[^7]. + +[^7]: The model handles the simplicity of RPN astoundingly well. + +

+ +

+ +> 🧠 There are some interesting subtle things going on in that example, beyond just command generation. When we ask it to add a memo to the “shake shack” expense, the model knows that the command `add-memo` takes an expense ID. But we never tell it the expense ID, so it looks up “Shake Shack” in the table of expenses we provided it, then grabs the ID from the corresponding ID column, and then uses that as an argument to `add-memo`. + +Getting command grammars working reliably in complex situations can be tricky. The best levers we have here are to provide lots of descriptions, and as **many examples** of usage as we can. Large language models are [few-shot learners](https://en.wikipedia.org/wiki/Few-shot_learning_(natural_language_processing)), meaning that they can learn a new task by being provided just a few examples. In general, the more examples you provide the better off you’ll be – but that also eats into your token budget, so it’s a balance. + +Here’s a more complex example, with the output specified in JSON instead of RPN. And we use Typescript to define the return types of commands. + +

+ +

+ +
+ + (Full prompt) + +~~~ +You are a financial assistant working at Brex, but you are also an expert programmer. + +I am a customer of Brex. + +You are to answer my questions by composing a series of commands. + +The output types are: + +```typescript +type LinkedAccount = { + id: string, + bank_details: { + name: string, + type: string, + }, + brex_account_id: string, + last_four: string, + available_balance: { + amount: number, + as_of_date: Date, + }, + current_balance: { + amount: number, + as_of_date: Date, + }, +} + +type Expense = { + id: string, + memo: string, + amount: number, +} + +type Budget = { + id: string, + name: string, + description: string, + limit: { + amount: number, + currency: string, + } +} +``` + +The commands you have available are: + +| Command | Arguments | Description | Output Format | +| -------------------- | ------------------- | ----------------------------------------------------------------------------------------- | --------------- | +| nth | index, values[] | Return the nth item from an array | any | +| push | value | Adds a value to the stack to be consumed by a future command | any | +| value | key, object | Returns the value associated with a key | any | +| values | key, object[] | Returns an array of values pulled from the corresponding key in array of objects | any[] | +| sum | value[] | Sums an array of numbers | number | +| plot | title, values[] | Plots the set of values in a chart with the given title | Plot | +| list-linked-accounts | | "Lists all bank connections that are eligible to make ACH transfers to Brex cash account" | LinkedAccount[] | +| list-expenses | budget_id | Given a budget id, returns the list of expenses for it | Expense[] | +| get-budget-by-name | name | Given a name, returns the budget | Budget | +| add-memo | expense_id, message | Adds a memo to an expense | bool | +| converse | message | Send the user a message | null | + +Only respond with commands. + +Output the commands in JSON as an abstract syntax tree. + +IMPORTANT - Only respond with a program. Do not respond with any text that isn't part of a program. Do not write prose, even if instructed. Do not explain yourself. + +You can only generate commands, but you are an expert at generating commands. +~~~ + +
+ +This version is a bit easier to parse and interpret if your language of choice has a `JSON.parse` function. + +> 🧙‍♂️ There is no industry established best format for defining a DSL for the model to generate programs. So consider this an area of active research. You will bump into limits. And as we overcome these limits, we may discover more optimal ways of defining commands. + +#### ReAct + +In March of 2023, Princeton and Google released a paper “[ReAct: Synergizing Reasoning and Acting in Language Models](https://arxiv.org/pdf/2210.03629.pdf)”, where they introduce a variant of command grammars that allows for fully autonomous interactive execution of actions and retrieval of data. + +The model is instructed to return a `thought` and an `action` that it would like to perform. Another agent (e.g. our client) then performs the `action` and returns it to the model as an `observation`. The model will then loop to return more thoughts and actions until it returns an `answer`. + +This is an incredibly powerful technique, effectively allowing the bot to be its own research assistant and possibly take actions on behalf of the user. Combined with a powerful command grammar, the bot should rapidly be able to answer a massive set of user requests. + +In this example, we give the model a small set of commands related to getting employee data and searching wikipedia: + +| Command | Arguments | Description | +| ------------- | ----------- | ----------------------------------------------------------------------------------------- | +| find_employee | name | Retrieves an employee by name | +| get_employee | id | Retrieves an employee by ID | +| get_location | id | Retrieves a location by ID | +| get_reports | employee_id | Retrieves a list of employee ids that report to the employee associated with employee_id. | +| wikipedia | article | Retrieves a wikipedia article on a topic. | + +We then ask the bot a simple question, “Is my manager famous?”. + +We see that the bot: + +1. First looks up our employee profile. +2. From our profile, gets our manager’s id and looks up their profile. +3. Extracts our manager’s name and searches for them on Wikipedia. + - I chose a fictional character for the manager in this scenario. +4. The bot reads the wikipedia article and concludes that can’t be my manager since it is a fictional character. +5. The bot then modifies its search to include (real person). +6. Seeing that there are no results, the bot concludes that my manager is not famous. + +| ![image](https://user-images.githubusercontent.com/89960/233506839-5c8b2d77-1d78-464d-bc33-a725e12f2624.png) | ![image](https://user-images.githubusercontent.com/89960/233506870-05fc415d-efa2-48b7-aad9-b5035e535e6d.png) | +| ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | + +
+(Full prompt) + +~~~ +You are a helpful assistant. You run in a loop, seeking additional information to answer a user's question until you are able to answer the question. + +Today is June 1, 2025. My name is Fabian Seacaster. My employee ID is 82442. + +The commands to seek information are: + +| Command | Arguments | Description | +| ------------- | ----------- | ------------------------------------------------------------------------------------------- | +| find_employee | name | Retrieves an employee by name | +| get_employee | id | Retrieves an employee by ID | +| get_location | id | Retrieves a location by ID | +| get_reports | employee_id | Retrieves a list of employee ids that report to the employee associated with `employee_id`. | +| wikipedia | article | Retrieves a wikipedia article on a topic. | + +Your response will be in JSON and will include a "Thought" + "Action" to retrieve data that you need in order to answer the question, or it will include the "Answer". When data has been retrieved, it will be included as an "Observation". + +You will continue generating thoughts and actions until you get to an answer, or conclude that you can't. + +Example 1: +``` +User: What is the population of Philadelphia? + +Assistant: { + "thought": "Wikipedia likely has this information. I'm looking it up...", + "action": {"command": "wikipedia", "article": "Philadelphia"} +} + +Assistant: { + "observation": "Philadelphia, often called Philly, is the largest city in the Commonwealth of Pennsylvania and the second-largest city in both the Northeast megalopolis and Mid-Atlantic regions after New York City. It is one of the most historically significant cities in the United States and served as the nation's capital city until 1800. Philadelphia is the nation's sixth-largest city with a population of 1,603,797 as of the 2020 census. Since 1854, the city has been coextensive with Philadelphia County, the most populous county in Pennsylvania and the urban core of the Delaware Valley, the nation's seventh-largest and one of the world's largest metropolitan regions with 6.245 million residents in 2020. Philadelphia is known for its extensive contributions to American history and for its role in the life sciences, business and industry, art, literature, and music." +} + +Assistant: { + "answer": "The population of Philadelphia, as of the 2020 census, is 1,603,797 people." +} +``` + +Example 2: +``` +User: What is my manager's city? + +Assistant: { + "thought": "Let me look up who your manager is. First, I need to look up your profile.", + "action": {"command": "get_employee", "id": 92352} +} + +Assistant: { + "observation": { + "id": 78334, + "name": "Ms. Manager", + "location_id": 8832 + } +} + +Assistant: { + "thought": "Your manager is Ms. Manager. I'm looking up their location.", + "action": {"command": "get_location", "id": 8832} +} + +Assistant: { + "observation": { + "id": 8832, + "name": "Philadelphia" + } +} + +Assistant: { + "answer": "Your manager lives in Philadelphia." +} +``` +~~~ + +
+ +## Further Strategies + +This section contains examples and strategies for specific needs or problems. For successful prompt engineering, you will need to combine some subset of all of the strategies enumerated in this document. Don’t be afraid to mix and match things – or invent your own approaches. + +### Embedding Data + +In hidden contexts, you’ll frequently want to embed all sorts of data. The specific strategy will vary depending on the type and quantity of data you are embedding. + +#### Simple Lists + +For one-off objects, enumerating fields + values in a normal bulleted list works pretty well: + +

+ +

+ +It will also work for larger sets of things, but there are other formats for lists of data that GPT handles more reliably. Regardless, here’s an example: + +

+ +

+ +#### Markdown Tables + +Markdown tables are great for scenarios where you have many items of the same type to enumerate. + +Fortunately, OpenAI’s models are exceptionally good at working with Markdown tables (presumably from the tons of GitHub data they’ve trained on). + +We can reframe the above using Markdown tables instead: + +

+ +

+ +

+ +

+ +> 🧠 Note that in this last example, the items in the table have an explicit date, February 2nd. In our question, we asked about “today”. And earlier in the prompt we mentioned that today was Feb 2. The model correctly handled the transitive inference – converting “today” to “February 2nd” and then looking up “February 2nd” in the table. + +#### JSON + +Markdown tables work really well for many use cases and should be preferred due to their density and ability for the model to handle them reliably, but you may run into scenarios where you have many columns and the model struggles with it or every item has some custom attributes and it doesn’t make sense to have dozens of columns of empty data. + +In these scenarios, JSON is another format that the model handles really well. The close proximity of `keys` to their `values` makes it easy for the model to keep the mapping straight. + +Here is the same example from the Markdown table, but with JSON instead: + +

+ +

+ +#### Freeform Text + +Occasionally you’ll want to include freeform text in a prompt that you would like to delineate from the rest of the prompt – such as embedding a document for the bot to reference. In these scenarios, surrounding the document with triple backticks, ```, works well[^8]. + +

+ +

+ +[^8]: A good rule of thumb for anything you’re doing in prompts is to lean heavily on things the model would have learned from GitHub. + +#### Nested Data + +Not all data is flat and linear. Sometimes you’ll need to embed data that is nested or has relations to other data. In these scenarios, lean on `JSON`: + +

+ +

+ +
+(Full prompt) + +~~~ +You are a helpful assistant. You answer questions about users. Here is what you know about them: + +{ + "users": [ + { + "id": 1, + "name": "John Doe", + "contact": { + "address": { + "street": "123 Main St", + "city": "Anytown", + "state": "CA", + "zip": "12345" + }, + "phone": "555-555-1234", + "email": "johndoe@example.com" + } + }, + { + "id": 2, + "name": "Jane Smith", + "contact": { + "address": { + "street": "456 Elm St", + "city": "Sometown", + "state": "TX", + "zip": "54321" + }, + "phone": "555-555-5678", + "email": "janesmith@example.com" + } + }, + { + "id": 3, + "name": "Alice Johnson", + "contact": { + "address": { + "street": "789 Oak St", + "city": "Othertown", + "state": "NY", + "zip": "67890" + }, + "phone": "555-555-2468", + "email": "alicejohnson@example.com" + } + }, + { + "id": 4, + "name": "Bob Williams", + "contact": { + "address": { + "street": "135 Maple St", + "city": "Thistown", + "state": "FL", + "zip": "98765" + }, + "phone": "555-555-8642", + "email": "bobwilliams@example.com" + } + }, + { + "id": 5, + "name": "Charlie Brown", + "contact": { + "address": { + "street": "246 Pine St", + "city": "Thatstown", + "state": "WA", + "zip": "86420" + }, + "phone": "555-555-7531", + "email": "charliebrown@example.com" + } + }, + { + "id": 6, + "name": "Diane Davis", + "contact": { + "address": { + "street": "369 Willow St", + "city": "Sumtown", + "state": "CO", + "zip": "15980" + }, + "phone": "555-555-9512", + "email": "dianedavis@example.com" + } + }, + { + "id": 7, + "name": "Edward Martinez", + "contact": { + "address": { + "street": "482 Aspen St", + "city": "Newtown", + "state": "MI", + "zip": "35742" + }, + "phone": "555-555-6813", + "email": "edwardmartinez@example.com" + } + }, + { + "id": 8, + "name": "Fiona Taylor", + "contact": { + "address": { + "street": "531 Birch St", + "city": "Oldtown", + "state": "OH", + "zip": "85249" + }, + "phone": "555-555-4268", + "email": "fionataylor@example.com" + } + }, + { + "id": 9, + "name": "George Thompson", + "contact": { + "address": { + "street": "678 Cedar St", + "city": "Nexttown", + "state": "GA", + "zip": "74125" + }, + "phone": "555-555-3142", + "email": "georgethompson@example.com" + } + }, + { + "id": 10, + "name": "Helen White", + "contact": { + "address": { + "street": "852 Spruce St", + "city": "Lasttown", + "state": "VA", + "zip": "96321" + }, + "phone": "555-555-7890", + "email": "helenwhite@example.com" + } + } + ] +} +~~~ + +
+ +If using nested `JSON` winds up being too verbose for your token budget, fallback to `relational tables` defined with `Markdown`: + +

+ +

+ +
+(Full prompt) + +~~~ +You are a helpful assistant. You answer questions about users. Here is what you know about them: + +Table 1: users +| id (PK) | name | +| ------- | --------------- | +| 1 | John Doe | +| 2 | Jane Smith | +| 3 | Alice Johnson | +| 4 | Bob Williams | +| 5 | Charlie Brown | +| 6 | Diane Davis | +| 7 | Edward Martinez | +| 8 | Fiona Taylor | +| 9 | George Thompson | +| 10 | Helen White | + +Table 2: addresses +| id (PK) | user_id (FK) | street | city | state | zip | +| ------- | ------------ | ------------- | --------- | ----- | ----- | +| 1 | 1 | 123 Main St | Anytown | CA | 12345 | +| 2 | 2 | 456 Elm St | Sometown | TX | 54321 | +| 3 | 3 | 789 Oak St | Othertown | NY | 67890 | +| 4 | 4 | 135 Maple St | Thistown | FL | 98765 | +| 5 | 5 | 246 Pine St | Thatstown | WA | 86420 | +| 6 | 6 | 369 Willow St | Sumtown | CO | 15980 | +| 7 | 7 | 482 Aspen St | Newtown | MI | 35742 | +| 8 | 8 | 531 Birch St | Oldtown | OH | 85249 | +| 9 | 9 | 678 Cedar St | Nexttown | GA | 74125 | +| 10 | 10 | 852 Spruce St | Lasttown | VA | 96321 | + +Table 3: phone_numbers +| id (PK) | user_id (FK) | phone | +| ------- | ------------ | ------------ | +| 1 | 1 | 555-555-1234 | +| 2 | 2 | 555-555-5678 | +| 3 | 3 | 555-555-2468 | +| 4 | 4 | 555-555-8642 | +| 5 | 5 | 555-555-7531 | +| 6 | 6 | 555-555-9512 | +| 7 | 7 | 555-555-6813 | +| 8 | 8 | 555-555-4268 | +| 9 | 9 | 555-555-3142 | +| 10 | 10 | 555-555-7890 | + +Table 4: emails +| id (PK) | user_id (FK) | email | +| ------- | ------------ | -------------------------- | +| 1 | 1 | johndoe@example.com | +| 2 | 2 | janesmith@example.com | +| 3 | 3 | alicejohnson@example.com | +| 4 | 4 | bobwilliams@example.com | +| 5 | 5 | charliebrown@example.com | +| 6 | 6 | dianedavis@example.com | +| 7 | 7 | edwardmartinez@example.com | +| 8 | 8 | fionataylor@example.com | +| 9 | 9 | georgethompson@example.com | +| 10 | 10 | helenwhite@example.com | + +Table 5: cities +| id (PK) | name | state | population | median_income | +| ------- | --------- | ----- | ---------- | ------------- | +| 1 | Anytown | CA | 50,000 | $70,000 | +| 2 | Sometown | TX | 100,000 | $60,000 | +| 3 | Othertown | NY | 25,000 | $80,000 | +| 4 | Thistown | FL | 75,000 | $65,000 | +| 5 | Thatstown | WA | 40,000 | $75,000 | +| 6 | Sumtown | CO | 20,000 | $85,000 | +| 7 | Newtown | MI | 60,000 | $55,000 | +| 8 | Oldtown | OH | 30,000 | $70,000 | +| 9 | Nexttown | GA | 15,000 | $90,000 | +| 10 | Lasttown | VA | 10,000 | $100,000 | +~~~ + +
+ +> 🧠 The model works well with data in [3rd normal form](https://en.wikipedia.org/wiki/Third_normal_form), but may struggle with too many joins. In experiments, it seems to do okay with at least three levels of nested joins. In the example above the model successfully joins from `users` to `addresses` to `cities` to infer the likely income for George – $90,000. + +### Citations + +Frequently, a natural language response isn’t sufficient on its own and you’ll want the model’s output to cite where it is getting data from. + +One useful thing to note here is that anything you might want to cite should have a unique ID. The simplest approach is to just ask the model to link to anything it references: + +

+ +

+ +### Programmatic Consumption + +By default, language models output natural language text, but frequently we need to interact with this result in a programmatic way that goes beyond simply printing it out on screen. You can achieve this by asking the model to output the results in your favorite serialization format (JSON and YAML seem to work best). + +Make sure you give the model an example of the output format you’d like. Building on our previous travel example above, we can augment our prompt to tell it: + +~~~ +Produce your output as JSON. The format should be: +``` +{ + message: "The message to show the user", + hotelId: 432, + flightId: 831 +} +``` + +Do not include the IDs in your message. +~~~ + +And now we’ll get interactions like this: + +

+ +

+ +You could imagine the UI for this rendering the message as normal text, but then also adding discrete buttons for booking the flight + hotel, or auto-filling a form for the user. + +As another example, let’s build on the [citations](#citations) example – but move beyond Markdown links. We can ask it to produce JSON with a normal message along with a list of items used in the creation of that message. In this scenario you won’t know exactly where in the message the citations were leveraged, but you’ll know that they were used somewhere. + +

+ +

+ +> 🧠 Interestingly, in the model’s response to “How much did I spend at Target?” it provides a single value, $188.16, but **importantly** in the `citations` array it lists the individual expenses that it used to compute that value. + +### Chain of Thought + +Sometimes you will bang your head on a prompt trying to get the model to output reliable results, but, no matter what you do, it just won’t work. This will frequently happen when the bot’s final output requires intermediate thinking, but you ask the bot only for the output and nothing else. + +The answer may surprise you: ask the bot to show its work. In October 2022, Google released a paper “[Chain-of-Thought Prompting Elicits Reasoning in Large Language Models](https://arxiv.org/pdf/2201.11903.pdf)” where they showed that if, in your hidden prompt, you give the bot examples of answering questions by showing your work, then when you ask the bot to answer something it will show its work and produce more reliable answers. + +Just a few weeks after that paper was published, at the end of October 2022, the University of Tokyo and Google released the paper “[Large Language Models are Zero-Shot Reasoners](https://openreview.net/pdf?id=e2TBb5y0yFf)”, where they show that you don’t even need to provide examples – **you simply have to ask the bot to think step-by-step**. + +#### Averaging + +Here is an example where we ask the bot to compute the average expense, excluding Target. The actual answer is $136.77 and the bot almost gets it correct with $136.43. + +

+ +

+ +If we simply add “Let’s think step-by-step”, the model gets the correct answer: + +

+ +

+ +#### Interpreting Code + +Let’s revisit the Python example from earlier and apply chain-of-thought prompting to our question. As a reminder, when we asked the bot to evaluate the Python code it gets it slightly wrong. The correct answer is `Hello, Brex!!Brex!!Brex!!!` but the bot gets confused about the number of !'s to include. In below’s example, it outputs `Hello, Brex!!!Brex!!!Brex!!!`: + +

+ +

+ +If we ask the bot to show its work, then it gets the correct answer: + +

+ +

+ +#### Delimiters + +In many scenarios, you may not want to show the end user all of the bot’s thinking and instead just want to show the final answer. You can ask the bot to delineate the final answer from its thinking. There are many ways to do this, but let’s use JSON to make it easy to parse: + +

+ +

+ +Using Chain-of-Thought prompting will consume more tokens, resulting in increased price and latency, but the results are noticeably more reliable for many scenarios. It’s a valuable tool to use when you need the bot to do something complex and as reliably as possible. + +## Prompt Guidelines + +1. Prompt Length: +• Aim for concise prompts when possible, but don't sacrifice clarity for brevity. +• For simple tasks, 1-3 sentences are often sufficient. +• For more complex tasks, longer prompts (up to a few paragraphs) may be necessary. +• Be aware of token limits for the specific model you're using. +Complexity: +• Match the complexity of your prompt to the task at hand. +• Use simpler language for straightforward tasks. +• For complex tasks, break them down into smaller steps or use chain-of-thought prompting. +Context: +• Include relevant context, but avoid unnecessary information that might confuse the model. +• If using examples, start with 2-3 and add more if needed for improved performance. +Specificity: +• Be as specific as possible about the desired output format and content. +• Use clear, unambiguous language to reduce the chance of misinterpretation. +Iterative Refinement: +• Start with a simple prompt and iteratively refine it based on the model's outputs. +• Test different variations to find the most effective formulation. +6. Model Considerations: +• Larger models can generally handle longer and more complex prompts effectively. +• Smaller models may require more concise and focused prompts. diff --git a/apps/billing/package.json b/apps/billing/package.json index abc67c594a..26c44e9d69 100644 --- a/apps/billing/package.json +++ b/apps/billing/package.json @@ -7,7 +7,10 @@ "scripts": { "dev": "pnpm dlx trigger.dev@latest dev", "db:push": "dotenv -e .env drizzle-kit push", - "db:studio": "dotenv -e .env drizzle-kit studio" + "db:studio": "dotenv -e .env drizzle-kit studio --verbose", + "db:generate": "dotenv -e .env drizzle-kit generate", + "db:migrate": "dotenv -e .env drizzle-kit migrate", + "db:pull": "dotenv -e .env drizzle-kit pull" }, "keywords": [], "author": "Andreas Thomas", @@ -18,10 +21,11 @@ "@chronark/zod-bird": "0.3.9", "@clerk/nextjs": "^4.29.10", "@mendable/firecrawl-js": "^1.5.2", + "@octokit/rest": "^21.0.2", "@planetscale/database": "^1.16.0", - "@trigger.dev/nextjs": "3.1.0", - "@trigger.dev/sdk": "3.1.0", - "@trigger.dev/slack": "3.1.0", + "@trigger.dev/nextjs": "3.1.2", + "@trigger.dev/sdk": "3.1.2", + "@trigger.dev/slack": "3.1.2", "@unkey/billing": "workspace:^", "@unkey/db": "workspace:^", "@unkey/error": "workspace:^", diff --git a/apps/billing/src/lib/db-marketing/data-instructions.txt b/apps/billing/src/lib/db-marketing/data-instructions.txt new file mode 100644 index 0000000000..7c4fa51ff0 --- /dev/null +++ b/apps/billing/src/lib/db-marketing/data-instructions.txt @@ -0,0 +1,15 @@ +Here is some info about how the data is structured in the db-marketing lib: + +→ I/O & Data Models [lib/db-marketing] +Data is persisted with drizzle into our planetscale marketing instance. Types are inferred from data schemas with drizzle-zod (reused in workflows). +Relationships: +- The central entity is the an inputTerm to which most models are connected & which is unique (relations ideally directly as a fk but sometimes through some relation in between as I went through iterations) +- Core tables track search queries and entries (search_queries, entries) +- Keyword management with m2m relationships (keywords, sections_to_keywords) +- Search data capture (serper tables for organic results, top stories & related searches from Google SERP) +- Content crawling results storage (firecrawl_responses) +API response structures from Serper and Firecrawl are modeled relationally to enable caching and data reuse ( + +@chronark + i wasn’t sure if JSON storage isn’t better but wasn’t familiar with mysql’s json storage as it doesn’t support jsonb) +Notably, I decided to link serper & firecrawl response tables on the returned URL per page to keep track of URLs we’ve scraped diff --git a/apps/billing/src/lib/db-marketing/schemas/entries.ts b/apps/billing/src/lib/db-marketing/schemas/entries.ts new file mode 100644 index 0000000000..da465e8869 --- /dev/null +++ b/apps/billing/src/lib/db-marketing/schemas/entries.ts @@ -0,0 +1,40 @@ +import { index, int, mysqlTable, text, timestamp, varchar } from "drizzle-orm/mysql-core"; +import { searchQueries } from "./searchQuery"; +import { relations } from "drizzle-orm"; +import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; +import { sections } from "./sections"; + +export const entries = mysqlTable( + "entries", + { + id: int("id").primaryKey().autoincrement(), + inputTerm: varchar("input_term", { length: 255 }).notNull(), + githubPrUrl: varchar("github_pr_url", { length: 255 }), + dynamicSectionsContent: text("dynamic_sections_content"), + metaTitle: varchar("meta_title", { length: 255 }), + metaDescription: varchar("meta_description", { length: 255 }), + createdAt: timestamp("created_at").notNull().defaultNow(), + updatedAt: timestamp("updated_at") + .notNull() + .defaultNow() + .$onUpdate(() => new Date()), + }, + (table) => ({ + inputTermIdx: index("input_term_idx").on(table.inputTerm), + }), +); + +export const entriesRelations = relations(entries, ({ many, one }) => ({ + dynamicSections: many(sections), + searchQuery: one(searchQueries, { + fields: [entries.inputTerm], + references: [searchQueries.inputTerm], + }), +})); + +export const insertEntrySchema = createInsertSchema(entries).extend({}).omit({ id: true }); +export const selectEntrySchema = createSelectSchema(entries); + +export type InsertEntry = z.infer; +export type SelectEntry = typeof entries.$inferSelect; diff --git a/apps/billing/src/lib/db-marketing/schemas/evals.ts b/apps/billing/src/lib/db-marketing/schemas/evals.ts new file mode 100644 index 0000000000..21ee8a5836 --- /dev/null +++ b/apps/billing/src/lib/db-marketing/schemas/evals.ts @@ -0,0 +1,81 @@ +import { mysqlTable, int, timestamp, mysqlEnum, text, index } from "drizzle-orm/mysql-core"; +import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import { z } from "zod"; +import { entries } from "./entries"; +import { relations } from "drizzle-orm"; + +export const evalTypes = ["technical", "seo", "editorial"] as const; +export type EvalType = (typeof evalTypes)[number]; + +export const evals = mysqlTable( + "evals", + { + id: int("id").primaryKey().autoincrement(), + entryId: int("entry_id") + .notNull() + .references(() => entries.id), + type: mysqlEnum("type", evalTypes).notNull(), + ratings: text("ratings").notNull(), // JSON stringified ratings + recommendations: text("recommendations").notNull().default("[]"), // Add default empty array + outline: text("outline").default("[]"), // Add outline field + createdAt: timestamp("created_at").notNull().defaultNow(), + updatedAt: timestamp("updated_at") + .notNull() + .defaultNow() + .$onUpdate(() => new Date()), + }, + (table) => ({ + entryIdIdx: index("entry_id_idx").on(table.entryId), + }), +); + +export const evalsRelations = relations(evals, ({ one }) => ({ + entry: one(entries, { + fields: [evals.entryId], + references: [entries.id], + }), +})); + +// Schema for LLM interaction - accepts string or number +const ratingValueSchema = z + .union([ + z.number().int().min(0).max(10), + z + .string() + .regex(/^\d+$/) + .transform((val) => Number.parseInt(val, 10)), + ]) + .pipe(z.number().int().min(0).max(10)); + +// Schema for ratings that the LLM will use +export const ratingsSchema = z + .object({ + accuracy: ratingValueSchema, + completeness: ratingValueSchema, + clarity: ratingValueSchema, + }) + .transform((val) => ({ + accuracy: Number(val.accuracy), + completeness: Number(val.completeness), + clarity: Number(val.clarity), + })); + +export const recommendationsSchema = z.object({ + recommendations: z.array( + z.object({ + type: z.enum(["add", "modify", "merge", "remove"]), + description: z.string(), + suggestion: z.string(), + }), + ), +}); + +// DB schemas +export const insertEvalSchema = createInsertSchema(evals).extend({}).omit({ id: true }); +export const selectEvalSchema = createSelectSchema(evals); + +// Types +export type InsertEval = z.infer; +export type SelectEval = typeof evals.$inferSelect; +export type Rating = z.infer; +export type Recommendation = z.infer; diff --git a/apps/billing/src/lib/db-marketing/schemas/firecrawl.ts b/apps/billing/src/lib/db-marketing/schemas/firecrawl.ts index 4256fd33fc..b6c636a7f8 100644 --- a/apps/billing/src/lib/db-marketing/schemas/firecrawl.ts +++ b/apps/billing/src/lib/db-marketing/schemas/firecrawl.ts @@ -1,4 +1,4 @@ -import { relations } from "drizzle-orm"; +import { relations, sql } from "drizzle-orm"; import { boolean, index, @@ -10,6 +10,9 @@ import { varchar, } from "drizzle-orm/mysql-core"; import { serperOrganicResults } from "./serper"; +import { searchQueries } from "./searchQuery"; +import { createInsertSchema } from "drizzle-zod"; +import type { z } from "zod"; export const firecrawlResponses = mysqlTable( "firecrawl_responses", @@ -27,14 +30,17 @@ export const firecrawlResponses = mysqlTable( ogDescription: varchar("og_description", { length: 767 }), ogUrl: text("og_url"), ogImage: varchar("og_image", { length: 767 }), - xogSiteName: varchar("og_site_name", { length: 767 }), + ogSiteName: varchar("og_site_name", { length: 767 }), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").onUpdateNow(), error: text("error"), + inputTerm: varchar("input_term", { length: 255 }), + summary: text("summary"), }, (table) => ({ sourceUrlIdx: index("source_url_idx").on(table.sourceUrl), uniqueSourceUrl: unique("unique_source_url").on(table.sourceUrl), + inputTermIdx: index("input_term_idx").on(table.inputTerm), }), ); @@ -43,7 +49,14 @@ export const firecrawlResponsesRelations = relations(firecrawlResponses, ({ one fields: [firecrawlResponses.sourceUrl], references: [serperOrganicResults.link], }), + searchQuery: one(searchQueries, { + fields: [firecrawlResponses.inputTerm], + references: [searchQueries.inputTerm], + }), })); +export const insertFirecrawlResponseSchema = createInsertSchema(firecrawlResponses) + .extend({}) + .omit({ id: true }); +export type NewFirecrawlResponse = z.infer; export type FirecrawlResponse = typeof firecrawlResponses.$inferSelect; -export type NewFirecrawlResponse = typeof firecrawlResponses.$inferInsert; diff --git a/apps/billing/src/lib/db-marketing/schemas/index.ts b/apps/billing/src/lib/db-marketing/schemas/index.ts index f6980cf489..5547d63c03 100644 --- a/apps/billing/src/lib/db-marketing/schemas/index.ts +++ b/apps/billing/src/lib/db-marketing/schemas/index.ts @@ -1,4 +1,7 @@ export * from "./serper"; export * from "./searchQuery"; +export * from "./entries"; export * from "./keywords"; export * from "./firecrawl"; +export * from "./sections"; +export * from "./evals"; diff --git a/apps/billing/src/lib/db-marketing/schemas/keywords.ts b/apps/billing/src/lib/db-marketing/schemas/keywords.ts index 21edff3d6f..baa3425b6c 100644 --- a/apps/billing/src/lib/db-marketing/schemas/keywords.ts +++ b/apps/billing/src/lib/db-marketing/schemas/keywords.ts @@ -2,6 +2,9 @@ import { relations } from "drizzle-orm"; import { index, int, mysqlTable, timestamp, unique, varchar } from "drizzle-orm/mysql-core"; import { searchQueries } from "./searchQuery"; import { serperOrganicResults } from "./serper"; +import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import type { z } from "zod"; +import { sectionsToKeywords } from "./sections"; export const keywords = mysqlTable( "keywords", @@ -21,7 +24,12 @@ export const keywords = mysqlTable( }), ); -export const keywordsRelations = relations(keywords, ({ one }) => ({ +export const insertKeywordsSchema = createInsertSchema(keywords).extend({}).omit({ id: true }); +export const selectKeywordsSchema = createSelectSchema(keywords); +export type InsertKeywords = z.infer; +export type SelectKeywords = typeof keywords.$inferSelect; + +export const keywordsRelations = relations(keywords, ({ one, many }) => ({ inputTerm: one(searchQueries, { fields: [keywords.inputTerm], references: [searchQueries.inputTerm], @@ -30,4 +38,5 @@ export const keywordsRelations = relations(keywords, ({ one }) => ({ fields: [keywords.sourceUrl], references: [serperOrganicResults.link], }), + sectionsToKeywords: many(sectionsToKeywords), })); diff --git a/apps/billing/src/lib/db-marketing/schemas/searchQuery.ts b/apps/billing/src/lib/db-marketing/schemas/searchQuery.ts index 29e4fcd08e..1f0e0f2e2f 100644 --- a/apps/billing/src/lib/db-marketing/schemas/searchQuery.ts +++ b/apps/billing/src/lib/db-marketing/schemas/searchQuery.ts @@ -11,6 +11,8 @@ import { import { createInsertSchema } from "drizzle-zod"; import type { z } from "zod"; import { serperSearchResponses } from "./serper"; +import { firecrawlResponses } from "./firecrawl"; +import { entries } from "./entries"; export const searchQueries = mysqlTable( "search_queries", @@ -36,11 +38,16 @@ export type NewSearchQueryParams = z.infer; // every searchQuery can have an optional 1:1 serperResult searchResponses associated with it // because the fk is stored in the serperResult table, the searchQueries relation have neither fields nor references -export const searchQueryRelations = relations(searchQueries, ({ one }) => ({ +export const searchQueryRelations = relations(searchQueries, ({ one, many }) => ({ searchResponses: one(serperSearchResponses, { fields: [searchQueries.inputTerm], references: [serperSearchResponses.inputTerm], }), + firecrawlResponses: many(firecrawlResponses), + entries: one(entries, { + fields: [searchQueries.inputTerm], + references: [entries.inputTerm], + }), })); export type SearchQuery = typeof searchQueries.$inferSelect; diff --git a/apps/billing/src/lib/db-marketing/schemas/sections.ts b/apps/billing/src/lib/db-marketing/schemas/sections.ts new file mode 100644 index 0000000000..2a1f27cdfb --- /dev/null +++ b/apps/billing/src/lib/db-marketing/schemas/sections.ts @@ -0,0 +1,112 @@ +import { + mysqlTable, + varchar, + text, + timestamp, + int, + primaryKey, + mysqlEnum, + index, + unique, +} from "drizzle-orm/mysql-core"; +import { relations } from "drizzle-orm"; +import { createInsertSchema, createSelectSchema } from "drizzle-zod"; +import { keywords } from "./keywords"; +import type { z } from "zod"; +import { entries } from "./entries"; + +export const sections = mysqlTable("sections", { + id: int("id").primaryKey().autoincrement(), + entryId: int("entry_id") + .notNull() + .references(() => entries.id), + heading: varchar("heading", { length: 255 }).notNull(), + description: text("description").notNull(), + order: int("order").notNull(), + markdown: text("markdown"), + createdAt: timestamp("created_at").notNull().defaultNow(), + updatedAt: timestamp("updated_at") + .notNull() + .defaultNow() + .$onUpdate(() => new Date()), +}); + +export const sectionsRelations = relations(sections, ({ one, many }) => ({ + entry: one(entries, { + fields: [sections.entryId], + references: [entries.id], + }), + contentTypes: many(sectionContentTypes), + sectionsToKeywords: many(sectionsToKeywords), +})); + +export const insertSectionSchema = createInsertSchema(sections).extend({}).omit({ id: true }); +export const selectSectionSchema = createSelectSchema(sections); +export type InsertSection = z.infer; +export type SelectSection = typeof sections.$inferSelect; +const contentTypes = [ + "listicle", + "table", + "image", + "code", + "infographic", + "timeline", + "other", + "text", + "video", +] as const; + +export const sectionContentTypes = mysqlTable("section_content_types", { + id: int("id").primaryKey().autoincrement(), + sectionId: int("section_id").notNull(), + type: mysqlEnum("type", contentTypes).notNull(), + description: text("description").notNull(), + whyToUse: text("why_to_use").notNull(), +}); + +export const sectionContentTypesRelations = relations(sectionContentTypes, ({ one }) => ({ + section: one(sections, { + fields: [sectionContentTypes.sectionId], + references: [sections.id], + }), +})); + +export const insertSectionContentTypeSchema = createInsertSchema(sectionContentTypes) + .extend({}) + .omit({ id: true }); +export const selectSectionContentTypeSchema = createSelectSchema(sectionContentTypes); + +export type InsertSectionContentType = z.infer; +export type SelectSectionContentType = typeof sectionContentTypes.$inferSelect; + +export const sectionsToKeywords = mysqlTable( + "sections_to_keywords", + { + sectionId: int("section_id").notNull(), + keywordId: int("keyword_id").notNull(), + createdAt: timestamp("created_at", { mode: "date", fsp: 3 }).$default(() => new Date()), + updatedAt: timestamp("updated_at", { mode: "date", fsp: 3 }) + .$default(() => new Date()) + .$onUpdate(() => new Date()), + }, + (t) => ({ + pk: primaryKey({ columns: [t.sectionId, t.keywordId] }), + }), +); + +export const selectSectionsToKeywordsSchema = createSelectSchema(sectionsToKeywords); +export const insertSectionsToKeywordsSchema = createInsertSchema(sectionsToKeywords).extend({}); + +export type InsertSectionsToKeywords = z.infer; +export type SelectSectionsToKeywords = typeof sectionsToKeywords.$inferSelect; + +export const sectionsToKeywordsRelations = relations(sectionsToKeywords, ({ one }) => ({ + section: one(sections, { + fields: [sectionsToKeywords.sectionId], + references: [sections.id], + }), + keyword: one(keywords, { + fields: [sectionsToKeywords.keywordId], + references: [keywords.id], + }), +})); diff --git a/apps/billing/src/lib/db-marketing/schemas/serper.ts b/apps/billing/src/lib/db-marketing/schemas/serper.ts index 9b99eadeec..3875c4f339 100644 --- a/apps/billing/src/lib/db-marketing/schemas/serper.ts +++ b/apps/billing/src/lib/db-marketing/schemas/serper.ts @@ -3,6 +3,7 @@ import { index, int, json, mysqlTable, text, timestamp, varchar } from "drizzle- import { createSelectSchema } from "drizzle-zod"; import type { z } from "zod"; import { searchQueries } from "./searchQuery"; +import { firecrawlResponses } from "./firecrawl"; // Main SearchResponse table export const serperSearchResponses = mysqlTable( @@ -45,6 +46,7 @@ export const serperOrganicResults = mysqlTable( { id: int("id").primaryKey().autoincrement(), searchResponseId: int("search_response_id").notNull(), + firecrawlResponseId: int("firecrawl_response_id"), title: varchar("title", { length: 255 }).notNull(), link: varchar("link", { length: 767 }).notNull(), snippet: text("snippet").notNull(), @@ -64,6 +66,10 @@ export const serperOrganicResultsRelations = relations(serperOrganicResults, ({ references: [serperSearchResponses.id], }), sitelinks: many(serperSitelinks), + firecrawlResponse: one(firecrawlResponses, { + fields: [serperOrganicResults.link], + references: [firecrawlResponses.sourceUrl], + }), })); export const insertOrganicResultSchema = createSelectSchema(serperOrganicResults).extend({}).omit({ diff --git a/apps/billing/src/lib/firecrawl.ts b/apps/billing/src/lib/firecrawl.ts index 73c15c9d62..4e748be33a 100644 --- a/apps/billing/src/lib/firecrawl.ts +++ b/apps/billing/src/lib/firecrawl.ts @@ -1,54 +1,78 @@ import { db } from "@/lib/db-marketing/client"; -import { firecrawlResponses } from "@/lib/db-marketing/schemas"; +import { + firecrawlResponses, + firecrawlResponses, + keywords, + serperOrganicResults, + serperSearchResponses, +} from "@/lib/db-marketing/schemas"; +import { THREE } from "@/trigger/glossary/keyword-research"; import FirecrawlApp from "@mendable/firecrawl-js"; -import { and, eq, inArray, isNotNull } from "drizzle-orm"; +import { and, desc, eq, inArray, isNotNull, lte, sql } from "drizzle-orm"; +import { getOrCreateSearchResponse } from "./serper"; +import { generateObject, generateText } from "ai"; +import { openai } from "@ai-sdk/openai"; +import { z } from "zod"; +import { keywordResearchSystemPrompt } from "./keywords"; +import type { CacheStrategy } from "@/trigger/glossary/_generate-glossary-entry"; const firecrawl = new FirecrawlApp({ apiKey: process.env.FIRECRAWL_API_KEY!, }); -export async function getTopResultsContent(args: { urls: string[] }) { - // Check for existing responses with markdown content - const existingResponses = await db.query.firecrawlResponses.findMany({ - where: and( - inArray(firecrawlResponses.sourceUrl, args.urls), - isNotNull(firecrawlResponses.markdown), - ), +/** + * Gets or creates a firecrawl response for a given URL. + * First checks if we already have the content, if not scrapes it. + */ +export async function getOrCreateFirecrawlResponse(args: { + url: string; + connectTo: { term: string }; +}) { + // 1. Check if we already have this URL + const existing = await db.query.firecrawlResponses.findFirst({ + where: eq(firecrawlResponses.sourceUrl, args.url), }); + if (existing?.markdown) { + return existing; + } - const existingUrlSet = new Set(existingResponses.map((r) => r.sourceUrl)); - const urlsToScrape = args.urls.filter((url) => !existingUrlSet.has(url)); - - // Scrape new URLs - const newResponses = await Promise.all(urlsToScrape.map(scrapeAndStoreUrl)); // Combine existing and new responses - return [...existingResponses, ...newResponses]; -} -async function scrapeAndStoreUrl(url: string) { + // 2. If not, scrape the URL try { - const firecrawlResult = await firecrawl.scrapeUrl(url, { formats: ["markdown"] }); + const firecrawlResult = await firecrawl.scrapeUrl(args.url, { formats: ["markdown"] }); + // 3. Handle scraping failure if (!firecrawlResult.success) { - console.error(`Firecrawl error for URL ${url}:`, firecrawlResult.error); - // store the error in the database - const [errorResponse] = await db + const [response] = await db .insert(firecrawlResponses) .values({ - sourceUrl: url, + sourceUrl: args.url, error: firecrawlResult.error || "Unknown error occurred", success: false, }) + .onDuplicateKeyUpdate({ + set: { + error: firecrawlResult.error || "Unknown error occurred", + success: false, + updatedAt: new Date(), + }, + }) .$returningId(); + + console.warn( + `Gracefully continuing after: ⚠️ Failed to scrape URL ${args.url}: ${firecrawlResult.error}. Stored run in DB with id '${response.id}'`, + ); return await db.query.firecrawlResponses.findFirst({ - where: eq(firecrawlResponses.id, errorResponse.id), + where: eq(firecrawlResponses.sourceUrl, args.url), }); } - const [insertedResponse] = await db + // 4. Store successful result + await db .insert(firecrawlResponses) .values({ success: firecrawlResult.success, markdown: firecrawlResult.markdown ?? null, - sourceUrl: firecrawlResult.metadata?.sourceURL || url, + sourceUrl: firecrawlResult.metadata?.sourceURL || args.url, scrapeId: firecrawlResult.metadata?.scrapeId || "", title: firecrawlResult.metadata?.title || "", description: firecrawlResult.metadata?.description || "", @@ -59,40 +83,113 @@ async function scrapeAndStoreUrl(url: string) { ogImage: firecrawlResult.metadata?.ogImage || "", ogSiteName: firecrawlResult.metadata?.ogSiteName || "", error: null, + inputTerm: args.connectTo.term || "", }) - .$returningId(); + .onDuplicateKeyUpdate({ + set: { + markdown: firecrawlResult.markdown ?? null, + updatedAt: new Date(), + }, + }); return await db.query.firecrawlResponses.findFirst({ - where: eq(firecrawlResponses.id, insertedResponse.id), + where: eq(firecrawlResponses.sourceUrl, args.url), }); } catch (error) { - console.error(`Error scraping URL ${url}:`, error); - const [errorResponse] = await db + // 5. Handle unexpected errors + console.error(`Error processing URL ${args.url}:`, error); + + // Store the error and return the response + await db .insert(firecrawlResponses) .values({ - sourceUrl: url, + sourceUrl: args.url, error: error instanceof Error ? error.message : String(error), success: false, }) - .$returningId(); + .onDuplicateKeyUpdate({ + set: { + error: error instanceof Error ? error.message : String(error), + success: false, + updatedAt: new Date(), + }, + }); + return await db.query.firecrawlResponses.findFirst({ - where: eq(firecrawlResponses.id, errorResponse.id), + where: eq(firecrawlResponses.sourceUrl, args.url), }); } } -export async function getScrapedContentMany(urls: string[]) { - // Check which URLs we already have responses for - const existingResponses = await db.query.firecrawlResponses.findMany({ - where: inArray(firecrawlResponses.sourceUrl, urls), +export async function getOrCreateSummary({ + url, + connectTo, + onCacheHit = "stale" as CacheStrategy, +}: { + url: string; + connectTo: { term: string }; + onCacheHit?: CacheStrategy; +}) { + // 1. Check if we already have a summary for this URL + const existing = await db.query.firecrawlResponses.findFirst({ + where: eq(firecrawlResponses.sourceUrl, url), + }); + + if (existing?.summary && onCacheHit === "stale") { + return existing; + } + + // 2. Get the firecrawl response (which includes the markdown) + const firecrawlResponse = await getOrCreateFirecrawlResponse({ + url, + connectTo, + }); + + if (!firecrawlResponse?.markdown) { + console.warn(`No markdown content found for URL ${url}`); + return firecrawlResponse; + } + + // 3. Get the position from serper results + const serperResult = await db.query.serperOrganicResults.findFirst({ + where: eq(serperOrganicResults.link, url), + columns: { position: true }, }); - const existingUrls = new Set(existingResponses.map((r) => r.sourceUrl)); - const urlsToScrape = urls.filter((url) => !existingUrls.has(url)); + // 4. Generate the summary + const system = `You are the **Chief Technology Officer (CTO)** of a leading API Development Tools Company with extensive experience in API development using programming languages such as Go, TypeScript, and Elixir and other backend languages. You have a PhD in computer science from MIT. Your expertise ensures that the content you summarize is technically accurate, relevant, and aligned with best practices in API development and computer science. - // Scrape the URLs that we don't have responses for - const newResults = await Promise.all(urlsToScrape.map(scrapeAndStoreUrl)); +**Your Task:** +Accurately and concisely summarize the content from the page that ranks #${ + serperResult?.position ?? "unknown" + } for the term "${connectTo.term}". Focus on technical details, including how the content is presented (e.g., text, images, tables). Ensure factual correctness and relevance to API development. - // Combine existing and new results - return [...existingResponses, ...newResults]; +**Instructions:** +- Provide a clear and concise summary of the content. +- Highlight key technical aspects and insights related to API development. +- Mention the types of content included, such as images, tables, code snippets, etc. +- Cite the term the content is ranking for and its position in the SERP.`; + + const prompt = `Summarize the following content for the term "${connectTo.term}" that's ranking #${serperResult?.position ?? "unknown"}: +======= +${firecrawlResponse.markdown} +=======`; + + const summaryCompletion = await generateText({ + model: openai("gpt-4o-mini"), + system, + prompt, + maxTokens: 500, + }); + + // 5. Store the summary in the database + await db + .update(firecrawlResponses) + .set({ summary: summaryCompletion.text }) + .where(eq(firecrawlResponses.id, firecrawlResponse.id)); + + // 6. Return the updated response + return await db.query.firecrawlResponses.findFirst({ + where: eq(firecrawlResponses.id, firecrawlResponse.id), + }); } diff --git a/apps/billing/src/lib/keywords.ts b/apps/billing/src/lib/keywords.ts new file mode 100644 index 0000000000..0dbc2b314b --- /dev/null +++ b/apps/billing/src/lib/keywords.ts @@ -0,0 +1,180 @@ +import { sql } from "drizzle-orm"; +import { and } from "drizzle-orm"; +import { inArray } from "drizzle-orm"; +import { eq } from "drizzle-orm"; +import { db } from "./db-marketing/client"; +import { firecrawlResponses, keywords, serperSearchResponses } from "./db-marketing/schemas"; +import { z } from "zod"; +import { openai } from "@ai-sdk/openai"; +import { generateObject } from "ai"; + +export const keywordResearchSystemPrompt = ` +You are an SEO Expert & Content Writer specializing in creating technical content for Developer Tools that are highly SEO optimized. + +**Your Objectives:** +1. **Keyword Extraction:** + - Extract relevant keywords from the titles of top-ranking organic search results. + - Focus on technical and context-specific terms related to API development. + +2. **Quality Assurance:** + - **Remove Stopwords:** Ensure that keywords do not include common stopwords (e.g., "for," "and," "the," "of," etc.). + - **Remove Brand Names:** Ensure that keywords do not include brand names (e.g., "GitHub", "YouTube", "npm", etc.). + - **Remove README keywords:** Ensure to exclude from instructive headers or titles (e.g., "getting started", "installation", etc.) of readmes. + +**Guidelines:** +- Prioritize keywords that directly relate to the main term and its subtopics. +- Maintain a focus on terms that potential users or developers are likely to search for in the context of API development. +- Branded keywords should be included in the keywordsWithBrandNames and not in the keywords. +`; + +export async function getOrCreateKeywordsFromTitles(args: { term: string }) { + const { term } = args; + const existing = await db.query.keywords.findMany({ + where: and(eq(keywords.inputTerm, term)), + }); + if (existing.length > 0) { + return existing; + } + + const searchResponse = await db.query.serperSearchResponses.findFirst({ + where: eq(serperSearchResponses.inputTerm, term), + with: { + serperOrganicResults: true, + }, + }); + if (!searchResponse) { + throw new Error( + `Error attempting to get keywords from firecrawl results: No search response found for term ${term}`, + ); + } + + const promptTitles = `Below is a list of titles separated by semicolons (';') from the top organic search results currently ranking for the term '${term}'. + Given that some pages might be SEO optimized, there's a chance that we can extract keywords from the page titles. + Create a list of keywords that are directly related to the main term and its subtopics form the titles of the pages. + + Given that some title contain the brand of the website (e.g. github, youtube, etc.) OR the section of the website (e.g. blog, docs, etc.), ensure to not treat them as keywords. + + ========== + ${searchResponse.serperOrganicResults + .map( + (result) => + `The title for the sourceUrl "${result.link}" (reference this url as the sourceUrl for the keyword) is: "${result.title}"`, + ) + .join(";")} + ========== + `; + // extract keywords from the title of the organic results + const keywordsFromTitles = await generateObject({ + model: openai("gpt-4o-mini"), + system: keywordResearchSystemPrompt, + prompt: promptTitles, + schema: z.object({ + keywords: z.array(z.object({ keyword: z.string(), sourceUrl: z.string().url() })), + keywordsWithBrandNames: z.array( + z.object({ keyword: z.string(), sourceUrl: z.string().url() }), + ), + }), + }); + + // NB: drizzle doesn't support returning ids in conjunction with handling duplicates, so we get them afterwards + await db + .insert(keywords) + .values( + keywordsFromTitles.object.keywords.map((keyword) => ({ + inputTerm: term, + keyword: keyword.keyword.toLowerCase(), + sourceUrl: keyword.sourceUrl, + source: "titles", + })), + ) + .onDuplicateKeyUpdate({ + set: { + updatedAt: sql`now()`, + }, + }); + + return db.query.keywords.findMany({ + where: and( + eq(keywords.inputTerm, term), + eq(keywords.source, "titles"), + inArray( + keywords.keyword, + keywordsFromTitles.object.keywords.map((k) => k.keyword.toLowerCase()), + ), + ), + }); +} + +export async function getOrCreateKeywordsFromHeaders(args: { term: string }) { + const { term } = args; + const existing = await db.query.keywords.findMany({ + where: and(eq(keywords.inputTerm, term), eq(keywords.source, "headers")), + }); + if (existing.length > 0) { + return existing; + } + + const firecrawlResults = await db.query.firecrawlResponses.findMany({ + where: eq(firecrawlResponses.inputTerm, term), + }); + + const context = firecrawlResults + .map((firecrawlResponse) => { + if (!firecrawlResponse.markdown || !firecrawlResponse.sourceUrl) { + return ""; + } + return ` + ========== + The headers for the organic result "${firecrawlResponse.sourceUrl}" (ensure you're referencing this url as the sourceUrl for the keyword) are: + ${firecrawlResponse.markdown?.match(/^##\s+(.*)$/gm)?.join("\n")} + ========== + `; + }) + .join(";"); + + const promptHeaders = `Below is a list of h1 headers, separated by semicolons (';'), from the top organic search results currently ranking for the term '${term}'. Given that some pages might be SEO optimized, there's a chance that we can extract keywords from them. + Create a list of keywords that are directly related to the main term and its subtopics form the h1 headers of the pages. + + ========== + ${context} + ========== + `; + const keywordsFromHeaders = await generateObject({ + model: openai("gpt-4o-mini"), + system: keywordResearchSystemPrompt, + prompt: promptHeaders, + schema: z.object({ + keywords: z.array(z.object({ keyword: z.string(), sourceUrl: z.string().url() })), + keywordsWithBrandNames: z.array( + z.object({ keyword: z.string(), sourceUrl: z.string().url() }), + ), + }), + }); + + // NB: drizzle doesn't support returning ids in conjunction with handling duplicates, so we get them afterwards + await db + .insert(keywords) + .values( + keywordsFromHeaders.object.keywords.map((keyword) => ({ + inputTerm: term, + keyword: keyword.keyword.toLowerCase(), + sourceUrl: keyword.sourceUrl, + source: "headers", + })), + ) + .onDuplicateKeyUpdate({ + set: { + updatedAt: sql`now()`, + }, + }); + return db.query.keywords.findMany({ + where: and( + eq(keywords.inputTerm, term), + eq(keywords.source, "headers"), + inArray( + keywords.keyword, + keywordsFromHeaders.object.keywords.map((k) => k.keyword.toLowerCase()), + ), + ), + }); +} diff --git a/apps/billing/src/lib/search-query.ts b/apps/billing/src/lib/search-query.ts index f374fad152..76c5e1a811 100644 --- a/apps/billing/src/lib/search-query.ts +++ b/apps/billing/src/lib/search-query.ts @@ -3,7 +3,7 @@ import { openai } from "@ai-sdk/openai"; import { generateObject } from "ai"; import { eq, sql } from "drizzle-orm"; -import { insertSearchQuerySchema, searchQueries } from "@/lib/db-marketing/schemas"; +import { insertSearchQuerySchema, searchQueries, entries } from "@/lib/db-marketing/schemas"; export async function getOrCreateSearchQuery(args: { term: string }) { const { term } = args; @@ -13,12 +13,25 @@ export async function getOrCreateSearchQuery(args: { term: string }) { }); if (existingQuery) { + // Ensure entry exists even for existing query + await db + .insert(entries) + .values({ + inputTerm: term, + }) + .onDuplicateKeyUpdate({ + set: { + updatedAt: sql`now()`, + }, + }); return existingQuery; } // Generate new search query + // NOTE: THE PROMPTING HERE REQUIRES SOME IMPROVEMENTS (ADD EVALS) -- FOR API RATE LIMITING IT GENERAATED: + // "API Rate Limiting best practices and implementation", which is not the best keyword to search for. const generatedQuery = await generateObject({ - model: openai("gpt-4o"), + model: openai("gpt-4o-mini"), system: `You are a Senior Content Writer who specialises in writing technical content for Developer Tools that are SEO optimized. For every term, you conduct a search on Google to gather the data you need. You're goal is to create a search query that will return a SERP with the most relevant information for the term. @@ -32,20 +45,36 @@ Keep the search query as short and as simple as possible, don't use quotes aroun `, prompt: `Create the search query for the term "${term}."`, - schema: insertSearchQuerySchema, + schema: insertSearchQuerySchema.omit({ createdAt: true, updatedAt: true }), + }); + + // Create both search query and entry in a transaction + await db.transaction(async (tx) => { + // Insert search query + await tx + .insert(searchQueries) + .values({ + ...generatedQuery.object, + }) + .onDuplicateKeyUpdate({ + set: { + updatedAt: sql`now()`, + }, + }); + + // Insert entry + await tx + .insert(entries) + .values({ + inputTerm: term, + }) + .onDuplicateKeyUpdate({ + set: { + updatedAt: sql`now()`, + }, + }); }); - // NB: drizzle doesn't support returning ids in conjunction with handling duplicates, so we get them afterwards - await db - .insert(searchQueries) - .values({ - ...generatedQuery.object, - }) - .onDuplicateKeyUpdate({ - set: { - updatedAt: sql`now()`, - }, - }); const insertedQuery = await db.query.searchQueries.findFirst({ where: eq(searchQueries.inputTerm, generatedQuery.object.inputTerm), }); diff --git a/apps/billing/src/trigger.instructions.txt b/apps/billing/src/trigger.instructions.txt new file mode 100644 index 0000000000..6351267f04 --- /dev/null +++ b/apps/billing/src/trigger.instructions.txt @@ -0,0 +1,318 @@ +When being tasked to write a new trigger task, refer as context to the `apps/billing/src/trigger` directory. + +Speficically, tasks are defined inside the `src/trigger` directory. + +We're using version 3 of the trigger.dev SDK, refer to their overview on how to use it: +--- +title: "Tasks: Overview" +sidebarTitle: "Overview" +description: "Tasks are functions that can run for a long time and provide strong resilience to failure." +--- + +There are different types of tasks including regular tasks and [scheduled tasks](/tasks/scheduled). + +## Hello world task and how to trigger it + +Here's an incredibly simple task: + +```ts /trigger/hello-world.ts +import { task } from "@trigger.dev/sdk/v3"; + +//1. You need to export each task +export const helloWorld = task({ + //2. Use a unique id for each task + id: "hello-world", + //3. The run function is the main function of the task + run: async (payload: { message: string }) => { + //4. You can write code that runs for a long time here, there are no timeouts + console.log(payload.message); + }, +}); +``` + +You can trigger this in two ways: + +1. From the dashboard [using the "Test" feature](/run-tests). +2. Trigger it from your backend code. See the [full triggering guide here](/triggering). + +Here's how to trigger a single run from elsewhere in your code: + +```ts Your backend code +import { helloWorldTask } from "./trigger/hello-world"; + +async function triggerHelloWorld() { + //This triggers the task and returns a handle + const handle = await helloWorld.trigger({ message: "Hello world!" }); + + //You can use the handle to check the status of the task, cancel and retry it. + console.log("Task is running with handle", handle.id); +} +``` + +You can also [trigger a task from another task](/triggering), and wait for the result. + +## Defining a `task` + +The task function takes an object with the following fields. + +### The `id` field + +This is used to identify your task so it can be triggered, managed, and you can view runs in the dashboard. This must be unique in your project – we recommend making it descriptive and unique. + +### The `run` function + +Your custom code inside `run()` will be executed when your task is triggered. It’s an async function that has two arguments: + +1. The run payload - the data that you pass to the task when you trigger it. +2. An object with `ctx` about the run (Context), and any output from the optional `init` function that runs before every run attempt. + +Anything you return from the `run` function will be the result of the task. Data you return must be JSON serializable: strings, numbers, booleans, arrays, objects, and null. + +### `retry` options + +A task is retried if an error is thrown, by default we retry 3 times. + +You can set the number of retries and the delay between retries in the `retry` field: + +```ts /trigger/retry.ts +export const taskWithRetries = task({ + id: "task-with-retries", + retry: { + maxAttempts: 10, + factor: 1.8, + minTimeoutInMs: 500, + maxTimeoutInMs: 30_000, + randomize: false, + }, + run: async (payload: any, { ctx }) => { + //... + }, +}); +``` + +For more information read [the retrying guide](/errors-retrying). + +It's also worth mentioning that you can [retry a block of code](/errors-retrying) inside your tasks as well. + +### `queue` options + +Queues allow you to control the concurrency of your tasks. This allows you to have one-at-a-time execution and parallel executions. There are also more advanced techniques like having different concurrencies for different sets of your users. For more information read [the concurrency & queues guide](/queue-concurrency). + +```ts /trigger/one-at-a-time.ts +export const oneAtATime = task({ + id: "one-at-a-time", + queue: { + concurrencyLimit: 1, + }, + run: async (payload: any, { ctx }) => { + //... + }, +}); +``` + +### `machine` options + +Some tasks require more vCPUs or GBs of RAM. You can specify these requirements in the `machine` field. For more information read [the machines guide](/machines). + +```ts /trigger/heavy-task.ts +export const heavyTask = task({ + id: "heavy-task", + machine: { + preset: "large-1x", // 4 vCPU, 8 GB RAM + }, + run: async (payload: any, { ctx }) => { + //... + }, +}); +``` + +### `maxDuration` option + +By default tasks can execute indefinitely, which can be great! But you also might want to set a `maxDuration` to prevent a task from running too long. You can set the `maxDuration` on a task, and all runs of that task will be stopped if they exceed the duration. + +```ts /trigger/long-task.ts +export const longTask = task({ + id: "long-task", + maxDuration: 300, // 300 seconds or 5 minutes + run: async (payload: any, { ctx }) => { + //... + }, +}); +``` + +See our [maxDuration guide](/runs/max-duration) for more information. + +## Lifecycle functions + +![Lifecycle functions](/images/lifecycle-functions.png) + +### `init` function + +This function is called before a run attempt: + +```ts /trigger/init.ts +export const taskWithInit = task({ + id: "task-with-init", + init: async (payload, { ctx }) => { + //... + }, + run: async (payload: any, { ctx }) => { + //... + }, +}); +``` + +You can also return data from the `init` function that will be available in the params of the `run`, `cleanup`, `onSuccess`, and `onFailure` functions. + +```ts /trigger/init-return.ts +export const taskWithInitReturn = task({ + id: "task-with-init-return", + init: async (payload, { ctx }) => { + return { someData: "someValue" }; + }, + run: async (payload: any, { ctx, init }) => { + console.log(init.someData); // "someValue" + }, +}); +``` + +Errors thrown in the `init` function are ignored. + +### `cleanup` function + +This function is called after the `run` function is executed, regardless of whether the run was successful or not. It's useful for cleaning up resources, logging, or other side effects. + +```ts /trigger/cleanup.ts +export const taskWithCleanup = task({ + id: "task-with-cleanup", + cleanup: async (payload, { ctx }) => { + //... + }, + run: async (payload: any, { ctx }) => { + //... + }, +}); +``` + +Errors thrown in the `cleanup` function will fail the attempt. + +### `middleware` function + +This function is called before the `run` function, it allows you to wrap the run function with custom code. + + + An error thrown in `middleware` is just like an uncaught error in the run function: it will + propagate through to `handleError()` and then will fail the attempt (causing a retry). + + +### `onStart` function + +When a task run starts, the `onStart` function is called. It's useful for sending notifications, logging, and other side effects. This function will only be called one per run (not per retry). If you want to run code before each retry, use the `init` function. + +```ts /trigger/on-start.ts +export const taskWithOnStart = task({ + id: "task-with-on-start", + onStart: async (payload, { ctx }) => { + //... + }, + run: async (payload: any, { ctx }) => { + //... + }, +}); +``` + +You can also define an `onStart` function in your `trigger.config.ts` file to get notified when any task starts. + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + project: "proj_1234", + onStart: async (payload, { ctx }) => { + console.log("Task started", ctx.task.id); + }, +}); +``` + +Errors thrown in the `onStart` function are ignored. + +### `onSuccess` function + +When a task run succeeds, the `onSuccess` function is called. It's useful for sending notifications, logging, syncing state to your database, or other side effects. + +```ts /trigger/on-success.ts +export const taskWithOnSuccess = task({ + id: "task-with-on-success", + onSuccess: async (payload, output, { ctx }) => { + //... + }, + run: async (payload: any, { ctx }) => { + //... + }, +}); +``` + +You can also define an `onSuccess` function in your `trigger.config.ts` file to get notified when any task succeeds. + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + project: "proj_1234", + onSuccess: async (payload, output, { ctx }) => { + console.log("Task succeeded", ctx.task.id); + }, +}); +``` + +Errors thrown in the `onSuccess` function are ignored. + +### `onFailure` function + +When a task run fails, the `onFailure` function is called. It's useful for sending notifications, logging, or other side effects. It will only be executed once the task run has exhausted all its retries. + +```ts /trigger/on-failure.ts +export const taskWithOnFailure = task({ + id: "task-with-on-failure", + onFailure: async (payload, error, { ctx }) => { + //... + }, + run: async (payload: any, { ctx }) => { + //... + }, +}); +``` + +You can also define an `onFailure` function in your `trigger.config.ts` file to get notified when any task fails. + +```ts trigger.config.ts +import { defineConfig } from "@trigger.dev/sdk/v3"; + +export default defineConfig({ + project: "proj_1234", + onFailure: async (payload, error, { ctx }) => { + console.log("Task failed", ctx.task.id); + }, +}); +``` + +Errors thrown in the `onFailure` function are ignored. + +### `handleError` functions + +You can define a function that will be called when an error is thrown in the `run` function, that allows you to control how the error is handled and whether the task should be retried. + +Read more about `handleError` in our [Errors and Retrying guide](/errors-retrying). + +Uncaught errors will throw a special internal error of the type `HANDLE_ERROR_ERROR`. + +## Next steps + + + + Learn how to trigger your tasks from your code. + + + Tasks are the core of Trigger.dev. Learn how to write them. + + \ No newline at end of file diff --git a/apps/billing/src/trigger/glossary/_generate-glossary-entry.ts b/apps/billing/src/trigger/glossary/_generate-glossary-entry.ts new file mode 100644 index 0000000000..9c9a6d88f1 --- /dev/null +++ b/apps/billing/src/trigger/glossary/_generate-glossary-entry.ts @@ -0,0 +1,131 @@ +import { task } from "@trigger.dev/sdk/v3"; +import { keywordResearchTask } from "./keyword-research"; +import { generateOutlineTask } from "./generate-outline"; +import { draftSectionsTask } from "./draft-sections"; +import { seoMetaTagsTask } from "./seo-meta-tags"; +import { createPrTask } from "./create-pr"; +import { AbortTaskRunError } from "@trigger.dev/sdk/v3"; +import { db } from "@/lib/db-marketing/client"; +import { eq } from "drizzle-orm"; +import { entries } from "@/lib/db-marketing/schemas"; + +export type CacheStrategy = "revalidate" | "stale"; +/** + * This task generates a glossary entry for a given term. It's the main entry point of the glossary generation process. + * + * NB: I prefixed the filename with `_` to pin it to the top of the folder as trigger doesn't have any file-conventions. + * + * This workflow runs multiple steps sequentially: + * 1. Keyword Research + * 2. Generate Outline + * 3. Draft Sections + * 4. Generate SEO Meta Tags + * 5. Create PR + * + * Each workflow step generates output that's stored in the database (with the exception of create PR, which stores the MDX output in the GitHub repository). + * The default behaviour of every task is to always return a cached output if available. + * This behaviour can be overridden by setting the `onCacheHit` parameter to `revalidate` (it'll get passed down to all tasks). + * + * Sub-tasks may (in fact most of them do) rely on undeterministic execution when they use LLMs. As a result, the maxAttempts for a subtask is 5. + * The downside here is that this increases the runtime of the workflow considerably. Ways to mititage this are cited in the `todo` comment inside @file ./generate-outline.ts. + * + * The workflow is idempotent. If it's aborted, it can be safely restarted to allow for event replays in the trigger console. + */ +export const generateGlossaryEntryTask = task({ + id: "generate_glossary_entry", + retry: { + maxAttempts: 0, + }, + run: async ({ + term, + onCacheHit = "stale" as CacheStrategy, + }: { term: string; onCacheHit?: CacheStrategy }) => { + console.info(`-- Starting glossary entry generation for term: ${term} --`); + + const existing = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, term), + columns: { + id: true, + inputTerm: true, + dynamicSectionsContent: true, + metaTitle: true, + metaDescription: true, + githubPrUrl: true, + }, + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + if ( + existing?.dynamicSectionsContent && + existing?.metaTitle && + existing?.metaDescription && + existing?.githubPrUrl && + onCacheHit === "stale" + ) { + return { + term, + entry: existing, + }; + } + + // Step 1: Keyword Research + console.info("1/5 - Starting keyword research..."); + const keywordResearch = await keywordResearchTask.triggerAndWait({ term, onCacheHit }); + if (!keywordResearch.ok) { + throw new AbortTaskRunError(`Keyword research failed for term: ${term}`); + } + console.info( + `✓ Keyword research completed with ${keywordResearch.output.keywords.length} keywords`, + ); + + // Step 2: Generate Outline + console.info("2/5 - Generating outline..."); + const outline = await generateOutlineTask.triggerAndWait({ term, onCacheHit }); + if (!outline.ok) { + throw new AbortTaskRunError(`Outline generation failed for term: ${term}`); + } + console.info("✓ Outline generated"); + + // Step 3: Draft Sections + console.info("3/5 - Drafting sections..."); + const draftSections = await draftSectionsTask.triggerAndWait({ term, onCacheHit }); + if (!draftSections.ok) { + throw new AbortTaskRunError(`Section drafting failed for term: ${term}`); + } + console.info("✓ All sections drafted"); + + // Step 4: Generate SEO Meta Tags + console.info("4/5 - Generating SEO meta tags..."); + const seoMetaTags = await seoMetaTagsTask.triggerAndWait({ term, onCacheHit }); + if (!seoMetaTags.ok) { + throw new AbortTaskRunError(`SEO meta tags generation failed for term: ${term}`); + } + console.info("✓ SEO meta tags generated"); + + // Step 5: Create PR + console.info("5/5 - Creating PR..."); + const pr = await createPrTask.triggerAndWait({ input: term, onCacheHit }); + if (!pr.ok) { + throw new AbortTaskRunError(`PR creation failed for term: ${term}`); + } + + if (!pr.output.entry?.id) { + // this if statement is here to make TypeScript happy + throw new AbortTaskRunError(`PR creation failed for term: ${term}`); + } + console.info(`✓ PR created: ${pr.output.entry?.githubPrUrl}`); + + const generated = await db.query.entries.findFirst({ + where: eq(entries.id, pr.output.entry?.id), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + return { + term, + keywordCount: keywordResearch.output.keywords.length, + sectionCount: outline?.output?.dynamicSections.length, + seoMetaTags: seoMetaTags.output, + entry: generated, + }; + }, +}); diff --git a/apps/billing/src/trigger/glossary/create-pr.ts b/apps/billing/src/trigger/glossary/create-pr.ts new file mode 100644 index 0000000000..932349f8b9 --- /dev/null +++ b/apps/billing/src/trigger/glossary/create-pr.ts @@ -0,0 +1,152 @@ +import { AbortTaskRunError, task } from "@trigger.dev/sdk/v3"; +import { Octokit } from "@octokit/rest"; +import { db } from "@/lib/db-marketing/client"; +import { entries } from "@/lib/db-marketing/schemas"; +import { eq } from "drizzle-orm"; +import type { CacheStrategy } from "./_generate-glossary-entry"; + +export const createPrTask = task({ + id: "create_pr", + retry: { + maxAttempts: 0, + }, + run: async ({ + input, + onCacheHit = "stale" as CacheStrategy, + }: { input: string; onCacheHit?: CacheStrategy }) => { + // Add check for existing PR URL + const existing = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, input), + columns: { + id: true, + inputTerm: true, + githubPrUrl: true, + }, + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + if (existing?.githubPrUrl && onCacheHit === "stale") { + return { + entry: existing, + message: `Found existing PR for ${input}.mdx`, + }; + } + + // ==== 1. Prepare MDX file ==== + const entry = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, input), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + if (!entry?.dynamicSectionsContent) { + throw new AbortTaskRunError( + `Unable to create PR: The markdown content for the dynamic sections are not available for the entry to term: ${input}. It's likely that draft-sections.ts didn't run as expected .`, + ); + } + // add meta tags to content in .mdx format + const frontmatter = `--- + title: "${entry.metaTitle}" + description: "${entry.metaDescription}" + --- + `; + const mdxContent = frontmatter + entry.dynamicSectionsContent; + const blob = new Blob([mdxContent], { type: "text/markdown" }); + + // Create a File object from the Blob + const file = new File([blob], `${input.replace(/\s+/g, "-").toLowerCase()}.mdx`, { + type: "text/markdown", + }); + console.info("1. MDX file created"); + + // ==== 2. Handle GitHub: create branch, file content & PR ==== + + console.info(`2. ⏳ Creating PR for entry to term: "${input}"`); + const octokit = new Octokit({ + auth: process.env.GITHUB_PERSONAL_ACCESS_TOKEN, + }); + + const owner = "p6l-richard"; + const repo = "unkey"; + const branch = `richard/add-${input.replace(/\s+/g, "-").toLowerCase()}`; + const path = `apps/www/content/${input.replace(/\s+/g, "-").toLowerCase()}.mdx`; + + // Create a new branch + const mainRef = await octokit.git.getRef({ + owner, + repo, + ref: "heads/main", + }); + + console.info(`2.1 'main' branch found. Should branch off of: ${mainRef.data.object.sha}`); + + console.info("2.2 Handling possible duplicate branches"); + const branchExists = await octokit.git + .listMatchingRefs({ + owner, + repo, + ref: `heads/${branch}`, + }) + .then((response) => response.data.length > 0); + + if (branchExists) { + console.info("2.2.1 ⚠️ Duplicate branch found, deleting it"); + await octokit.git.deleteRef({ + owner, + repo, + ref: `heads/${branch}`, + }); + console.info("2.2.2 ⌫ Branch deleted"); + } + + console.info("2.4 🛣️ Creating the new branch"); + await octokit.git.createRef({ + owner, + repo, + ref: `refs/heads/${branch}`, + sha: mainRef.data.object.sha, + }); + + // Commit the MDX file to the new branch + console.info(`2.5 📦 Committing the MDX file to the new branch "${branch}"`); + await octokit.repos.createOrUpdateFileContents({ + owner, + repo, + path, + message: `feat(glossary): Add ${input}.mdx to glossary`, + content: Buffer.from(await file.arrayBuffer()).toString("base64"), + branch, + }); + + console.info("2.6 📝 Creating the pull request"); + // Create a pull request + const pr = await octokit.pulls.create({ + owner, + repo, + title: `Add ${input} to API documentation`, + head: branch, + base: "main", + body: `This PR adds the ${input}.mdx file to the API documentation.`, + }); + + console.info("2.7 💽 PR created. Storing the URL..."); + // Update the entry in the database with the PR URL + await db + .update(entries) + .set({ githubPrUrl: pr.data.html_url }) + .where(eq(entries.inputTerm, input)); + + const updated = await db.query.entries.findFirst({ + columns: { + id: true, + inputTerm: true, + githubPrUrl: true, + }, + where: eq(entries.inputTerm, input), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + return { + entry: updated, + message: `feat(glossary): Add ${input}.mdx to glossary`, + }; + }, +}); diff --git a/apps/billing/src/trigger/glossary/draft-sections.ts b/apps/billing/src/trigger/glossary/draft-sections.ts new file mode 100644 index 0000000000..3c281310f6 --- /dev/null +++ b/apps/billing/src/trigger/glossary/draft-sections.ts @@ -0,0 +1,230 @@ +import { db } from "@/lib/db-marketing/client"; +import { + type sectionContentTypes, + entries, + firecrawlResponses, + type keywords, + type sections, + type sectionsToKeywords, + type SelectEntry, +} from "@/lib/db-marketing/schemas"; +import { openai } from "@ai-sdk/openai"; +import { AbortTaskRunError, task } from "@trigger.dev/sdk/v3"; +import { generateText } from "ai"; +import { eq } from "drizzle-orm"; +import type { CacheStrategy } from "./_generate-glossary-entry"; + +export const draftSectionsTask = task({ + id: "draft_sections", + retry: { + maxAttempts: 3, + }, + run: async ({ + term, + onCacheHit = "stale" as CacheStrategy, + }: { term: string; onCacheHit?: CacheStrategy }) => { + const existing = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, term), + columns: { + id: true, + inputTerm: true, + dynamicSectionsContent: true, + }, + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + if (existing?.dynamicSectionsContent && onCacheHit === "stale") { + return existing; + } + + const entry = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, term), + with: { + dynamicSections: { + with: { + contentTypes: true, + sectionsToKeywords: { + with: { + keyword: true, + }, + }, + }, + }, + }, + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + if (!entry) { + throw new AbortTaskRunError(`Entry not found for term: ${term}`); + } + + const entryWithMarkdownEnsured = { + ...entry, + dynamicSections: entry.dynamicSections.slice(0, 6), + }; + + const draftedContent = await draftSections({ term, entry: entryWithMarkdownEnsured }); + console.info(`Drafted dynamic sections for ${entry.inputTerm}: ${draftedContent}`); + + const reviewedContent = await reviewContent({ term, content: draftedContent }); + console.info(`Reviewed dynamic sections for ${entry.inputTerm}: ${reviewedContent}`); + + const optimizedContent = await seoOptimizeContent({ + term: entry.inputTerm, + content: reviewedContent, + keywords: entry.dynamicSections.flatMap((ds) => + ds.sectionsToKeywords.map((stk) => stk.keyword.keyword), + ), + }); + console.info(`Optimized dynamic sections for ${entry.inputTerm}: ${optimizedContent}`); + + const [inserted] = await db + .insert(entries) + .values({ + inputTerm: entry.inputTerm, + dynamicSectionsContent: optimizedContent, + }) + .$returningId(); + return db.query.entries.findFirst({ + columns: { + id: true, + inputTerm: true, + dynamicSectionsContent: true, + }, + where: eq(entries.id, inserted.id), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + }, +}); + +async function draftSections({ + term, + entry, +}: { + term: string; + entry: typeof entries.$inferSelect & { + dynamicSections: Array< + typeof sections.$inferSelect & { + contentTypes: Array; + sectionsToKeywords: Array< + typeof sectionsToKeywords.$inferSelect & { + keyword: typeof keywords.$inferSelect; + } + >; + } + >; + }; +}) { + const system = `You are an expert technical writer. You're working on a glossary for API developers. + Your task is to draft a section for a glossary entry on "${term}". + Focus on providing accurate, concise, and valuable information.`; + + const prompt = ` +Draft markdown content for the glossary entry on "${term}" with the following details: + +Term: ${entry.inputTerm} +Outline: +- ${entry.dynamicSections.map((ds) => ds.heading).join("\n- ")} + +Find some additional information for each section below. Go + +${entry.dynamicSections + .map( + (ds) => ` +Section: ${ds.heading} +Content Types: ${ds.contentTypes.map((ct) => ct.type).join(", ")} +Keywords: ${ds.sectionsToKeywords.map((stk) => stk.keyword).join(", ")} +`, + ) + .join("\n")} + +Guidelines: +1. Write in markdown format. +2. Start with an introductory paragraph before stating the first section heading +2. Use "##" for the section heading +3. Skip the title of the page, that will be provided separately +4. Ensure the content is factually correct and relevant to API development. +5. Include examples, code snippets or other rich content if appropriate. +6. Keep the content concise but informative, ensure that there are no fluff phrases or statements that don't provide concrete information, context & background to the term. +7. Don't repeat content between sections, ensure that each section adds value +8. Only write the content for the section, do not provide any other context, introductions or statements regarding this task. +`; + + const completion = await generateText({ + model: openai("gpt-4-turbo"), + system, + prompt, + }); + + return completion.text; +} + +async function reviewContent({ term, content }: { term: string; content: string }) { + const system = `You are a senior technical reviewer with expertise in API development. Your task is to review the drafted content for factual correctness and relevance to the term "${term}".`; + + const organicResults = await db.query.firecrawlResponses.findMany({ + where: eq(firecrawlResponses.inputTerm, term), + limit: 3, + }); + + const prompt = ` +Review the following drafted content for the glossary entry on "${term}": + +${content} + +Guidelines: +1. Check for any factual errors or inaccuracies by cross-referencing the content with the below summaries from the top 3 organic search results for "${term}". +2. Ensure the content is relevant to API development. +3. Verify that the information is up-to-date and follows best practices. +4. Suggest any necessary corrections or improvements. +5. If the content is accurate and relevant, simply respond with "Content is factually correct and relevant." +6. Verify that the content reads well for developers looking up the term online, there should not be any setences that were introduced by ai agents as part of their response to a message for a task. + +Top 3 organic search results for "${term}": +${organicResults.map((r) => `Source URL: ${r.sourceUrl}\nSummary: ${r.summary}`).join("\n")} +`; + + const completion = await generateText({ + model: openai("gpt-4o-mini"), + system, + prompt, + }); + + return completion.text === "Content is factually correct and relevant." + ? content + : completion.text; +} + +async function seoOptimizeContent({ + term, + content, + keywords, +}: { term: SelectEntry["inputTerm"]; content: string; keywords: string[] }) { + const system = `You are an SEO expert specializing in technical content. You're working on a glossary for API developers. + + A technical writer has drafted a section for a glossary entry on "${term}" and your task is to optimize the content for SEO with the provided keywords. + `; + + const prompt = ` + Optimize the following content for SEO: + + ${content} + + Keywords you've researched for this topic: ${keywords.join(", ")} + + Guidelines: + 1. Ensure the content is optimized for the given keywords. + 2. Include the keywords in the content in a natural and engaging manner. + 3. Ensure the content is concise and informative. + 4. Follow best practices for SEO without overly optimizing for keywords + 5. Avoid keyword stuffing, the content should read naturally from an API developer's perspective, who quickly wants to get the information about this term they're looking up. + `; + + const completion = await generateText({ + model: openai("gpt-4o-mini"), + system, + prompt, + }); + + return completion.text; +} diff --git a/apps/billing/src/trigger/glossary/evals.ts b/apps/billing/src/trigger/glossary/evals.ts new file mode 100644 index 0000000000..6dab8d8a7f --- /dev/null +++ b/apps/billing/src/trigger/glossary/evals.ts @@ -0,0 +1,362 @@ +import { db } from "@/lib/db-marketing/client"; +import { + evals, + evalTypes, + type EvalType, + ratingsSchema, + recommendationsSchema, + type Recommendations, +} from "@/lib/db-marketing/schemas/evals"; +import { entries } from "@/lib/db-marketing/schemas"; +import { openai } from "@ai-sdk/openai"; +import { generateObject } from "ai"; +import { z } from "zod"; +import { AbortTaskRunError, task } from "@trigger.dev/sdk/v3"; +import { eq } from "drizzle-orm"; +import type { CacheStrategy } from "./_generate-glossary-entry"; + +type TaskInput = { + input: string; + onCacheHit?: CacheStrategy; +}; + +type RatingOptions = { + type: EvalType; + content: string; +}; + +type EvalOptions = { + content: string; +}; + +// Base task for getting or creating ratings +export const getOrCreateRatingsTask = task({ + id: "get_or_create_ratings", + run: async ({ input, onCacheHit = "stale", ...options }: TaskInput & RatingOptions) => { + console.info(`Getting/Creating ${options.type} ratings for term: ${input}`); + + const entry = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, input), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + if (!entry) { + throw new AbortTaskRunError(`Entry not found for term: ${input}`); + } + + const existing = await db.query.evals.findFirst({ + where: eq(evals.entryId, entry.id), + }); + + if (existing && onCacheHit === "stale") { + console.info(`Found existing ${options.type} ratings for term: ${input}`); + const ratings = JSON.parse(existing.ratings); + return { ratings }; + } + + console.info(`Generating new ${options.type} ratings for term: ${input}`); + + const systemPrompt = `You are a Senior Technical Content Evaluator with expertise in API development and technical documentation. + +Your task is to evaluate the ${options.type} aspects of the content provided. Rate each aspect from 0-10: + +- Accuracy (0-10): How factually correct and technically precise is the content? +- Completeness (0-10): How well does it cover all necessary aspects of the topic? +- Clarity (0-10): How clear and understandable is the content for the target audience? + +Guidelines: +- Be strict but fair in your evaluation +- Consider the technical accuracy especially for API-related content +- Focus on developer experience and understanding +- Provide whole numbers only +- Ensure all ratings have clear justification`; + + const result = await generateObject({ + model: openai("gpt-4o-mini"), + system: systemPrompt, + prompt: `Review this content and provide numerical ratings:\n${options.content}`, + schema: ratingsSchema, + }); + + return result; + }, +}); + +// Base task for getting or creating recommendations +export const getOrCreateRecommendationsTask = task({ + id: "get_or_create_recommendations", + run: async ({ input, onCacheHit = "stale", ...options }: TaskInput & RatingOptions) => { + console.info(`Getting/Creating ${options.type} recommendations for term: ${input}`); + + const entry = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, input), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + if (!entry) { + throw new AbortTaskRunError(`Entry not found for term: ${input}`); + } + + const existing = await db.query.evals.findFirst({ + where: eq(evals.entryId, entry.id), + }); + + if (existing && onCacheHit === "stale") { + console.info(`Found existing ${options.type} recommendations for term: ${input}`); + const recommendations = JSON.parse(existing.recommendations); + return { recommendations }; + } + + console.info(`Generating new ${options.type} recommendations for term: ${input}`); + + const systemPrompt = `You are a Senior Technical Content Strategist specializing in API documentation. + +Your task is to provide specific, actionable recommendations for improving the ${options.type} aspects of the content. + +For each recommendation: +1. Identify the type of change needed (add/modify/merge/remove) +2. Provide a clear description of what needs to be changed +3. Give a specific suggestion for implementation + +Guidelines: +- Focus on technical accuracy and completeness +- Consider the developer experience +- Be specific and actionable +- Avoid vague suggestions +- Ensure recommendations are practical and implementable +- Return between 2-5 recommendations`; + + const result = await generateObject({ + model: openai("gpt-4o-mini"), + system: systemPrompt, + prompt: `Review this content and provide recommendations:\n${options.content}`, + schema: recommendationsSchema, + }); + + return result; + }, +}); + +// Technical Review Task +export const performTechnicalEvalTask = task({ + id: "perform_technical_eval", + run: async ({ input, onCacheHit = "stale", ...options }: TaskInput & EvalOptions) => { + console.info(`Starting technical evaluation for term: ${input}`); + + const entry = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, input), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + if (!entry) { + throw new AbortTaskRunError(`Entry not found for term: ${input}`); + } + + const existing = await db.query.evals.findFirst({ + where: eq(evals.entryId, entry.id), + }); + + if (existing && onCacheHit === "stale") { + console.info(`Found existing technical evaluation for term: ${input}`); + return { + ratings: JSON.parse(existing.ratings), + recommendations: JSON.parse(existing.recommendations), + }; + } + + console.info(`Performing new technical evaluation for term: ${input}`); + + const ratingsResult = await getOrCreateRatingsTask.triggerAndWait({ + input, + type: "technical", + content: options.content, + onCacheHit, + }); + + if (!ratingsResult.ok) { + throw new AbortTaskRunError("Failed to get ratings"); + } + console.info(`Generated technical ratings for term: ${input}`, ratingsResult.output); + + const recommendationsResult = await getOrCreateRecommendationsTask.triggerAndWait({ + input, + type: "technical", + content: options.content, + onCacheHit, + }); + + if (!recommendationsResult.ok) { + throw new AbortTaskRunError("Failed to get recommendations"); + } + console.info( + `Generated technical recommendations for term: ${input}`, + recommendationsResult.output, + ); + + await db.insert(evals).values({ + entryId: entry.id, + type: "technical", + ratings: JSON.stringify(ratingsResult.output), + recommendations: JSON.stringify(recommendationsResult.output.recommendations || []), + }); + console.info(`Stored technical evaluation for term: ${input}`); + + return { + ratings: ratingsResult.output, + recommendations: recommendationsResult.output.recommendations, + }; + }, +}); + +// SEO Eval Task +export const performSEOEvalTask = task({ + id: "perform_seo_eval", + run: async ({ input, onCacheHit = "stale", ...options }: TaskInput & EvalOptions) => { + console.info(`Starting SEO evaluation for term: ${input}`); + + const entry = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, input), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + if (!entry) { + throw new AbortTaskRunError(`Entry not found for term: ${input}`); + } + + const existing = await db.query.evals.findFirst({ + where: eq(evals.entryId, entry.id), + }); + + if (existing && onCacheHit === "stale") { + console.info(`Found existing SEO evaluation for term: ${input}`); + return { + ratings: JSON.parse(existing.ratings), + recommendations: JSON.parse(existing.recommendations), + }; + } + + console.info(`Performing new SEO evaluation for term: ${input}`); + + const ratingsResult = await getOrCreateRatingsTask.triggerAndWait({ + input, + type: "seo", + content: options.content, + onCacheHit, + }); + + if (!ratingsResult.ok) { + throw new AbortTaskRunError("Failed to get SEO ratings"); + } + console.info(`Generated SEO ratings for term: ${input}`, ratingsResult.output); + + const recommendationsResult = await getOrCreateRecommendationsTask.triggerAndWait({ + input, + type: "seo", + content: options.content, + onCacheHit, + }); + + if (!recommendationsResult.ok) { + throw new AbortTaskRunError("Failed to get SEO recommendations"); + } + console.info(`Generated SEO recommendations for term: ${input}`, recommendationsResult.output); + + await db.insert(evals).values({ + entryId: entry.id, + type: "seo", + ratings: JSON.stringify(ratingsResult.output), + recommendations: JSON.stringify(recommendationsResult.output.recommendations || []), + }); + console.info(`Stored SEO evaluation for term: ${input}`); + + return { + ratings: ratingsResult.output, + recommendations: recommendationsResult.output.recommendations, + }; + }, +}); + +// Editorial Eval Task +export const performEditorialEvalTask = task({ + id: "perform_editorial_eval", + run: async ({ input, onCacheHit = "stale", ...options }: TaskInput & EvalOptions) => { + console.info(`[workflow=glossary] [task=editorial_eval] Starting for term: ${input}`); + + const entry = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, input), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + if (!entry) { + throw new AbortTaskRunError(`Entry not found for term: ${input}`); + } + + const existing = await db.query.evals.findFirst({ + where: eq(evals.entryId, entry.id), + }); + + if (existing && onCacheHit === "stale") { + console.info( + `[workflow=glossary] [task=editorial_eval] Found existing evaluation for term: ${input}`, + ); + return { + ratings: JSON.parse(existing.ratings), + recommendations: JSON.parse(existing.recommendations), + outline: JSON.parse(existing.outline || "[]"), + }; + } + + console.info( + `[workflow=glossary] [task=editorial_eval] Performing new evaluation for term: ${input}`, + ); + + const ratingsResult = await getOrCreateRatingsTask.triggerAndWait({ + input, + type: "editorial", + content: options.content, + onCacheHit, + }); + + if (!ratingsResult.ok) { + throw new AbortTaskRunError( + "[workflow=glossary] [task=editorial_eval] Failed to get editorial ratings", + ); + } + console.info( + `[workflow=glossary] [task=editorial_eval] Generated ratings for term: ${input}`, + ratingsResult.output, + ); + + const recommendationsResult = await getOrCreateRecommendationsTask.triggerAndWait({ + input, + type: "editorial", + content: options.content, + onCacheHit, + }); + + if (!recommendationsResult.ok) { + throw new AbortTaskRunError( + "[workflow=glossary] [task=editorial_eval] Failed to get editorial recommendations", + ); + } + console.info( + `[workflow=glossary] [task=editorial_eval] Generated recommendations for term: ${input}`, + recommendationsResult.output, + ); + + await db.insert(evals).values({ + entryId: entry.id, + type: "editorial", + ratings: JSON.stringify(ratingsResult.output), + recommendations: JSON.stringify(recommendationsResult.output.recommendations || []), + outline: JSON.stringify(options.content), + }); + console.info(`[workflow=glossary] [task=editorial_eval] Stored evaluation for term: ${input}`); + + return { + ratings: ratingsResult.output, + recommendations: recommendationsResult.output.recommendations, + outline: options.content, + }; + }, +}); diff --git a/apps/billing/src/trigger/glossary/generate-outline.ts b/apps/billing/src/trigger/glossary/generate-outline.ts new file mode 100644 index 0000000000..c43cd2bc65 --- /dev/null +++ b/apps/billing/src/trigger/glossary/generate-outline.ts @@ -0,0 +1,395 @@ +import { db } from "@/lib/db-marketing/client"; +import { + entries, + type FirecrawlResponse, + firecrawlResponses, + insertSectionContentTypeSchema, + insertSectionSchema, + insertSectionsToKeywordsSchema, + keywords, + sectionContentTypes, + sections, + sectionsToKeywords, + type SelectKeywords, + selectKeywordsSchema, +} from "@/lib/db-marketing/schemas"; +import { openai } from "@ai-sdk/openai"; +import { AbortTaskRunError, task } from "@trigger.dev/sdk/v3"; +import { generateObject } from "ai"; +import { and, eq, or } from "drizzle-orm"; +import { z } from "zod"; +import type { CacheStrategy } from "./_generate-glossary-entry"; +import { getOrCreateSummary } from "@/lib/firecrawl"; +import type { Keyword } from "@/lib/db-marketing/schemas/keywords"; +import { performTechnicalEvalTask, performSEOEvalTask, performEditorialEvalTask } from "./evals"; + +// TODO: this task is a bit flake-y still +// - split up into smaller tasks, and/or +// - move some of the in-memory storage to db caching, and/or +// - improve the prompts +export const generateOutlineTask = task({ + id: "generate_outline", + retry: { + maxAttempts: 5, + }, + run: async ({ + term, + onCacheHit = "stale" as CacheStrategy, + }: { term: string; onCacheHit?: CacheStrategy }) => { + const existing = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, term), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + with: { + dynamicSections: { + with: { + contentTypes: true, + sectionsToKeywords: { + with: { + keyword: true, + }, + }, + }, + }, + }, + }); + + if ( + existing?.dynamicSections && + existing.dynamicSections.length > 0 && + onCacheHit === "stale" + ) { + return existing; + } + + const entry = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, term), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + if (!entry) { + throw new AbortTaskRunError(`Entry not found for term: ${term}`); + } + // Fetch top-ranking pages' markdown content + const organicResults = await db.query.firecrawlResponses.findMany({ + where: eq(firecrawlResponses.inputTerm, term), + with: { + serperOrganicResult: { + columns: { position: true }, + }, + }, + }); + if (organicResults.length === 0) { + throw new AbortTaskRunError(`No organic results found for term: ${term}`); + } + console.info(`Step 1/8 - ORGANIC RESULTS: ${organicResults?.length} results`); + + // Summarize the markdown content to manage token limits + const summaries = await Promise.all( + organicResults?.map(async (result) => + getOrCreateSummary({ + url: result.sourceUrl, + connectTo: { term }, + onCacheHit, + }), + ), + ); + + const topRankingContent = summaries + .map((r) => `${r?.sourceUrl}\n${r?.summary}`) + .join("=========\n\n"); + console.info(`Step 3/8 - SUMMARIES: ${topRankingContent}`); + + const contentKeywords = await db.query.keywords.findMany({ + where: and( + or(eq(keywords.source, "headers"), eq(keywords.source, "title")), + eq(keywords.inputTerm, term), + ), + }); + console.info(`Step 3/8 - SUMMARIES: ${topRankingContent}`); + + // Step 4: Generate initial outline + const initialOutline = await generateInitialOutline({ + term, + topRankingContent, + contentKeywords, + }); + console.info( + `Step 4/8 - INITIAL OUTLINE RESULT: ${JSON.stringify(initialOutline.object.outline)}`, + ); + + // Step 5: Technical review by domain expert + const technicalEval = await performTechnicalEvalTask.triggerAndWait({ + input: term, + content: topRankingContent, + onCacheHit, + }); + if (!technicalEval.ok) { + throw new AbortTaskRunError("Technical evaluation failed"); + } + console.info(`Step 5/8 - TECHNICAL EVALUATION RESULT: + === + Ratings: ${JSON.stringify(technicalEval.output.ratings)} + === + Recommendations: ${JSON.stringify(technicalEval.output.recommendations)} + `); + const seoKeywords = await db.query.keywords.findMany({ + where: and( + or(eq(keywords.source, "related_searches"), eq(keywords.source, "auto_suggest")), + eq(keywords.inputTerm, term), + ), + }); + + // Step 6: SEO review + const seoEval = await performSEOEvalTask.triggerAndWait({ + input: term, + content: topRankingContent, + onCacheHit, + }); + if (!seoEval.ok) { + throw new AbortTaskRunError("SEO evaluation failed"); + } + console.info(`Step 6/8 - SEO EVALUATION RESULT: + === + Ratings: ${JSON.stringify(seoEval.output.ratings)} + === + Recommendations: ${JSON.stringify(seoEval.output.recommendations)} + `); + + const seoOptimizedOutline = await reviseSEOOutline({ + term, + outlineToRefine: technicalEval.output.revisedOutline, + reviewReport: seoEval.output, + seoKeywordsToAllocate: seoKeywords, + }); + console.info( + `Step 7/8 - SEO OPTIMIZED OUTLINE RESULT: ${JSON.stringify( + seoOptimizedOutline.object.outline, + )}`, + ); + + // Step 7: Editorial review + const editorialEval = await performEditorialEvalTask.triggerAndWait({ + input: term, + content: seoOptimizedOutline.object.outline, + onCacheHit, + }); + if (!editorialEval.ok) { + throw new AbortTaskRunError("Editorial evaluation failed"); + } + console.info(`Step 8/8 - EDITORIAL EVALUATION RESULT: + === + Ratings: ${JSON.stringify(editorialEval.output.ratings)} + === + Recommendations: ${JSON.stringify(editorialEval.output.recommendations)} + `); + + // persist to db as a new entry by with their related entities + const sectionInsertionPayload = editorialEval.output.outline.map((section) => + insertSectionSchema.parse({ + ...section, + entryId: entry.id, + }), + ); + const newSectionIds = await db.insert(sections).values(sectionInsertionPayload).$returningId(); + + // associate the keywords with the sections + const keywordInsertionPayload = []; + for (let i = 0; i < editorialEval.output.outline.length; i++) { + // add the newly inserted section id to our outline + const section = { ...editorialEval.output.outline[i], id: newSectionIds[i].id }; + for (let j = 0; j < section.keywords.length; j++) { + const keyword = section.keywords[j]; + const keywordId = seoKeywords.find( + (seoKeyword) => keyword.keyword === seoKeyword.keyword, + )?.id; + if (!keywordId) { + console.warn(`Keyword "${keyword.keyword}" not found in seo keywords`); + continue; + } + const payload = insertSectionsToKeywordsSchema.parse({ + sectionId: section.id, + keywordId, + }); + keywordInsertionPayload.push(payload); + } + } + await db.insert(sectionsToKeywords).values(keywordInsertionPayload); + + // associate the content types with the sections + const contentTypesInsertionPayload = editorialEval.output.outline.flatMap((section, index) => + section.contentTypes.map((contentType) => + insertSectionContentTypeSchema.parse({ + ...contentType, + sectionId: newSectionIds[index].id, + }), + ), + ); + await db.insert(sectionContentTypes).values(contentTypesInsertionPayload); + + const newEntry = await db.query.entries.findFirst({ + where: eq(entries.id, entry.id), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + with: { + dynamicSections: { + with: { + contentTypes: true, + sectionsToKeywords: { + with: { + keyword: true, + }, + }, + }, + }, + }, + }); + + return newEntry; + }, +}); + +export const reviewSchema = z.object({ + evaluation: z.string(), + missing: z.string().optional(), + rating: z.number().min(0).max(10), +}); + +// Schema for initial outline: array of sections, each with content types and keywords +const finalOutlineSchema = z.object({ + outline: z.array( + insertSectionSchema.omit({ entryId: true }).extend({ + contentTypes: z.array(insertSectionContentTypeSchema.omit({ sectionId: true })), + keywords: z.array(selectKeywordsSchema.pick({ keyword: true })), + }), + ), +}); +// the keywords are associated later +const initialOutlineSchema = finalOutlineSchema.extend({ + outline: z.array(finalOutlineSchema.shape.outline.element.omit({ keywords: true })), +}); + +async function generateInitialOutline({ + term, + topRankingContent, + contentKeywords, +}: { + term: string; + topRankingContent: string; + contentKeywords: Array; +}) { + const initialOutlineSystem = `You are a **Technical SEO Content Writer** specializing in API development and computer science. + Your objective is to create a flat, comprehensive outline for a glossary page based on summarized content from top-ranking pages. + Ensure factual correctness, clarity, and SEO optimization without unnecessary subheadings.`; + + const initialOutlinePrompt = ` + Generate a comprehensive and factually accurate outline for a glossary page dedicated to the term: **${term}**. + + **Instructions:** + - Analyze the summarized content from the top-ranking pages. + - Create a flat, customized outline with sections that best address the search intent and provide comprehensive coverage of the term. + - Ensure all sections are factually correct, unique, and tailored to the specific term's context in API development and computer science. + - Denote the order of the sections + - Include a short description under each heading that outlines the content to be included, explains its importance, and references sources. + - Describe recommended content types for each section as per the schema definition called "type" inside the contentTypes array. These represent different type of content forms for SEO pages. Make a recommendation for what to use and keep track of your reasoning. + - Ensure headers are under 70 characters, descriptive, and maintain clarity and readability. + + ===== + TOP RANKING PAGES CONTENT: + ===== + ${topRankingContent} + + ===== + KEYWORDS USED IN HEADERS: + ===== + FROM PAGE TITLES: + ${contentKeywords + .filter((k) => k.source === "title") + .map((k) => `- ${k.keyword}`) + .join("\n")} + FROM HEADERS: + ${contentKeywords + .filter((k) => k.source === "headers") + .map((k) => `- ${k.keyword}`) + .join("\n")} + `; + + return await generateObject({ + model: openai("gpt-4o-mini"), + system: initialOutlineSystem, + prompt: initialOutlinePrompt, + schema: initialOutlineSchema, + }); +} + +async function reviseSEOOutline({ + term, + outlineToRefine, + reviewReport, + seoKeywordsToAllocate, +}: { + term: string; + outlineToRefine: z.infer["outline"]; + reviewReport: Awaited>["object"]; + seoKeywordsToAllocate: Array; +}) { + const seoRevisionSystem = ` + You are a **Senior SEO Strategist & Technical Content Specialist** with over 10 years of experience in optimizing content for API development and computer science domains. + + Task: + - Refine the outline you're given based on the review report and guidelines + - Allocate the provided keyworeds to the provided outline items + + **Guidelines for Revised Outline:** + 1. Make each header unique and descriptive + 2. Include relevant keywords in headers (use only provided keywords) + 3. Keep headers concise (ideally under 60 characters) + 4. Make headers compelling and engaging + 5. Optimize headers for featured snippets + 6. Avoid keyword stuffing in headers + 7. Use long-tail keywords where appropriate + 8. Ensure headers effectively break up the text + 9. Allocate keywords from the provided list to each section (ie outline item) in the 'keywords' field as an object with the following structure: { keyword: string } + 10. Allocate each keyword only once across all sections + 11. Ensure the keyword allocation makes sense for each section's content + 12. If a keyword doesn't fit any section, leave it unallocated + + **Additional Considerations:** + - Headers should read technically and logically + - Headers should explain the content of their respective sections + - Headers should be distinct from each other + - Optimize for SEO without sacrificing readability + - Write for API developers, not general internet users + - Maintain a technical tone appropriate for the audience + + You have the ability to add, modify, or merge sections in the outline as needed to create the most effective and SEO-optimized structure. + `; + + const seoRevisionPrompt = ` + Review the following outline for the term "${term}": + + Outline to refine: + ${JSON.stringify(outlineToRefine)} + + Review report: + ${JSON.stringify(reviewReport)} + + Provided keywords: + Related Searches: ${JSON.stringify( + seoKeywordsToAllocate + .filter((k) => k.source === "related_searches") + .map((k) => k.keyword) + .join(", "), + )} + Auto Suggest: ${JSON.stringify( + seoKeywordsToAllocate + .filter((k) => k.source === "auto_suggest") + .map((k) => k.keyword) + .join(", "), + )} + `; + + return await generateObject({ + model: openai("gpt-4o-mini"), + system: seoRevisionSystem, + prompt: seoRevisionPrompt, + schema: finalOutlineSchema, + }); +} diff --git a/apps/billing/src/trigger/glossary/keyword-research.ts b/apps/billing/src/trigger/glossary/keyword-research.ts new file mode 100644 index 0000000000..78c330e2ab --- /dev/null +++ b/apps/billing/src/trigger/glossary/keyword-research.ts @@ -0,0 +1,115 @@ +import { db } from "@/lib/db-marketing/client"; +import { keywords } from "@/lib/db-marketing/schemas"; +import { AbortTaskRunError, task } from "@trigger.dev/sdk/v3"; +import { sql } from "drizzle-orm"; +import { inArray } from "drizzle-orm"; +import { and, eq } from "drizzle-orm"; +import { getOrCreateSearchQuery } from "../../lib/search-query"; +import { getOrCreateSearchResponse } from "../../lib/serper"; +import { getOrCreateKeywordsFromHeaders, getOrCreateKeywordsFromTitles } from "../../lib/keywords"; +import { getOrCreateFirecrawlResponse } from "@/lib/firecrawl"; +import type { CacheStrategy } from "./_generate-glossary-entry"; + +export const THREE = 3; + +export const keywordResearchTask = task({ + id: "keyword_research", + retry: { + maxAttempts: 3, + }, + run: async ({ + term, + onCacheHit = "stale" as CacheStrategy, + }: { term: string; onCacheHit?: CacheStrategy }) => { + const existing = await db.query.keywords.findMany({ + where: eq(keywords.inputTerm, term), + }); + + if (existing.length > 0 && onCacheHit === "stale") { + return { + message: `Found existing keywords for ${term}`, + term, + keywords: existing, + }; + } + + const searchQuery = await getOrCreateSearchQuery({ term: term }); + console.info(`1/6 - SEARCH QUERY: ${searchQuery?.query}`); + + if (!searchQuery) { + throw new AbortTaskRunError("Unable to generate search query"); + } + + const searchResponse = await getOrCreateSearchResponse({ + query: searchQuery.query, + inputTerm: searchQuery.inputTerm, + }); + console.info( + `2/6 - SEARCH RESPONSE: Found ${searchResponse.serperOrganicResults.length} organic results`, + ); + + console.info(`3/6 - Getting content for top ${THREE} results`); + const topThree = searchResponse.serperOrganicResults + .sort((a, b) => a.position - b.position) + .slice(0, THREE); + + // Get content for top 3 results + const firecrawlResults = await Promise.all( + topThree.map((result) => + getOrCreateFirecrawlResponse({ url: result.link, connectTo: { term: term } }), + ), + ); + + console.info(`4/6 - Found ${firecrawlResults.length} firecrawl results`); + + const keywordsFromTitles = await getOrCreateKeywordsFromTitles({ + term: term, + }); + console.info(`5/6 - KEYWORDS FROM TITLES: ${keywordsFromTitles.length} keywords`); + + const keywordsFromHeaders = await getOrCreateKeywordsFromHeaders({ + term: term, + }); + + console.info(`6/6 - KEYWORDS FROM HEADERS: ${keywordsFromHeaders.length} keywords`); + + // NB: drizzle doesn't support returning ids in conjunction with handling duplicates, so we get them afterwards + await db + .insert(keywords) + .values( + searchResponse.serperRelatedSearches.map((search) => ({ + inputTerm: searchQuery.inputTerm, + keyword: search.query.toLowerCase(), + source: "related_searches", + updatedAt: sql`now()`, + })), + ) + .onDuplicateKeyUpdate({ + set: { + updatedAt: sql`now()`, + }, + }); + const insertedRelatedSearches = await db.query.keywords.findMany({ + where: and( + eq(keywords.inputTerm, searchQuery.inputTerm), + eq(keywords.source, "related_searches"), + inArray( + keywords.keyword, + searchResponse.serperRelatedSearches.map((search) => search.query.toLowerCase()), + ), + ), + }); + + console.info( + `✅ Keyword Research for ${term} completed. Total keywords: ${ + keywordsFromTitles.length + keywordsFromHeaders.length + insertedRelatedSearches.length + }`, + ); + + return { + message: `Keyword Research for ${term} completed`, + term: searchQuery.inputTerm, + keywords: [...keywordsFromTitles, ...keywordsFromHeaders, ...insertedRelatedSearches], + }; + }, +}); diff --git a/apps/billing/src/trigger/glossary/seo-meta-tags.ts b/apps/billing/src/trigger/glossary/seo-meta-tags.ts new file mode 100644 index 0000000000..456357a11c --- /dev/null +++ b/apps/billing/src/trigger/glossary/seo-meta-tags.ts @@ -0,0 +1,128 @@ +import { Trigger } from "@trigger.dev/sdk"; +import { z } from "zod"; +import { eq, and, or } from "drizzle-orm"; +import { keywords, firecrawlResponses, entries } from "../../lib/db-marketing/schemas"; +import { task } from "@trigger.dev/sdk/v3"; +import { db } from "@/lib/db-marketing/client"; +import { generateObject, generateText } from "ai"; +import { openai } from "@ai-sdk/openai"; +import type { CacheStrategy } from "./_generate-glossary-entry"; + +// Define the job +export const seoMetaTagsTask = task({ + id: "seo_meta_tags", + retry: { + maxAttempts: 3, + }, + run: async ({ + term, + onCacheHit = "stale" as CacheStrategy, + }: { term: string; onCacheHit?: CacheStrategy }) => { + // Add check for existing meta tags + const existing = await db.query.entries.findFirst({ + where: eq(entries.inputTerm, term), + columns: { + id: true, + inputTerm: true, + metaTitle: true, + metaDescription: true, + }, + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + + if (existing?.metaTitle && existing?.metaDescription && onCacheHit === "stale") { + return existing; + } + + // Step 1: Fetch keywords associated with the inputTerm + const relatedKeywords = await db.query.keywords.findMany({ + where: and( + eq(keywords.inputTerm, term), + or(eq(keywords.source, "related_searches"), eq(keywords.source, "auto_suggest")), + ), + }); + + // Step 2: Fetch top 10 ranking pages' data + const topRankingPages = await db.query.firecrawlResponses.findMany({ + where: eq(firecrawlResponses.inputTerm, term), + with: { + serperOrganicResult: true, + }, + }); + + // Step 3: Craft SEO-optimized title and description + const craftedMetaTags = await generateObject({ + model: openai("gpt-4o"), + system: ` + You are an SEO expert specializing in technical content, particularly API development. You are given an API-related term and need to craft an SEO-optimized title and description for a glossary entry about this term. + + Follow these best practices when crafting the title and description: + + For the title: + - Keep it concise, ideally between 50-60 characters. + - Include the API term at the beginning of the title. + - If the term is an acronym, consider including both the acronym and its full form. + - Make it informative and clear, indicating that this is a definition or explanation. + - Include "API Glossary" or your brand name at the end if space allows. + - Use a pipe (|) or dash (-) to separate title elements if needed. + + For the description: + - Aim for 150-160 characters for optimal display in search results. + - Start with a clear, concise definition of the API term. + - Include the phrase "Learn about [term]" or similar to indicate the educational nature. + - Mention that this is part of an API development glossary. + - If relevant, briefly mention a key benefit or use case of the term. + - Use technical language appropriately, but ensure it's understandable for developers. + - Include a call-to-action like "Explore our API glossary for more terms." + + Additional guidelines: + - Ensure accuracy in technical terms and concepts. + - Balance SEO optimization with educational value. + - Consider the context of API development when explaining terms. + - For complex terms, focus on clarity over comprehensiveness in the meta description. + - If the term is commonly confused with another, briefly differentiate it. + + Example format: + Title: "HATEOAS in REST APIs | Unkey API Glossary" + Description: "What is HATEOAS in REST APIs? Learn about HATEOAS in REST APIs. Discover how it enhances API navigation and discoverability. Explore our API development glossary for more terms." + + Remember, the goal is to create meta tags that are both SEO-friendly and valuable to developers seeking to understand API terminology. + `, + prompt: ` + Term: ${term} + List of related keywords: + - ${relatedKeywords.map((keyword) => keyword.keyword).join("\n- ")} + + A markdown table of the title & description of the top 10 ranking pages along with their position: + \`\`\` + | Position | Title | Description | + | -------- | ----- | ----------- | + ${topRankingPages + .map( + (page) => `${page.serperOrganicResult?.position} | ${page.title} | ${page.description}`, + ) + .join("\n")} + \`\`\` + + The title and description should be SEO-optimized for the keywords provided. + `, + schema: z.object({ + title: z.string(), + description: z.string(), + }), + temperature: 0.5, + }); + + await db + .update(entries) + .set({ + metaTitle: craftedMetaTags.object.title, + metaDescription: craftedMetaTags.object.description, + }) + .where(eq(entries.inputTerm, term)); + return db.query.entries.findFirst({ + where: eq(entries.inputTerm, term), + orderBy: (entries, { desc }) => [desc(entries.createdAt)], + }); + }, +}); diff --git a/apps/billing/src/trigger/keyword-research.ts b/apps/billing/src/trigger/keyword-research.ts deleted file mode 100644 index a5925a86c2..0000000000 --- a/apps/billing/src/trigger/keyword-research.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { db } from "@/lib/db-marketing/client"; -import { keywords } from "@/lib/db-marketing/schemas"; -import { openai } from "@ai-sdk/openai"; -import { AbortTaskRunError, task } from "@trigger.dev/sdk/v3"; -import { generateObject } from "ai"; -import { sql } from "drizzle-orm"; -import { inArray } from "drizzle-orm"; -import { and, eq } from "drizzle-orm"; -import { z } from "zod"; -import { getTopResultsContent } from "../lib/firecrawl"; -import { getOrCreateSearchQuery } from "../lib/search-query"; -import { getOrCreateSearchResponse } from "../lib/serper"; - -export const keywordResearchTask = task({ - id: "keyword_research", - retry: { - maxAttempts: 0, - }, - run: async (payload: { term: string }) => { - const searchQuery = await getOrCreateSearchQuery({ term: payload.term }); - console.info(`1/5 - SEARCH QUERY: ${searchQuery?.query}`); - - if (!searchQuery) { - throw new AbortTaskRunError("Unable to generate search query"); - } - const searchResponse = await getOrCreateSearchResponse({ - query: searchQuery.query, - inputTerm: searchQuery.inputTerm, - }); - console.info(`2/5 - SEARCH RESPONSE: ${searchResponse.serperOrganicResults.length} results`); - const keywordResearchSystemPrompt = ` -You are an SEO Expert & Content Writer specializing in creating technical content for Developer Tools that are highly SEO optimized. - -**Your Objectives:** -1. **Keyword Extraction:** - - Extract relevant keywords from the titles of top-ranking organic search results. - - Focus on technical and context-specific terms related to API development. - -2. **Quality Assurance:** - - **Remove Stopwords:** Ensure that keywords do not include common stopwords (e.g., "for," "and," "the," "of," etc.). - - **Remove Brand Names:** Ensure that keywords do not include brand names (e.g., "GitHub", "YouTube", "npm", etc.). - - **Remove README keywords:** Ensure to exclude from instructive headers or titles (e.g., "getting started", "installation", etc.) of readmes. - -**Guidelines:** -- Prioritize keywords that directly relate to the main term and its subtopics. -- Maintain a focus on terms that potential users or developers are likely to search for in the context of API development. -- Branded keywords should be included in the keywordsWithBrandNames and not in the keywords. -`; - const promptTitles = `Below is a list of titles separated by semicolons (';') from the top organic search results currently ranking for the term '${ - searchQuery.inputTerm - }'. - Given that some pages might be SEO optimized, there's a chance that we can extract keywords from the page titles. - Create a list of keywords that are directly related to the main term and its subtopics form the titles of the pages. - - Given that some title contain the brand of the website (e.g. github, youtube, etc.) OR the section of the website (e.g. blog, docs, etc.), ensure to not treat them as keywords. - - ========== - ${searchResponse.serperOrganicResults - .map( - (result) => - `The title for the sourceUrl "${result.link}" (reference this url as the sourceUrl for the keyword) is: "${result.title}"`, - ) - .join(";")} - ========== - `; - // extract keywords from the title of the organic results - const keywordsFromTitles = await generateObject({ - model: openai("gpt-4o"), - system: keywordResearchSystemPrompt, - prompt: promptTitles, - schema: z.object({ - keywords: z.array(z.object({ keyword: z.string(), sourceUrl: z.string().url() })), - keywordsWithBrandNames: z.array( - z.object({ keyword: z.string(), sourceUrl: z.string().url() }), - ), - }), - }); - console.info( - `3/5 - KEYWORDS FROM TITLES: ${keywordsFromTitles.object.keywordsWithBrandNames.length} keywords with brand names and ${keywordsFromTitles.object.keywords.length} keywords.`, - ); - - // NB: drizzle doesn't support returning ids in conjunction with handling duplicates, so we get them afterwards - await db - .insert(keywords) - .values( - keywordsFromTitles.object.keywords.map((keyword) => ({ - inputTerm: searchQuery.inputTerm, - keyword: keyword.keyword.toLowerCase(), - sourceUrl: keyword.sourceUrl, - source: "titles", - })), - ) - .onDuplicateKeyUpdate({ - set: { - updatedAt: sql`now()`, - }, - }); - const insertedFromTitles = await db.query.keywords.findMany({ - where: and( - eq(keywords.inputTerm, searchQuery.inputTerm), - eq(keywords.source, "titles"), - inArray( - keywords.keyword, - keywordsFromTitles.object.keywords.map((k) => k.keyword.toLowerCase()), - ), - ), - }); - - const THREE = 3; - const topThreeOrganicResults = searchResponse.serperOrganicResults.filter( - (result) => result.position <= THREE, - ); - const scrapedContent = await getTopResultsContent({ - urls: topThreeOrganicResults.map((result) => result.link), - }); - console.info(`4/5 - SCRAPED CONTENT: ${scrapedContent.length} results`); - const context = scrapedContent - .map((content) => { - if (!content?.markdown || !content?.sourceUrl) { - return ""; - } - return ` - ========== - The headers for the organic result "${content.sourceUrl}" (ensure you're referencing this url as the sourceUrl for the keyword) are: - ${content.markdown?.match(/^##\s+(.*)$/gm)?.join("\n")} - ========== - `; - }) - .join(";"); - - const promptHeaders = `Below is a list of h1 headers, separated by semicolons (';'), from the top organic search results currently ranking for the term '${searchQuery.inputTerm}'. Given that some pages might be SEO optimized, there's a chance that we can extract keywords from them. - Create a list of keywords that are directly related to the main term and its subtopics form the h1 headers of the pages. - - ========== - ${context} - ========== - `; - const keywordsFromHeaders = await generateObject({ - model: openai("gpt-4o"), - system: keywordResearchSystemPrompt, - prompt: promptHeaders, - schema: z.object({ - keywords: z.array(z.object({ keyword: z.string(), sourceUrl: z.string().url() })), - keywordsWithBrandNames: z.array( - z.object({ keyword: z.string(), sourceUrl: z.string().url() }), - ), - }), - }); - console.info( - `5/5 - KEYWORDS FROM HEADERS: ${keywordsFromHeaders.object.keywordsWithBrandNames.length} keywords with brand names and ${keywordsFromHeaders.object.keywords.length} keywords.`, - ); - - // NB: drizzle doesn't support returning ids in conjunction with handling duplicates, so we get them afterwards - await db - .insert(keywords) - .values( - keywordsFromHeaders.object.keywords.map((keyword) => ({ - inputTerm: searchQuery.inputTerm, - keyword: keyword.keyword.toLowerCase(), - sourceUrl: keyword.sourceUrl, - source: "headers", - })), - ) - .onDuplicateKeyUpdate({ - set: { - updatedAt: sql`now()`, - }, - }); - const insertedFromHeaders = await db.query.keywords.findMany({ - where: and( - eq(keywords.inputTerm, searchQuery.inputTerm), - eq(keywords.source, "headers"), - inArray( - keywords.keyword, - keywordsFromHeaders.object.keywords.map((k) => k.keyword.toLowerCase()), - ), - ), - }); - - // NB: drizzle doesn't support returning ids in conjunction with handling duplicates, so we get them afterwards - await db - .insert(keywords) - .values( - searchResponse.serperRelatedSearches.map((search) => ({ - inputTerm: searchQuery.inputTerm, - keyword: search.query.toLowerCase(), - source: "related_searches", - updatedAt: sql`now()`, - })), - ) - .onDuplicateKeyUpdate({ - set: { - updatedAt: sql`now()`, - }, - }); - const insertedRelatedSearches = await db.query.keywords.findMany({ - where: and( - eq(keywords.inputTerm, searchQuery.inputTerm), - eq(keywords.source, "related_searches"), - inArray( - keywords.keyword, - searchResponse.serperRelatedSearches.map((search) => search.query.toLowerCase()), - ), - ), - }); - - console.info( - `✅ Keyword Research for ${payload.term} completed. Total keywords: ${ - insertedFromTitles.length + insertedFromHeaders.length + insertedRelatedSearches.length - }`, - ); - - return { - message: `Keyword Research for ${payload.term} completed`, - term: searchQuery.inputTerm, - keywords: [...insertedFromTitles, ...insertedFromHeaders, ...insertedRelatedSearches], - }; - }, -}); diff --git a/apps/billing/tsconfig.json b/apps/billing/tsconfig.json index 171657a86e..f5517524dd 100644 --- a/apps/billing/tsconfig.json +++ b/apps/billing/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "esnext", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, diff --git a/apps/billing/updates/update_2024_11_05/prompt.txt b/apps/billing/updates/update_2024_11_05/prompt.txt new file mode 100644 index 0000000000..eeca3cd716 --- /dev/null +++ b/apps/billing/updates/update_2024_11_05/prompt.txt @@ -0,0 +1,29 @@ +About the Glossary entry workflow generation PR + +:tv: Demo + + +:bulb: Main Changes +The core of this change (in fact that’s what you see in the demo) is the trigger workflows for generating content. + +AI generation [→ trigger/glossary] +This adds a glossary entry generation workflow to apps/billing (ie trigger), that: +Runs a 5-step process: keyword research, outline generation, section drafting, SEO meta tags, and PR creation +Each sub-task: +is idempotent. Why? Allows for replays of sub-tasks from ui → saves time for ongoing parametrisation) +returns a cached response by default (revalidation configurable). Why? Allows skipping same/similar API calls → saves costs & debug time (faster replays) +Has a maxAttemps of 3 to recover undeterministic failures +Upon full generation commits the code to GitHub to create a PR for the single term +LLM calls follow best practices for prompt engineering (which are documented in prompt-engineering.txt) and makes use of evals (undeterministic evals from AI) +noticeably good & bad examples or completions are not being used right now as we don’t have enough data for that yet +It ensures factual consistency (with the help of web browsing & prompt engineering) as well as search engine optimisation (again with web browing & prompt engineering) + +NB: for trigger instructions, I’ve created a .txt file which allowed it to generate good trigger code (at least it passed my bar, judge for yourself) + +I/O [→ lib/db-marketing] +Data is persisted with drizzle into our planetscale marketing instance +// → add your summary here ← + +The workflow is designed to be the main entry point for glossary generation, with results stored in both database and GitHub. + +NB: Another cursor instruction file to generate drizzle code — I’m not sure since I haven’t used drizzle with mysql before and I didn’t know that their API was different (I appreciate a review from you here @chronark if you would like) \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ab0cfc1fe..c0a8188ba2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -127,7 +127,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: ^0.4.1 - version: 0.4.1(@cloudflare/workers-types@4.20240603.0)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.6.0) + version: 0.4.5(@cloudflare/workers-types@4.20240603.0)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.6.0) '@cloudflare/workers-types': specifier: ^4.20240603.0 version: 4.20240603.0 @@ -167,18 +167,21 @@ importers: '@mendable/firecrawl-js': specifier: ^1.5.2 version: 1.5.2(ws@8.18.0) + '@octokit/rest': + specifier: ^21.0.2 + version: 21.0.2 '@planetscale/database': specifier: ^1.16.0 version: 1.18.0 '@trigger.dev/nextjs': - specifier: 3.1.0 - version: 3.1.0(@trigger.dev/sdk@3.1.0)(next@14.2.10) + specifier: 3.1.2 + version: 3.1.2(@trigger.dev/sdk@3.1.2)(next@14.2.10) '@trigger.dev/sdk': - specifier: 3.1.0 - version: 3.1.0 + specifier: 3.1.2 + version: 3.1.2 '@trigger.dev/slack': - specifier: 3.1.0 - version: 3.1.0 + specifier: 3.1.2 + version: 3.1.2 '@unkey/billing': specifier: workspace:^ version: link:../../internal/billing @@ -199,7 +202,7 @@ importers: version: link:../../internal/schema ai: specifier: ^3.4.7 - version: 3.4.7(openai@4.52.1)(react@18.3.1)(svelte@5.1.9)(vue@3.5.12)(zod@3.23.8) + version: 3.4.7(react@18.3.1)(svelte@5.1.9)(vue@3.5.12)(zod@3.23.8) drizzle-orm: specifier: ^0.33.0 version: 0.33.0(@opentelemetry/api@1.4.1)(@planetscale/database@1.18.0)(@types/react@18.3.11)(react@18.3.1) @@ -308,10 +311,10 @@ importers: version: 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@tailwindcss/container-queries': specifier: ^0.1.1 - version: 0.1.1(tailwindcss@3.4.10) + version: 0.1.1(tailwindcss@3.4.3) '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.12(tailwindcss@3.4.10) + version: 0.5.12(tailwindcss@3.4.3) '@tanstack/react-query': specifier: ^4.36.1 version: 4.36.1(react-dom@18.3.1)(react@18.3.1) @@ -416,7 +419,7 @@ importers: version: 3.3.0(react-dom@18.3.1)(react@18.3.1) autoprefixer: specifier: ^10.4.19 - version: 10.4.20(postcss@8.4.38) + version: 10.4.19(postcss@8.4.38) class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -461,7 +464,7 @@ importers: version: 2.1.3 next: specifier: 14.2.10 - version: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) next-mdx-remote: specifier: ^4.4.1 version: 4.4.1(react-dom@18.3.1)(react@18.3.1) @@ -539,10 +542,10 @@ importers: version: 2.3.0 tailwindcss: specifier: ^3.4.3 - version: 3.4.10(ts-node@10.9.2) + version: 3.4.3(ts-node@10.9.2) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.10) + version: 1.0.7(tailwindcss@3.4.3) trpc-tools: specifier: ^0.12.0 version: 0.12.0(@trpc/server@10.45.2)(typanion@3.14.0)(typescript@5.5.3)(zod@3.23.8) @@ -561,7 +564,7 @@ importers: version: 3.63.1 '@tailwindcss/aspect-ratio': specifier: ^0.4.2 - version: 0.4.2(tailwindcss@3.4.10) + version: 0.4.2(tailwindcss@3.4.3) '@types/d3-array': specifier: ^3.2.1 version: 3.2.1 @@ -598,7 +601,7 @@ importers: version: 13.4.10(@types/react@18.3.11)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) fumadocs-mdx: specifier: 10.0.2 - version: 10.0.2(acorn@8.14.0)(fumadocs-core@13.4.10)(next@14.2.10) + version: 10.0.2(fumadocs-core@13.4.10)(next@14.2.10) fumadocs-ui: specifier: 13.4.10 version: 13.4.10(@types/react-dom@18.3.0)(@types/react@18.3.11)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1)(tailwindcss@3.4.10) @@ -607,7 +610,7 @@ importers: version: 0.378.0(react@18.3.1) next: specifier: ^14.2.8 - version: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -629,10 +632,10 @@ importers: version: 18.3.0 autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.45) + version: 10.4.20(postcss@8.4.47) postcss: specifier: ^8.4.45 - version: 8.4.45 + version: 8.4.47 tailwindcss: specifier: ^3.4.10 version: 3.4.10(ts-node@10.9.2) @@ -678,7 +681,7 @@ importers: version: link:../../packages/api next: specifier: 14.2.10 - version: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) react: specifier: ^18 version: 18.3.1 @@ -700,13 +703,13 @@ importers: version: 18.3.0 autoprefixer: specifier: ^10.4.19 - version: 10.4.20(postcss@8.4.38) + version: 10.4.19(postcss@8.4.38) postcss: specifier: ^8 version: 8.4.38 tailwindcss: specifier: ^3.4.3 - version: 3.4.10(ts-node@10.9.2) + version: 3.4.3(ts-node@10.9.2) typescript: specifier: ^5.5.3 version: 5.5.3 @@ -760,13 +763,13 @@ importers: version: 2.1.3 next: specifier: 14.2.10 - version: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.3.1)(react@18.3.1) posthog-js: specifier: ^1.130.1 - version: 1.179.0 + version: 1.130.1 prism-react-renderer: specifier: ^2.3.1 version: 2.3.1(react@18.3.1) @@ -796,7 +799,7 @@ importers: version: 2.3.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.10) + version: 1.0.7(tailwindcss@3.4.3) xterm-for-react: specifier: ^1.0.4 version: 1.0.4(react-dom@18.3.1)(react@18.3.1) @@ -821,10 +824,10 @@ importers: version: 8.4.38 tailwind-scrollbar: specifier: ^3.1.0 - version: 3.1.0(tailwindcss@3.4.10) + version: 3.1.0(tailwindcss@3.4.3) tailwindcss: specifier: ^3.4.3 - version: 3.4.10(ts-node@10.9.2) + version: 3.4.3(ts-node@10.9.2) typescript: specifier: ^5.5.3 version: 5.5.3 @@ -863,7 +866,7 @@ importers: version: link:../../internal/worker-logging ai: specifier: ^3.0.23 - version: 3.4.7(openai@4.52.1)(react@18.3.1)(svelte@5.1.9)(vue@3.5.12)(zod@3.23.8) + version: 3.0.23(react@18.3.1)(solid-js@1.9.3)(svelte@4.2.19)(vue@3.5.12)(zod@3.23.8) drizzle-orm: specifier: generated version: 0.32.0-aaf764c(@cloudflare/workers-types@4.20240603.0)(@planetscale/database@1.18.0)(react@18.3.1) @@ -882,7 +885,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: ^0.4.1 - version: 0.4.1(@cloudflare/workers-types@4.20240603.0)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.5.3) + version: 0.4.5(@cloudflare/workers-types@4.20240603.0)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.5.3) '@cloudflare/workers-types': specifier: ^4.20240603.0 version: 4.20240603.0 @@ -915,13 +918,13 @@ importers: version: 1.18.0 '@trigger.dev/nextjs': specifier: ^3.1.0 - version: 3.1.0(@trigger.dev/sdk@3.1.0)(next@14.2.10) + version: 3.1.2(@trigger.dev/sdk@3.1.2)(next@14.2.10) '@trigger.dev/sdk': specifier: ^3.1.0 - version: 3.1.0 + version: 3.1.2 '@trigger.dev/slack': specifier: ^3.1.0 - version: 3.1.0 + version: 3.1.2 '@unkey/billing': specifier: workspace:^ version: link:../../internal/billing @@ -942,7 +945,7 @@ importers: version: 0.32.0-aaf764c(@opentelemetry/api@1.4.1)(@planetscale/database@1.18.0)(@types/react@18.3.11)(react@18.3.1) next: specifier: 14.2.10 - version: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) react: specifier: ^18 version: 18.3.1 @@ -1066,7 +1069,7 @@ importers: version: 5.0.7 next: specifier: 14.2.10 - version: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) next-mdx-remote: specifier: ^4.4.1 version: 4.4.1(react-dom@18.3.1)(react@18.3.1) @@ -1108,7 +1111,7 @@ importers: version: 2.3.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.10) + version: 1.0.7(tailwindcss@3.4.3) vaul: specifier: ^0.9.0 version: 0.9.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -1121,7 +1124,7 @@ importers: version: 0.7.2(typescript@5.5.3) '@content-collections/mdx': specifier: ^0.1.3 - version: 0.1.3(@content-collections/core@0.7.2)(acorn@8.14.0)(react-dom@18.3.1)(react@18.3.1) + version: 0.1.3(@content-collections/core@0.7.2)(react-dom@18.3.1)(react@18.3.1) '@content-collections/next': specifier: ^0.2.0 version: 0.2.0(@content-collections/core@0.7.2)(next@14.2.10) @@ -1130,10 +1133,10 @@ importers: version: 4.9.5(react@18.3.1) '@tailwindcss/aspect-ratio': specifier: ^0.4.2 - version: 0.4.2(tailwindcss@3.4.10) + version: 0.4.2(tailwindcss@3.4.3) '@tailwindcss/typography': specifier: ^0.5.12 - version: 0.5.12(tailwindcss@3.4.10) + version: 0.5.12(tailwindcss@3.4.3) '@types/fslightbox-react': specifier: ^1.7.7 version: 1.7.7 @@ -1154,13 +1157,13 @@ importers: version: 0.0.32 autoprefixer: specifier: ^10.4.19 - version: 10.4.20(postcss@8.4.38) + version: 10.4.19(postcss@8.4.38) postcss: specifier: ^8 version: 8.4.38 tailwindcss: specifier: ^3.4.3 - version: 3.4.10(ts-node@10.9.2) + version: 3.4.3(ts-node@10.9.2) typescript: specifier: ^5.5.3 version: 5.5.3 @@ -1175,7 +1178,7 @@ importers: version: link:../../packages/error ai: specifier: ^3.0.23 - version: 3.4.7(openai@4.52.1)(react@18.3.1)(svelte@5.1.9)(vue@3.5.12)(zod@3.23.8) + version: 3.4.7(react@18.3.1)(svelte@5.1.9)(vue@3.5.12)(zod@3.23.8) zod: specifier: ^3.23.5 version: 3.23.8 @@ -1197,7 +1200,7 @@ importers: devDependencies: checkly: specifier: latest - version: 4.9.1(@types/node@20.14.9)(typescript@5.5.3) + version: 4.9.0(@types/node@20.14.9)(typescript@5.5.3) ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@20.14.9)(typescript@5.5.3) @@ -1216,7 +1219,7 @@ importers: devDependencies: typescript: specifier: ^5.5.3 - version: 5.5.3 + version: 5.5.4 internal/db: dependencies: @@ -1418,7 +1421,7 @@ importers: version: 18.3.1 react-email: specifier: 2.1.1 - version: 2.1.1(@babel/core@7.26.0)(eslint@9.14.0)(ts-node@10.9.2) + version: 2.1.1(@babel/core@7.25.2)(eslint@9.14.0)(ts-node@10.9.2) resend: specifier: ^4.0.0 version: 4.0.0(react-dom@18.3.1)(react@18.3.1) @@ -1464,7 +1467,7 @@ importers: version: link:../tsconfig typescript: specifier: ^5.5.3 - version: 5.5.3 + version: 5.5.4 internal/vercel: dependencies: @@ -1540,7 +1543,7 @@ importers: version: 1.31.3 next: specifier: ^14.2.10 - version: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) tsup: specifier: ^8.0.2 version: 8.0.2(ts-node@10.9.2)(typescript@5.5.3) @@ -1606,7 +1609,7 @@ importers: version: 20.14.9 next: specifier: ^14.2.10 - version: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) tsup: specifier: ^8.0.2 version: 8.0.2(ts-node@10.9.2)(typescript@5.5.3) @@ -1746,17 +1749,11 @@ importers: packages: - /@actions/core@1.11.1: - resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} + /@actions/core@1.10.1: + resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==} dependencies: - '@actions/exec': 1.1.1 '@actions/http-client': 2.2.3 - dev: false - - /@actions/exec@1.1.1: - resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} - dependencies: - '@actions/io': 1.1.3 + uuid: 8.3.2 dev: false /@actions/github@5.1.1: @@ -1777,10 +1774,6 @@ packages: undici: 5.28.4 dev: false - /@actions/io@1.1.3: - resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} - dev: false - /@agentic/core@7.0.0(zod@3.23.8): resolution: {integrity: sha512-XkrjMf8kFxzbOqoaDIZwg8JCU+FLhn2JOQBtfqFmkVz2qtmKKgGLPwQXTmspnkjThIGYPMaWn6HRpkH8Y7w5rg==} peerDependencies: @@ -1791,7 +1784,7 @@ packages: delay: 6.0.0 hash-object: 5.0.1 is-relative-url: 4.0.0 - jsonrepair: 3.9.0 + jsonrepair: 3.10.0 ky: 1.7.2 normalize-url: 8.0.1 p-map: 7.0.2 @@ -1827,6 +1820,22 @@ packages: zod: 3.23.8 dev: false + /@ai-sdk/provider-utils@0.0.1(zod@3.23.8): + resolution: {integrity: sha512-DpD58qFYHoPffBcODPL5od/zAsFSLymwEdtP/QqNX8qE3oQcRG9GYHbj1fZTH5b9i7COwlnJ4wYzYSkXVyd3bA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + dependencies: + '@ai-sdk/provider': 0.0.0 + eventsource-parser: 1.1.2 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + zod: 3.23.8 + dev: false + /@ai-sdk/provider-utils@1.0.20(zod@3.23.8): resolution: {integrity: sha512-ngg/RGpnA00eNOWEtXHenpX1MsM2QshQh4QJFjUfwcqHpM5kTfG7je7Rc3HcEDP+OkRVv2GF+X4fC1Vfcnl8Ow==} engines: {node: '>=18'} @@ -1843,6 +1852,13 @@ packages: zod: 3.23.8 dev: false + /@ai-sdk/provider@0.0.0: + resolution: {integrity: sha512-Gbl9Ei8NPtM85gB/o8cY7s7CLGxK/U6QVheVaI3viFn7o6IpTfy1Ja389e2FXVMNJ4WHK2qYWSp5fAFDuKulTA==} + engines: {node: '>=18'} + dependencies: + json-schema: 0.4.0 + dev: false + /@ai-sdk/provider@0.0.24: resolution: {integrity: sha512-XMsNGJdGO+L0cxhhegtqZ8+T6nn4EoShS819OvCgI2kLbYTIvk0GWFGD0AXJmxkxs3DrpsJxKAFukFR7bvTkgQ==} engines: {node: '>=18'} @@ -2036,7 +2052,7 @@ packages: /@antv/dom-util@2.0.4: resolution: {integrity: sha512-2shXUl504fKwt82T3GkuT4Uoc6p9qjCKnJ8gXGLSW4T1W37dqf9AV28aCfoVPHp2BUXpSsB+PAJX2rG/jLHsLQ==} dependencies: - tslib: 2.8.1 + tslib: 2.8.0 dev: false /@antv/event-emitter@0.1.3: @@ -2209,7 +2225,7 @@ packages: '@antv/matrix-util': 3.1.0-beta.3 '@antv/path-util': 2.0.15 '@antv/util': 2.0.17 - ml-matrix: 6.12.0 + ml-matrix: 6.11.1 tslib: 2.8.1 dev: false @@ -2239,7 +2255,7 @@ packages: '@antv/g6-core': 0.8.24 '@antv/g6-element': 0.8.24(@antv/g6@4.8.24) '@antv/g6-plugin': 0.8.24(@antv/g6@4.8.24) - '@antv/hierarchy': 0.6.14 + '@antv/hierarchy': 0.6.13 '@antv/layout': 0.3.25(dagre@0.8.5) '@antv/matrix-util': 3.1.0-beta.3 '@antv/path-util': 2.0.15 @@ -2248,7 +2264,7 @@ packages: d3-force: 2.1.1 dagre: 0.8.5 insert-css: 2.0.0 - ml-matrix: 6.12.0 + ml-matrix: 6.11.1 tslib: 2.8.1 transitivePeerDependencies: - '@antv/g6' @@ -2283,8 +2299,8 @@ packages: resolution: {integrity: sha512-hhJOMThec51nU4Fe5p/viLlNIL71uDEgYFzKPajWjr2715SFG1HAgiP6AVylIeqBcAZ04u3Lw7usjl/TuI5RuQ==} dev: false - /@antv/hierarchy@0.6.14: - resolution: {integrity: sha512-V3uknf7bhynOqQDw2sg+9r9DwZ9pc6k/EcqyTFdfXB1+ydr7urisP0MipIuimucvQKN+Qkd+d6w601r1UIroqQ==} + /@antv/hierarchy@0.6.13: + resolution: {integrity: sha512-gBC0bYXyBVrprWyR0hqINNYfeovxdIcKBAR7x6DfNyN1Gc3hGaSo0wif6Lrv/aWVHz17FeQlVsf8rgEx343FHg==} dev: false /@antv/layout@0.1.31: @@ -2293,7 +2309,7 @@ packages: '@antv/g-webgpu': 0.5.5 '@dagrejs/graphlib': 2.1.4 d3-force: 2.1.1 - ml-matrix: 6.12.0 + ml-matrix: 6.11.1 dev: false /@antv/layout@0.3.25(dagre@0.8.5): @@ -2301,7 +2317,7 @@ packages: dependencies: '@antv/g-webgpu': 0.7.2 '@antv/graphlib': 1.2.0 - '@antv/util': 3.3.10 + '@antv/util': 3.3.8 d3-force: 2.1.1 d3-quadtree: 2.0.0 dagre-compound: 0.0.11(dagre@0.8.5) @@ -2354,11 +2370,11 @@ packages: resolution: {integrity: sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==} dependencies: csstype: 3.1.3 - tslib: 2.8.1 + tslib: 2.8.0 dev: false - /@antv/util@3.3.10: - resolution: {integrity: sha512-basGML3DFA3O87INnzvDStjzS+n0JLEhRnRsDzP9keiXz8gT1z/fTdmJAZFOzMMWxy+HKbi7NbSt0+8vz/OsBQ==} + /@antv/util@3.3.8: + resolution: {integrity: sha512-RO2vmp84adfZn5HVXuNtHr35PRWthw4oCUv0hn9DmEWwOJSeU6NtDCEg9KvU8sH2bJaS3fe/cppNSVy2L8tOaw==} dependencies: fast-deep-equal: 3.1.3 gl-matrix: 3.4.3 @@ -2397,8 +2413,8 @@ packages: openapi-types: 12.1.3 dev: true - /@asteasolutions/zod-to-openapi@7.2.0(zod@3.23.8): - resolution: {integrity: sha512-Va+Fq1QzKkSgmiYINSp3cASFhMsbdRH/kmCk2feijhC+yNjGoC056CRqihrVFhR8MY8HOZHdlYm2Ns2lmszCiw==} + /@asteasolutions/zod-to-openapi@7.1.1(zod@3.23.8): + resolution: {integrity: sha512-lF0d1gAc0lYLO9/BAGivwTwE2Sh9h6CHuDcbk5KnGBfIuAsAkDC+Fdat4dkQY3CS/zUWKHRmFEma0B7X132Ymw==} peerDependencies: zod: ^3.20.2 dependencies: @@ -2414,32 +2430,31 @@ packages: uuid: 8.3.2 dev: false - /@babel/code-frame@7.26.2: - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@babel/highlight': 7.24.7 + picocolors: 1.1.0 - /@babel/compat-data@7.26.2: - resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + /@babel/compat-data@7.25.4: + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.26.0: - resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + /@babel/core@7.25.2: + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.2 - '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -2448,116 +2463,161 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.26.2: - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + /@babel/generator@7.25.6: + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 + jsesc: 2.5.2 - /@babel/helper-compilation-targets@7.25.9: - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + /@babel/helper-compilation-targets@7.25.2: + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.26.2 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.2 + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-module-imports@7.25.9: - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0): - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color + + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color + /@babel/helper-string-parser@7.24.8: + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.25.9: resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.25.9: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + dev: false - /@babel/helper-validator-option@7.25.9: - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + /@babel/helper-validator-option@7.24.8: + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - /@babel/helpers@7.26.0: - resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + /@babel/helpers@7.25.6: + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.0 /@babel/parser@7.24.1: resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.25.6 dev: false + /@babel/parser@7.25.6: + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.25.6 + /@babel/parser@7.26.2: resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.26.0 + dev: false - /@babel/runtime@7.26.0: - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + /@babel/runtime@7.25.6: + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 - /@babel/template@7.25.9: - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + /@babel/template@7.25.0: + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 - /@babel/traverse@7.25.9: - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + /@babel/traverse@7.25.6: + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color + /@babel/types@7.25.6: + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + /@babel/types@7.26.0: resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + dev: false /@bany/curl-to-json@1.2.8: resolution: {integrity: sha512-hPt9KUM2sGZ5Ojx3O9utjzUgjRZI3CZPAlLf+cRY9EUzVs7tWt1OpA0bhEUTX2PEEkOeyZ6sC0tAQMOHh9ld+Q==} @@ -2665,13 +2725,14 @@ packages: statuses: 2.0.1 dev: true - /@changesets/apply-release-plan@7.0.5: - resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + /@changesets/apply-release-plan@7.0.4: + resolution: {integrity: sha512-HLFwhKWayKinWAul0Vj+76jVx1Pc2v55MGPVjZ924Y/ROeSsBMFutv9heHmCUj48lJyRfOTJG5+ar+29FUky/A==} dependencies: - '@changesets/config': 3.0.3 + '@babel/runtime': 7.25.6 + '@changesets/config': 3.0.2 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.1 - '@changesets/should-skip-package': 0.1.1 + '@changesets/git': 3.0.0 + '@changesets/should-skip-package': 0.1.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 @@ -2683,12 +2744,13 @@ packages: semver: 7.6.3 dev: true - /@changesets/assemble-release-plan@6.0.4: - resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + /@changesets/assemble-release-plan@6.0.3: + resolution: {integrity: sha512-bLNh9/Lgl1VwkjWZTq8JmRqH+hj7/Yzfz0jsQ/zJJ+FTmVqmqPj3szeKOri8O/hEM8JmHW019vh2gTO9iq5Cuw==} dependencies: + '@babel/runtime': 7.25.6 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/should-skip-package': 0.1.1 + '@changesets/get-dependents-graph': 2.1.1 + '@changesets/should-skip-package': 0.1.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 semver: 7.6.3 @@ -2704,20 +2766,20 @@ packages: resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} hasBin: true dependencies: - '@babel/runtime': 7.26.0 - '@changesets/apply-release-plan': 7.0.5 - '@changesets/assemble-release-plan': 6.0.4 + '@babel/runtime': 7.25.6 + '@changesets/apply-release-plan': 7.0.4 + '@changesets/assemble-release-plan': 6.0.3 '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.3 + '@changesets/config': 3.0.2 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.4 - '@changesets/git': 3.0.1 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 + '@changesets/get-dependents-graph': 2.1.1 + '@changesets/get-release-plan': 4.0.3 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 '@changesets/types': 6.0.0 - '@changesets/write': 0.3.2 + '@changesets/write': 0.3.1 '@manypkg/get-packages': 1.1.3 '@types/semver': 7.5.8 ansi-colors: 4.1.3 @@ -2738,12 +2800,12 @@ packages: tty-table: 4.2.3 dev: true - /@changesets/config@3.0.3: - resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + /@changesets/config@3.0.2: + resolution: {integrity: sha512-cdEhS4t8woKCX2M8AotcV2BOWnBp09sqICxKapgLHf9m5KdENpWjyrFNMjkLqGJtUys9U+w93OxWT0czorVDfw==} dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/logger': 0.1.1 + '@changesets/get-dependents-graph': 2.1.1 + '@changesets/logger': 0.1.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 @@ -2756,22 +2818,24 @@ packages: extendable-error: 0.1.7 dev: true - /@changesets/get-dependents-graph@2.1.2: - resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + /@changesets/get-dependents-graph@2.1.1: + resolution: {integrity: sha512-LRFjjvigBSzfnPU2n/AhFsuWR5DK++1x47aq6qZ8dzYsPtS/I5mNhIGAS68IAxh1xjO9BTtz55FwefhANZ+FCA==} dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 + chalk: 2.4.2 + fs-extra: 7.0.1 semver: 7.6.3 dev: true - /@changesets/get-release-plan@4.0.4: - resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + /@changesets/get-release-plan@4.0.3: + resolution: {integrity: sha512-6PLgvOIwTSdJPTtpdcr3sLtGatT+Jr22+cQwEBJBy6wP0rjB4yJ9lv583J9fVpn1bfQlBkDa8JxbS2g/n9lIyA==} dependencies: - '@changesets/assemble-release-plan': 6.0.4 - '@changesets/config': 3.0.3 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 + '@babel/runtime': 7.25.6 + '@changesets/assemble-release-plan': 6.0.3 + '@changesets/config': 3.0.2 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 dev: true @@ -2780,20 +2844,22 @@ packages: resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} dev: true - /@changesets/git@3.0.1: - resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + /@changesets/git@3.0.0: + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} dependencies: + '@babel/runtime': 7.25.6 '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 micromatch: 4.0.8 spawndamnit: 2.0.0 dev: true - /@changesets/logger@0.1.1: - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + /@changesets/logger@0.1.0: + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} dependencies: - picocolors: 1.1.1 + chalk: 2.4.2 dev: true /@changesets/parse@0.4.0: @@ -2803,30 +2869,33 @@ packages: js-yaml: 3.14.1 dev: true - /@changesets/pre@2.0.1: - resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + /@changesets/pre@2.0.0: + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} dependencies: + '@babel/runtime': 7.25.6 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 dev: true - /@changesets/read@0.6.1: - resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + /@changesets/read@0.6.0: + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} dependencies: - '@changesets/git': 3.0.1 - '@changesets/logger': 0.1.1 + '@babel/runtime': 7.25.6 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 '@changesets/parse': 0.4.0 '@changesets/types': 6.0.0 + chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 - picocolors: 1.1.1 dev: true - /@changesets/should-skip-package@0.1.1: - resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + /@changesets/should-skip-package@0.1.0: + resolution: {integrity: sha512-FxG6Mhjw7yFStlSM7Z0Gmg3RiyQ98d/9VpQAZ3Fzr59dCOM9G6ZdYbjiSAt0XtFr9JR5U2tBaJWPjrkGGc618g==} dependencies: + '@babel/runtime': 7.25.6 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 dev: true @@ -2839,9 +2908,10 @@ packages: resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} dev: true - /@changesets/write@0.3.2: - resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + /@changesets/write@0.3.1: + resolution: {integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==} dependencies: + '@babel/runtime': 7.25.6 '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 @@ -2857,7 +2927,7 @@ packages: /@clack/core@0.3.4: resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} dependencies: - picocolors: 1.1.1 + picocolors: 1.1.0 sisteransi: 1.0.5 dev: true @@ -2865,7 +2935,7 @@ packages: resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} dependencies: '@clack/core': 0.3.4 - picocolors: 1.1.1 + picocolors: 1.0.1 sisteransi: 1.0.5 dev: true bundledDependencies: @@ -2930,7 +3000,7 @@ packages: '@clerk/clerk-sdk-node': 4.13.12(react@18.3.1) '@clerk/shared': 1.4.0(react@18.3.1) '@clerk/types': 3.63.0 - next: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) path-to-regexp: 6.2.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -2989,8 +3059,8 @@ packages: mime: 3.0.0 dev: true - /@cloudflare/vitest-pool-workers@0.4.1(@cloudflare/workers-types@4.20240603.0)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.5.3): - resolution: {integrity: sha512-ss/EcmM+hHvRGTZswavbnJPgPHjlBIfNFSlm9fwXpa9Jl/qJLA73KwoeLtecyrMOeDWBsePM6g4FwhFQWg3QvA==} + /@cloudflare/vitest-pool-workers@0.4.5(@cloudflare/workers-types@4.20240603.0)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.5.3): + resolution: {integrity: sha512-YpYPw6iwGr3sWITZaYnh3bH92Khq+dhBOCyqTf1dwzRxNDYCUtaInLD+uEfZnv9A9sizs5oH1a7ptdZOd0oS/g==} peerDependencies: '@vitest/runner': 1.3.x - 1.5.x '@vitest/snapshot': 1.3.x - 1.5.x @@ -2999,13 +3069,13 @@ packages: '@vitest/runner': 1.5.3 '@vitest/snapshot': 1.5.3 birpc: 0.2.14 - cjs-module-lexer: 1.4.1 + cjs-module-lexer: 1.4.0 devalue: 4.3.3 esbuild: 0.17.19 - miniflare: 3.20240524.2 + miniflare: 3.20240610.0 semver: 7.6.3 vitest: 1.5.3(@types/node@20.14.9)(@vitest/ui@1.6.0) - wrangler: 3.59.0(@cloudflare/workers-types@4.20240603.0) + wrangler: 3.60.3(@cloudflare/workers-types@4.20240603.0) zod: 3.23.8 transitivePeerDependencies: - '@cloudflare/workers-types' @@ -3014,8 +3084,8 @@ packages: - utf-8-validate dev: true - /@cloudflare/vitest-pool-workers@0.4.1(@cloudflare/workers-types@4.20240603.0)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.6.0): - resolution: {integrity: sha512-ss/EcmM+hHvRGTZswavbnJPgPHjlBIfNFSlm9fwXpa9Jl/qJLA73KwoeLtecyrMOeDWBsePM6g4FwhFQWg3QvA==} + /@cloudflare/vitest-pool-workers@0.4.5(@cloudflare/workers-types@4.20240603.0)(@vitest/runner@1.5.3)(@vitest/snapshot@1.5.3)(vitest@1.6.0): + resolution: {integrity: sha512-YpYPw6iwGr3sWITZaYnh3bH92Khq+dhBOCyqTf1dwzRxNDYCUtaInLD+uEfZnv9A9sizs5oH1a7ptdZOd0oS/g==} peerDependencies: '@vitest/runner': 1.3.x - 1.5.x '@vitest/snapshot': 1.3.x - 1.5.x @@ -3024,13 +3094,13 @@ packages: '@vitest/runner': 1.5.3 '@vitest/snapshot': 1.5.3 birpc: 0.2.14 - cjs-module-lexer: 1.4.1 + cjs-module-lexer: 1.4.0 devalue: 4.3.3 esbuild: 0.17.19 - miniflare: 3.20240524.2 + miniflare: 3.20240610.0 semver: 7.6.3 vitest: 1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0) - wrangler: 3.59.0(@cloudflare/workers-types@4.20240603.0) + wrangler: 3.60.3(@cloudflare/workers-types@4.20240603.0) zod: 3.23.8 transitivePeerDependencies: - '@cloudflare/workers-types' @@ -3039,8 +3109,8 @@ packages: - utf-8-validate dev: true - /@cloudflare/workerd-darwin-64@1.20240524.0: - resolution: {integrity: sha512-ATaXjefbTsrv4mpn4Fdua114RRDXcX5Ky+Mv+f4JTUllgalmqC4CYMN4jxRz9IpJU/fNMN8IEfvUyuJBAcl9Iw==} + /@cloudflare/workerd-darwin-64@1.20240610.1: + resolution: {integrity: sha512-YanZ1iXgMGaUWlleB5cswSE6qbzyjQ8O7ENWZcPAcZZ6BfuL7q3CWi0t9iM1cv2qx92rRztsRTyjcfq099++XQ==} engines: {node: '>=16'} cpu: [x64] os: [darwin] @@ -3057,8 +3127,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20240524.0: - resolution: {integrity: sha512-wnbsZI4CS0QPCd+wnBHQ40C28A/2Qo4ESi1YhE2735G3UNcc876MWksZhsubd+XH0XPIra6eNFqyw6wRMpQOXA==} + /@cloudflare/workerd-darwin-arm64@1.20240610.1: + resolution: {integrity: sha512-bRe/y/LKjIgp3L2EHjc+CvoCzfHhf4aFTtOBkv2zW+VToNJ4KlXridndf7LvR9urfsFRRo9r4TXCssuKaU+ypQ==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] @@ -3075,8 +3145,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-64@1.20240524.0: - resolution: {integrity: sha512-E8mj+HPBryKwaJAiNsYzXtVjKCL0KvUBZbtxJxlWM4mLSQhT+uwGT3nydb/hFY59rZnQgZslw0oqEWht5TEYiQ==} + /@cloudflare/workerd-linux-64@1.20240610.1: + resolution: {integrity: sha512-2zDcadR7+Gs9SjcMXmwsMji2Xs+yASGNA2cEHDuFc4NMUup+eL1mkzxc/QzvFjyBck98e92rBjMZt2dVscpGKg==} engines: {node: '>=16'} cpu: [x64] os: [linux] @@ -3093,8 +3163,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-arm64@1.20240524.0: - resolution: {integrity: sha512-/Fr1W671t2triNCDCBWdStxngnbUfZunZ/2e4kaMLzJDJLYDtYdmvOUCBDzUD4ssqmIMbn9RCQQ0U+CLEoqBqw==} + /@cloudflare/workerd-linux-arm64@1.20240610.1: + resolution: {integrity: sha512-7y41rPi5xmIYJN8CY+t3RHnjLL0xx/WYmaTd/j552k1qSr02eTE2o/TGyWZmGUC+lWnwdPQJla0mXbvdqgRdQg==} engines: {node: '>=16'} cpu: [arm64] os: [linux] @@ -3111,8 +3181,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-windows-64@1.20240524.0: - resolution: {integrity: sha512-G+ThDEx57g9mAEKqhWnHaaJgpeGYtyhkmwM/BDpLqPks/rAY5YEfZbY4YL1pNk1kkcZDXGrwIsY8xe9Apf5JdA==} + /@cloudflare/workerd-windows-64@1.20240610.1: + resolution: {integrity: sha512-B0LyT3DB6rXHWNptnntYHPaoJIy0rXnGfeDBM3nEVV8JIsQrx8MEFn2F2jYioH1FkUVavsaqKO/zUosY3tZXVA==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -3166,7 +3236,7 @@ packages: '@commitlint/types': 19.5.0 chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.5.3) - cosmiconfig-typescript-loader: 5.1.0(@types/node@20.14.9)(cosmiconfig@9.0.0)(typescript@5.5.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.14.9)(cosmiconfig@9.0.0)(typescript@5.5.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -3203,7 +3273,7 @@ packages: peerDependencies: typescript: ^5.0.2 dependencies: - '@parcel/watcher': 2.5.0 + '@parcel/watcher': 2.4.1 camelcase: 8.0.0 esbuild: 0.21.5 gray-matter: 4.0.3 @@ -3213,7 +3283,7 @@ packages: serialize-javascript: 6.0.2 tinyglobby: 0.2.10 typescript: 5.5.3 - yaml: 2.6.0 + yaml: 2.5.0 zod: 3.23.8 dev: true @@ -3225,7 +3295,7 @@ packages: '@content-collections/core': 0.7.2(typescript@5.5.3) dev: true - /@content-collections/mdx@0.1.3(@content-collections/core@0.7.2)(acorn@8.14.0)(react-dom@18.3.1)(react@18.3.1): + /@content-collections/mdx@0.1.3(@content-collections/core@0.7.2)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-YnZVCppJsA3FgPMtctyL3RqcrLFbGWoi3D8xfDSdx9Yuu9HdIQjgAhrLo+XNQLngTeHaRUBNJfwhYEfAxV84PA==} peerDependencies: '@content-collections/core': 0.x @@ -3234,12 +3304,11 @@ packages: dependencies: '@content-collections/core': 0.7.2(typescript@5.5.3) esbuild: 0.19.12 - mdx-bundler: 10.0.3(acorn@8.14.0)(esbuild@0.19.12) + mdx-bundler: 10.0.3(esbuild@0.19.12) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) unified: 11.0.5 transitivePeerDependencies: - - acorn - supports-color dev: true @@ -3251,7 +3320,7 @@ packages: dependencies: '@content-collections/core': 0.7.2(typescript@5.5.3) '@content-collections/integrations': 0.1.1(@content-collections/core@0.7.2) - next: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) dev: true /@cspotcode/source-map-support@0.8.1: @@ -3271,8 +3340,8 @@ packages: engines: {node: '>=10.0.0'} dev: false - /@drizzle-team/brocli@0.10.2: - resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + /@drizzle-team/brocli@0.10.1: + resolution: {integrity: sha512-AHy0vjc+n/4w/8Mif+w86qpppHuF3AyXbcWW+R/W7GNA3F5/p2nuhlkCJaTXSLZheB4l1rtHzOfr9A7NwoR/Zg==} dev: true /@electric-sql/client@0.6.3: @@ -3342,7 +3411,6 @@ packages: /@esbuild-kit/core-utils@3.3.2: resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - deprecated: 'Merged into tsx: https://tsx.is' dependencies: esbuild: 0.18.20 source-map-support: 0.5.21 @@ -3350,10 +3418,9 @@ packages: /@esbuild-kit/esm-loader@2.6.5: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} - deprecated: 'Merged into tsx: https://tsx.is' dependencies: '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.8.1 + get-tsconfig: 4.8.0 dev: true /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19): @@ -4860,32 +4927,32 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - /@floating-ui/core@1.6.8: - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + /@floating-ui/core@1.6.7: + resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} dependencies: - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.7 - /@floating-ui/dom@1.6.12: - resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + /@floating-ui/dom@1.6.10: + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} dependencies: - '@floating-ui/core': 1.6.8 - '@floating-ui/utils': 0.2.8 + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 - /@floating-ui/react-dom@2.1.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + /@floating-ui/react-dom@2.1.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.6.12 + '@floating-ui/dom': 1.6.10 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - /@floating-ui/utils@0.2.8: - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + /@floating-ui/utils@0.2.7: + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} - /@formatjs/intl-localematcher@0.5.7: - resolution: {integrity: sha512-GGFtfHGQVFe/niOZp24Kal5b2i36eE2bNL0xi9Sg/yd0TR8aLjcteApZdHmismP5QQax1cMnZM9yWySUUjJteA==} + /@formatjs/intl-localematcher@0.5.4: + resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==} dependencies: tslib: 2.8.1 dev: false @@ -4929,7 +4996,7 @@ packages: hono: '>=3.11.3' zod: 3.* dependencies: - '@asteasolutions/zod-to-openapi': 7.2.0(zod@3.23.8) + '@asteasolutions/zod-to-openapi': 7.1.1(zod@3.23.8) '@hono/zod-validator': 0.2.1(hono@4.6.3)(zod@3.23.8) hono: 4.6.3 zod: 3.23.8 @@ -4976,8 +5043,8 @@ packages: engines: {node: '>=18.18'} dev: false - /@humanwhocodes/retry@0.4.0: - resolution: {integrity: sha512-xnRgu9DxZbkWak/te3fcytNyp8MTbuiZIaueg2rgEvBuN55n04nwLYLU9TX/VVlusc9L2ZNXi99nUFNkHXtr5g==} + /@humanwhocodes/retry@0.4.1: + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} dev: false @@ -4989,6 +5056,18 @@ packages: requiresBuild: true optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-darwin-arm64@0.33.5: + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + dev: true optional: true /@img/sharp-darwin-x64@0.33.4: @@ -4999,6 +5078,18 @@ packages: requiresBuild: true optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.5: + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + dev: true optional: true /@img/sharp-libvips-darwin-arm64@1.0.2: @@ -5007,6 +5098,15 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.4: + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true optional: true /@img/sharp-libvips-darwin-x64@1.0.2: @@ -5015,6 +5115,15 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.4: + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true optional: true /@img/sharp-libvips-linux-arm64@1.0.2: @@ -5023,6 +5132,15 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.4: + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true /@img/sharp-libvips-linux-arm@1.0.2: @@ -5031,6 +5149,15 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.5: + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true optional: true /@img/sharp-libvips-linux-s390x@1.0.2: @@ -5039,6 +5166,15 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.4: + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true optional: true /@img/sharp-libvips-linux-x64@1.0.2: @@ -5047,6 +5183,15 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.4: + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true /@img/sharp-libvips-linuxmusl-arm64@1.0.2: @@ -5055,6 +5200,15 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.4: + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true /@img/sharp-libvips-linuxmusl-x64@1.0.2: @@ -5063,6 +5217,15 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.4: + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true /@img/sharp-linux-arm64@0.33.4: @@ -5073,6 +5236,18 @@ packages: requiresBuild: true optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.5: + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + dev: true optional: true /@img/sharp-linux-arm@0.33.4: @@ -5083,6 +5258,18 @@ packages: requiresBuild: true optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.5: + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + dev: true optional: true /@img/sharp-linux-s390x@0.33.4: @@ -5093,6 +5280,18 @@ packages: requiresBuild: true optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.5: + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + dev: true optional: true /@img/sharp-linux-x64@0.33.4: @@ -5103,6 +5302,18 @@ packages: requiresBuild: true optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.5: + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + dev: true optional: true /@img/sharp-linuxmusl-arm64@0.33.4: @@ -5113,6 +5324,18 @@ packages: requiresBuild: true optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.5: + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + dev: true optional: true /@img/sharp-linuxmusl-x64@0.33.4: @@ -5123,6 +5346,18 @@ packages: requiresBuild: true optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.5: + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + dev: true optional: true /@img/sharp-wasm32@0.33.4: @@ -5132,6 +5367,17 @@ packages: requiresBuild: true dependencies: '@emnapi/runtime': 1.3.1 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.5: + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.3.1 + dev: true optional: true /@img/sharp-win32-ia32@0.33.4: @@ -5140,6 +5386,16 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.5: + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true optional: true /@img/sharp-win32-x64@0.33.4: @@ -5148,26 +5404,37 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.5: + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true optional: true - /@inquirer/confirm@3.2.0: - resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} + /@inquirer/confirm@3.1.22: + resolution: {integrity: sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==} engines: {node: '>=18'} dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 + '@inquirer/core': 9.0.10 + '@inquirer/type': 1.5.2 dev: true - /@inquirer/core@9.2.1: - resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + /@inquirer/core@9.0.10: + resolution: {integrity: sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==} engines: {node: '>=18'} dependencies: - '@inquirer/figures': 1.0.7 - '@inquirer/type': 2.0.0 + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.2 '@types/mute-stream': 0.0.4 - '@types/node': 22.9.0 + '@types/node': 22.5.4 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 + cli-spinners: 2.9.2 cli-width: 4.1.0 mute-stream: 1.0.0 signal-exit: 4.1.0 @@ -5176,20 +5443,13 @@ packages: yoctocolors-cjs: 2.1.2 dev: true - /@inquirer/figures@1.0.7: - resolution: {integrity: sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==} - engines: {node: '>=18'} - dev: true - - /@inquirer/type@1.5.5: - resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + /@inquirer/figures@1.0.5: + resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} engines: {node: '>=18'} - dependencies: - mute-stream: 1.0.0 dev: true - /@inquirer/type@2.0.0: - resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + /@inquirer/type@1.5.2: + resolution: {integrity: sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==} engines: {node: '>=18'} dependencies: mute-stream: 1.0.0 @@ -5322,7 +5582,7 @@ packages: /@libsql/isomorphic-ws@0.1.5: resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} dependencies: - '@types/ws': 8.5.13 + '@types/ws': 8.5.12 ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -5386,7 +5646,7 @@ packages: /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 @@ -5395,7 +5655,7 @@ packages: /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -5403,19 +5663,17 @@ packages: read-yaml-file: 1.1.0 dev: true - /@mdx-js/esbuild@3.1.0(acorn@8.14.0)(esbuild@0.19.12): - resolution: {integrity: sha512-Jk42xUb1SEJxh6n2GBAtJjQISFIZccjz8XVEsHVhrlvZJAJziIxR9KyaFF6nTeTB/jCAFQGDgO7+oMRH/ApRsg==} + /@mdx-js/esbuild@3.0.1(esbuild@0.19.12): + resolution: {integrity: sha512-+KZbCKcRjFtRD6qzD+c70Vq/VPVt5LHFsOshNcsdcONkaLTCSjmM7/uj71i3BcP+170f+P4DwVEMtqR/k0t5aw==} peerDependencies: esbuild: '>=0.14.0' dependencies: - '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + '@mdx-js/mdx': 3.0.1 '@types/unist': 3.0.3 esbuild: 0.19.12 - source-map: 0.7.4 vfile: 6.0.3 vfile-message: 4.0.2 transitivePeerDependencies: - - acorn - supports-color dev: true @@ -5442,8 +5700,8 @@ packages: transitivePeerDependencies: - supports-color - /@mdx-js/mdx@3.1.0(acorn@8.14.0): - resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + /@mdx-js/mdx@3.0.1: + resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} dependencies: '@types/estree': 1.0.6 '@types/estree-jsx': 1.0.5 @@ -5451,18 +5709,17 @@ packages: '@types/mdx': 2.0.13 collapse-white-space: 2.1.0 devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 estree-util-is-identifier-name: 3.0.0 - estree-util-scope: 1.0.0 + estree-util-to-js: 2.0.0 estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.2 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 markdown-extensions: 2.0.0 - recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.14.0) - recma-stringify: 1.0.0 - rehype-recma: 1.0.0 - remark-mdx: 3.1.0 + periscopic: 3.1.0 + remark-mdx: 3.0.1 remark-parse: 11.0.0 - remark-rehype: 11.1.1 + remark-rehype: 11.1.0 source-map: 0.7.4 unified: 11.0.5 unist-util-position-from-estree: 2.0.0 @@ -5470,7 +5727,6 @@ packages: unist-util-visit: 5.0.0 vfile: 6.0.3 transitivePeerDependencies: - - acorn - supports-color /@mdx-js/react@2.3.0(react@18.3.1): @@ -5489,7 +5745,7 @@ packages: isows: 1.0.6(ws@8.18.0) typescript-event-target: 1.1.1 zod: 3.23.8 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - debug - ws @@ -5499,12 +5755,12 @@ packages: resolution: {integrity: sha512-UR1VR/GorYt5bRKBtNeS2ZWj6PZk8RVpwV7WDjWmdbLqLAYv4JlRnkPAImZbJR5R50jsHpopmcqqm4mcbyZwiw==} hasBin: true dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/types': 7.26.0 - '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-tooltip': 1.1.3(react-dom@18.3.1)(react@18.3.1) - '@rollup/pluginutils': 5.1.3 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/types': 7.25.6 + '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tooltip': 1.1.2(react-dom@18.3.1)(react@18.3.1) + '@rollup/pluginutils': 5.1.0 cmdk: 0.2.1(react-dom@18.3.1)(react@18.3.1) esbuild: 0.20.2 escalade: 3.2.0 @@ -5514,7 +5770,7 @@ packages: react-dom: 18.3.1(react@18.3.1) react-draggable: 4.4.6(react-dom@18.3.1)(react@18.3.1) react-reconciler: 0.29.2(react@18.3.1) - unplugin: 1.15.0 + unplugin: 1.12.3 zustand: 4.5.5(@types/react@18.3.11)(react@18.3.1) transitivePeerDependencies: - '@types/react' @@ -5524,7 +5780,6 @@ packages: - immer - rollup - supports-color - - webpack-sources dev: true /@mintlify/cli@4.0.182(openapi-types@12.1.3)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3): @@ -5694,7 +5949,7 @@ packages: '@octokit/rest': 19.0.13 chalk: 5.3.0 chokidar: 3.6.0 - express: 4.21.1 + express: 4.19.2 fs-extra: 11.2.0 got: 13.0.0 gray-matter: 4.0.3 @@ -5703,7 +5958,7 @@ packages: open: 8.4.2 openapi-types: 12.1.3 ora: 6.3.1 - socket.io: 4.8.1 + socket.io: 4.7.5 tar: 6.2.1 unist-util-visit: 4.1.2 yargs: 17.7.2 @@ -5752,7 +6007,7 @@ packages: lodash: 4.17.21 openapi-types: 12.1.3 zod: 3.23.8 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: - debug dev: true @@ -6181,6 +6436,11 @@ packages: engines: {node: '>= 18'} dev: false + /@octokit/auth-token@5.1.1: + resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} + engines: {node: '>= 18'} + dev: false + /@octokit/core@3.6.0: resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} dependencies: @@ -6218,20 +6478,41 @@ packages: '@octokit/graphql': 7.1.0 '@octokit/request': 8.4.0 '@octokit/request-error': 5.1.0 - '@octokit/types': 13.6.1 + '@octokit/types': 13.5.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 dev: false - /@octokit/endpoint@6.0.12: - resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + /@octokit/core@6.1.2: + resolution: {integrity: sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==} + engines: {node: '>= 18'} dependencies: - '@octokit/types': 6.41.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.1 + '@octokit/auth-token': 5.1.1 + '@octokit/graphql': 8.1.1 + '@octokit/request': 9.1.3 + '@octokit/request-error': 6.1.5 + '@octokit/types': 13.5.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.2 dev: false - /@octokit/endpoint@7.0.6: + /@octokit/endpoint@10.1.1: + resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==} + engines: {node: '>= 18'} + dependencies: + '@octokit/types': 13.5.0 + universal-user-agent: 7.0.2 + dev: false + + /@octokit/endpoint@6.0.12: + resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + dependencies: + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.1 + dev: false + + /@octokit/endpoint@7.0.6: resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} engines: {node: '>= 14'} dependencies: @@ -6244,7 +6525,7 @@ packages: resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 13.6.1 + '@octokit/types': 13.5.0 universal-user-agent: 6.0.1 dev: false @@ -6274,10 +6555,19 @@ packages: engines: {node: '>= 18'} dependencies: '@octokit/request': 8.4.0 - '@octokit/types': 13.6.1 + '@octokit/types': 13.5.0 universal-user-agent: 6.0.1 dev: false + /@octokit/graphql@8.1.1: + resolution: {integrity: sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==} + engines: {node: '>= 18'} + dependencies: + '@octokit/request': 9.1.3 + '@octokit/types': 13.5.0 + universal-user-agent: 7.0.2 + dev: false + /@octokit/openapi-types@12.11.0: resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} dev: false @@ -6290,6 +6580,16 @@ packages: resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} dev: false + /@octokit/plugin-paginate-rest@11.3.5(@octokit/core@6.1.2): + resolution: {integrity: sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + dependencies: + '@octokit/core': 6.1.2 + '@octokit/types': 13.6.1 + dev: false + /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} peerDependencies: @@ -6318,6 +6618,25 @@ packages: '@octokit/core': 4.2.4 dev: true + /@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.2): + resolution: {integrity: sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + dependencies: + '@octokit/core': 6.1.2 + dev: false + + /@octokit/plugin-rest-endpoint-methods@13.2.6(@octokit/core@6.1.2): + resolution: {integrity: sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + dependencies: + '@octokit/core': 6.1.2 + '@octokit/types': 13.6.1 + dev: false + /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} peerDependencies: @@ -6359,11 +6678,18 @@ packages: resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 13.6.1 + '@octokit/types': 13.5.0 deprecation: 2.3.1 once: 1.4.0 dev: false + /@octokit/request-error@6.1.5: + resolution: {integrity: sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==} + engines: {node: '>= 18'} + dependencies: + '@octokit/types': 13.5.0 + dev: false + /@octokit/request@5.6.3: resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} dependencies: @@ -6397,10 +6723,20 @@ packages: dependencies: '@octokit/endpoint': 9.0.5 '@octokit/request-error': 5.1.0 - '@octokit/types': 13.6.1 + '@octokit/types': 13.5.0 universal-user-agent: 6.0.1 dev: false + /@octokit/request@9.1.3: + resolution: {integrity: sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==} + engines: {node: '>= 18'} + dependencies: + '@octokit/endpoint': 10.1.1 + '@octokit/request-error': 6.1.5 + '@octokit/types': 13.5.0 + universal-user-agent: 7.0.2 + dev: false + /@octokit/rest@19.0.13: resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} engines: {node: '>= 14'} @@ -6413,6 +6749,16 @@ packages: - encoding dev: true + /@octokit/rest@21.0.2: + resolution: {integrity: sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ==} + engines: {node: '>= 18'} + dependencies: + '@octokit/core': 6.1.2 + '@octokit/plugin-paginate-rest': 11.3.5(@octokit/core@6.1.2) + '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.2) + '@octokit/plugin-rest-endpoint-methods': 13.2.6(@octokit/core@6.1.2) + dev: false + /@octokit/tsconfig@1.0.2: resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} dev: true @@ -6423,6 +6769,12 @@ packages: '@octokit/openapi-types': 18.1.1 dev: true + /@octokit/types@13.5.0: + resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} + dependencies: + '@octokit/openapi-types': 22.2.0 + dev: false + /@octokit/types@13.6.1: resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==} dependencies: @@ -6812,8 +7164,8 @@ packages: engines: {node: '>=14'} dev: false - /@parcel/watcher-android-arm64@2.5.0: - resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==} + /@parcel/watcher-android-arm64@2.4.1: + resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] @@ -6821,8 +7173,8 @@ packages: dev: true optional: true - /@parcel/watcher-darwin-arm64@2.5.0: - resolution: {integrity: sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==} + /@parcel/watcher-darwin-arm64@2.4.1: + resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] @@ -6830,8 +7182,8 @@ packages: dev: true optional: true - /@parcel/watcher-darwin-x64@2.5.0: - resolution: {integrity: sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==} + /@parcel/watcher-darwin-x64@2.4.1: + resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] @@ -6839,8 +7191,8 @@ packages: dev: true optional: true - /@parcel/watcher-freebsd-x64@2.5.0: - resolution: {integrity: sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==} + /@parcel/watcher-freebsd-x64@2.4.1: + resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] @@ -6848,8 +7200,8 @@ packages: dev: true optional: true - /@parcel/watcher-linux-arm-glibc@2.5.0: - resolution: {integrity: sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==} + /@parcel/watcher-linux-arm-glibc@2.4.1: + resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] @@ -6857,17 +7209,8 @@ packages: dev: true optional: true - /@parcel/watcher-linux-arm-musl@2.5.0: - resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@parcel/watcher-linux-arm64-glibc@2.5.0: - resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==} + /@parcel/watcher-linux-arm64-glibc@2.4.1: + resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] @@ -6875,8 +7218,8 @@ packages: dev: true optional: true - /@parcel/watcher-linux-arm64-musl@2.5.0: - resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==} + /@parcel/watcher-linux-arm64-musl@2.4.1: + resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] @@ -6884,8 +7227,8 @@ packages: dev: true optional: true - /@parcel/watcher-linux-x64-glibc@2.5.0: - resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==} + /@parcel/watcher-linux-x64-glibc@2.4.1: + resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] @@ -6893,8 +7236,8 @@ packages: dev: true optional: true - /@parcel/watcher-linux-x64-musl@2.5.0: - resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==} + /@parcel/watcher-linux-x64-musl@2.4.1: + resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] @@ -6902,8 +7245,8 @@ packages: dev: true optional: true - /@parcel/watcher-win32-arm64@2.5.0: - resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==} + /@parcel/watcher-win32-arm64@2.4.1: + resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] @@ -6911,8 +7254,8 @@ packages: dev: true optional: true - /@parcel/watcher-win32-ia32@2.5.0: - resolution: {integrity: sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==} + /@parcel/watcher-win32-ia32@2.4.1: + resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] @@ -6920,8 +7263,8 @@ packages: dev: true optional: true - /@parcel/watcher-win32-x64@2.5.0: - resolution: {integrity: sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==} + /@parcel/watcher-win32-x64@2.4.1: + resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] @@ -6929,29 +7272,27 @@ packages: dev: true optional: true - /@parcel/watcher@2.5.0: - resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==} + /@parcel/watcher@2.4.1: + resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} engines: {node: '>= 10.0.0'} - requiresBuild: true dependencies: detect-libc: 1.0.3 is-glob: 4.0.3 micromatch: 4.0.8 node-addon-api: 7.1.1 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.0 - '@parcel/watcher-darwin-arm64': 2.5.0 - '@parcel/watcher-darwin-x64': 2.5.0 - '@parcel/watcher-freebsd-x64': 2.5.0 - '@parcel/watcher-linux-arm-glibc': 2.5.0 - '@parcel/watcher-linux-arm-musl': 2.5.0 - '@parcel/watcher-linux-arm64-glibc': 2.5.0 - '@parcel/watcher-linux-arm64-musl': 2.5.0 - '@parcel/watcher-linux-x64-glibc': 2.5.0 - '@parcel/watcher-linux-x64-musl': 2.5.0 - '@parcel/watcher-win32-arm64': 2.5.0 - '@parcel/watcher-win32-ia32': 2.5.0 - '@parcel/watcher-win32-x64': 2.5.0 + '@parcel/watcher-android-arm64': 2.4.1 + '@parcel/watcher-darwin-arm64': 2.4.1 + '@parcel/watcher-darwin-x64': 2.4.1 + '@parcel/watcher-freebsd-x64': 2.4.1 + '@parcel/watcher-linux-arm-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-musl': 2.4.1 + '@parcel/watcher-linux-x64-glibc': 2.4.1 + '@parcel/watcher-linux-x64-musl': 2.4.1 + '@parcel/watcher-win32-arm64': 2.4.1 + '@parcel/watcher-win32-ia32': 2.4.1 + '@parcel/watcher-win32-x64': 2.4.1 dev: true /@peculiar/asn1-schema@2.3.13: @@ -6977,7 +7318,7 @@ packages: '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.5 tslib: 2.8.1 - webcrypto-core: 1.8.1 + webcrypto-core: 1.8.0 dev: false /@pkgjs/parseargs@0.11.0: @@ -6990,26 +7331,26 @@ packages: resolution: {integrity: sha512-t2XdOfrVgcF7AW791FtdPS27NyNqcE1SpoXgk3HpziousvUMsJi4Q6NL3JyOBpsMOrvk94749o8yyonvX5quPw==} engines: {node: '>=16'} - /@polka/url@1.0.0-next.28: - resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + /@polka/url@1.0.0-next.25: + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} /@probe.gl/env@3.6.0: resolution: {integrity: sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 dev: false /@probe.gl/log@3.6.0: resolution: {integrity: sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@probe.gl/env': 3.6.0 dev: false /@probe.gl/stats@3.6.0: resolution: {integrity: sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 dev: false /@protobufjs/aspromise@1.1.2: @@ -7085,7 +7426,7 @@ packages: /@radix-ui/number@1.0.1: resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 dev: false /@radix-ui/number@1.1.0: @@ -7095,13 +7436,13 @@ packages: /@radix-ui/primitive@1.0.0: resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 dev: true /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 dev: false /@radix-ui/primitive@1.1.0: @@ -7135,34 +7476,6 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-accordion@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} peerDependencies: @@ -7176,7 +7489,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -7202,7 +7515,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -7242,7 +7555,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -7266,7 +7579,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -7294,7 +7607,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -7336,33 +7649,6 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-collapsible@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: @@ -7376,7 +7662,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -7415,7 +7701,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 react: 18.3.1 dev: true @@ -7428,7 +7714,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@types/react': 18.3.11 react: 18.3.1 dev: false @@ -7450,7 +7736,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 react: 18.3.1 dev: true @@ -7463,7 +7749,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@types/react': 18.3.11 react: 18.3.1 dev: false @@ -7491,6 +7777,7 @@ packages: dependencies: '@types/react': 18.3.11 react: 18.3.1 + dev: false /@radix-ui/react-dialog@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} @@ -7498,7 +7785,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) '@radix-ui/react-context': 1.0.0(react@18.3.1) @@ -7532,7 +7819,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -7553,8 +7840,8 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.3.11)(react@18.3.1) dev: false - /@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} + /@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -7568,13 +7855,13 @@ packages: dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) @@ -7583,7 +7870,7 @@ packages: aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.11)(react@18.3.1) /@radix-ui/react-direction@1.0.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} @@ -7594,7 +7881,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@types/react': 18.3.11 react: 18.3.1 dev: false @@ -7618,7 +7905,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1)(react@18.3.1) @@ -7641,7 +7928,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -7666,7 +7953,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -7700,7 +7987,6 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false /@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} @@ -7724,6 +8010,7 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false /@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} @@ -7756,7 +8043,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 react: 18.3.1 dev: true @@ -7769,7 +8056,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@types/react': 18.3.11 react: 18.3.1 dev: false @@ -7785,7 +8072,6 @@ packages: dependencies: '@types/react': 18.3.11 react: 18.3.1 - dev: false /@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} @@ -7798,6 +8084,7 @@ packages: dependencies: '@types/react': 18.3.11 react: 18.3.1 + dev: false /@radix-ui/react-focus-scope@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} @@ -7805,7 +8092,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) @@ -7826,7 +8113,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -7870,7 +8157,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) react: 18.3.1 dev: true @@ -7884,7 +8171,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 react: 18.3.1 @@ -7916,7 +8203,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -7974,7 +8261,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8043,8 +8330,8 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) + '@babel/runtime': 7.25.6 + '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8073,8 +8360,8 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) + '@babel/runtime': 7.25.6 + '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8103,7 +8390,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1)(react@18.3.1) + '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) @@ -8124,7 +8411,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-primitive': 1.0.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8143,7 +8430,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -8164,7 +8451,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -8191,7 +8478,6 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false /@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} @@ -8212,6 +8498,7 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false /@radix-ui/react-presence@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} @@ -8219,7 +8506,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.0.0(react@18.3.1) react: 18.3.1 @@ -8239,7 +8526,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 @@ -8267,7 +8554,6 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false /@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} @@ -8288,6 +8574,7 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: false /@radix-ui/react-primitive@1.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} @@ -8295,7 +8582,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-slot': 1.0.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8314,7 +8601,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-slot': 1.0.2(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -8354,7 +8641,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 @@ -8376,7 +8663,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8433,7 +8720,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8490,7 +8777,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -8531,7 +8818,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -8552,7 +8839,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -8575,7 +8862,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-compose-refs': 1.0.0(react@18.3.1) react: 18.3.1 dev: true @@ -8589,7 +8876,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 react: 18.3.1 @@ -8621,7 +8908,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8662,33 +8949,6 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-tabs@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==} peerDependencies: @@ -8733,7 +8993,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8760,7 +9020,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8783,7 +9043,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8815,7 +9075,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8834,8 +9094,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-tooltip@1.1.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==} + /@radix-ui/react-tooltip@1.1.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -8849,12 +9109,12 @@ packages: dependencies: '@radix-ui/primitive': 1.1.0 '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.11)(react@18.3.1) @@ -8868,7 +9128,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 react: 18.3.1 dev: true @@ -8881,7 +9141,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@types/react': 18.3.11 react: 18.3.1 dev: false @@ -8903,7 +9163,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) react: 18.3.1 dev: true @@ -8917,7 +9177,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 react: 18.3.1 @@ -8941,7 +9201,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-use-callback-ref': 1.0.0(react@18.3.1) react: 18.3.1 dev: true @@ -8955,7 +9215,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 react: 18.3.1 @@ -8979,7 +9239,7 @@ packages: peerDependencies: react: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 react: 18.3.1 dev: true @@ -8992,7 +9252,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@types/react': 18.3.11 react: 18.3.1 dev: false @@ -9018,7 +9278,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@types/react': 18.3.11 react: 18.3.1 dev: false @@ -9032,7 +9292,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/rect': 1.0.1 '@types/react': 18.3.11 react: 18.3.1 @@ -9060,7 +9320,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 react: 18.3.1 @@ -9092,7 +9352,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -9122,7 +9382,7 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 dev: false /@radix-ui/rect@1.1.0: @@ -9425,7 +9685,7 @@ packages: dependencies: '@types/d3': 7.4.3 '@types/d3-drag': 3.0.7 - '@types/d3-selection': 3.0.11 + '@types/d3-selection': 3.0.10 '@types/d3-zoom': 3.0.8 classcat: 5.0.5 d3-drag: 3.0.0 @@ -9446,7 +9706,7 @@ packages: react-dom: '>=17' dependencies: '@reactflow/core': 11.11.1(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@types/d3-selection': 3.0.11 + '@types/d3-selection': 3.0.10 '@types/d3-zoom': 3.0.8 classcat: 5.0.5 d3-selection: 3.0.0 @@ -9511,8 +9771,8 @@ packages: react: 18.3.1 dev: true - /@rollup/pluginutils@5.1.3: - resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -9522,9 +9782,17 @@ packages: dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 2.3.1 dev: true + /@rollup/rollup-android-arm-eabi@4.21.2: + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-android-arm-eabi@4.24.4: resolution: {integrity: sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==} cpu: [arm] @@ -9533,6 +9801,14 @@ packages: dev: true optional: true + /@rollup/rollup-android-arm64@4.21.2: + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-android-arm64@4.24.4: resolution: {integrity: sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==} cpu: [arm64] @@ -9541,6 +9817,14 @@ packages: dev: true optional: true + /@rollup/rollup-darwin-arm64@4.21.2: + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-darwin-arm64@4.24.4: resolution: {integrity: sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==} cpu: [arm64] @@ -9548,6 +9832,14 @@ packages: requiresBuild: true optional: true + /@rollup/rollup-darwin-x64@4.21.2: + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-darwin-x64@4.24.4: resolution: {integrity: sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==} cpu: [x64] @@ -9572,6 +9864,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-arm-gnueabihf@4.21.2: + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-arm-gnueabihf@4.24.4: resolution: {integrity: sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==} cpu: [arm] @@ -9580,6 +9880,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-arm-musleabihf@4.21.2: + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-arm-musleabihf@4.24.4: resolution: {integrity: sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==} cpu: [arm] @@ -9588,6 +9896,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-arm64-gnu@4.21.2: + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-arm64-gnu@4.24.4: resolution: {integrity: sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==} cpu: [arm64] @@ -9596,6 +9912,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-arm64-musl@4.21.2: + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-arm64-musl@4.24.4: resolution: {integrity: sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==} cpu: [arm64] @@ -9604,6 +9928,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-powerpc64le-gnu@4.21.2: + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-powerpc64le-gnu@4.24.4: resolution: {integrity: sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==} cpu: [ppc64] @@ -9612,6 +9944,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-riscv64-gnu@4.21.2: + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-riscv64-gnu@4.24.4: resolution: {integrity: sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==} cpu: [riscv64] @@ -9620,6 +9960,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-s390x-gnu@4.21.2: + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-s390x-gnu@4.24.4: resolution: {integrity: sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==} cpu: [s390x] @@ -9628,6 +9976,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-x64-gnu@4.21.2: + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-x64-gnu@4.24.4: resolution: {integrity: sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==} cpu: [x64] @@ -9636,6 +9992,14 @@ packages: dev: true optional: true + /@rollup/rollup-linux-x64-musl@4.21.2: + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-linux-x64-musl@4.24.4: resolution: {integrity: sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==} cpu: [x64] @@ -9644,6 +10008,14 @@ packages: dev: true optional: true + /@rollup/rollup-win32-arm64-msvc@4.21.2: + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-win32-arm64-msvc@4.24.4: resolution: {integrity: sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==} cpu: [arm64] @@ -9652,6 +10024,14 @@ packages: dev: true optional: true + /@rollup/rollup-win32-ia32-msvc@4.21.2: + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-win32-ia32-msvc@4.24.4: resolution: {integrity: sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==} cpu: [ia32] @@ -9660,6 +10040,14 @@ packages: dev: true optional: true + /@rollup/rollup-win32-x64-msvc@4.21.2: + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@rollup/rollup-win32-x64-msvc@4.24.4: resolution: {integrity: sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==} cpu: [x64] @@ -9685,58 +10073,58 @@ packages: '@types/hast': 3.0.4 dev: false - /@shikijs/core@1.22.2: - resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==} + /@shikijs/core@1.21.0: + resolution: {integrity: sha512-zAPMJdiGuqXpZQ+pWNezQAk5xhzRXBNiECFPcJLtUdsFM3f//G95Z15EHTnHchYycU8kIIysqGgxp8OVSj1SPQ==} dependencies: - '@shikijs/engine-javascript': 1.22.2 - '@shikijs/engine-oniguruma': 1.22.2 - '@shikijs/types': 1.22.2 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/engine-javascript': 1.21.0 + '@shikijs/engine-oniguruma': 1.21.0 + '@shikijs/types': 1.21.0 + '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 dev: false - /@shikijs/engine-javascript@1.22.2: - resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==} + /@shikijs/engine-javascript@1.21.0: + resolution: {integrity: sha512-jxQHNtVP17edFW4/0vICqAVLDAxmyV31MQJL4U/Kg+heQALeKYVOWo0sMmEZ18FqBt+9UCdyqGKYE7bLRtk9mg==} dependencies: - '@shikijs/types': 1.22.2 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/types': 1.21.0 + '@shikijs/vscode-textmate': 9.2.2 oniguruma-to-js: 0.4.3 dev: false - /@shikijs/engine-oniguruma@1.22.2: - resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==} + /@shikijs/engine-oniguruma@1.21.0: + resolution: {integrity: sha512-AIZ76XocENCrtYzVU7S4GY/HL+tgHGbVU+qhiDyNw1qgCA5OSi4B4+HY4BtAoJSMGuD/L5hfTzoRVbzEm2WTvg==} dependencies: - '@shikijs/types': 1.22.2 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/types': 1.21.0 + '@shikijs/vscode-textmate': 9.2.2 dev: false - /@shikijs/rehype@1.22.2: - resolution: {integrity: sha512-A0RHgiYR5uiHvddwHehBN9j8PhOvfT6/GebSTWrapur6M+fD/4i3mlfUv7aFK4b+4GQ1R42L8fC5N98whZjNcg==} + /@shikijs/rehype@1.21.0: + resolution: {integrity: sha512-FTjnptME+i0BqoYMQjsZZLgTWI4To3h3nL8RJFqS51FDWMRhK/TtPRsDyY86gO1GTZduPZpIssxHqPPkTfdO/Q==} dependencies: - '@shikijs/types': 1.22.2 + '@shikijs/types': 1.21.0 '@types/hast': 3.0.4 hast-util-to-string: 3.0.1 - shiki: 1.22.2 + shiki: 1.21.0 unified: 11.0.5 unist-util-visit: 5.0.0 dev: false - /@shikijs/transformers@1.22.2: - resolution: {integrity: sha512-8f78OiBa6pZDoZ53lYTmuvpFPlWtevn23bzG+azpPVvZg7ITax57o/K3TC91eYL3OMJOO0onPbgnQyZjRos8XQ==} + /@shikijs/transformers@1.21.0: + resolution: {integrity: sha512-aA+XGGSzipcvqdsOYL8l6Q2RYiMuJNdhdt9eZnkJmW+wjSOixN/I7dBq3fISwvEMDlawrtuXM3eybLCEC+Fjlg==} dependencies: - shiki: 1.22.2 + shiki: 1.21.0 dev: false - /@shikijs/types@1.22.2: - resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==} + /@shikijs/types@1.21.0: + resolution: {integrity: sha512-tzndANDhi5DUndBtpojEq/42+dpUF2wS7wdCDQaFtIXm3Rd1QkrcVgSSRLOvEwexekihOXfbYJINW37g96tJRw==} dependencies: - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 dev: false - /@shikijs/vscode-textmate@9.3.0: - resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + /@shikijs/vscode-textmate@9.2.2: + resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} dev: false /@shuding/opentype.js@1.4.0-beta.0: @@ -9973,23 +10361,23 @@ packages: defer-to-connect: 2.0.1 dev: true - /@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.10): + /@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.3): resolution: {integrity: sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==} peerDependencies: tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1' dependencies: - tailwindcss: 3.4.10(ts-node@10.9.2) + tailwindcss: 3.4.3(ts-node@10.9.2) dev: true - /@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.10): + /@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.3): resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==} peerDependencies: tailwindcss: '>=3.2.0' dependencies: - tailwindcss: 3.4.10(ts-node@10.9.2) + tailwindcss: 3.4.3(ts-node@10.9.2) dev: false - /@tailwindcss/typography@0.5.12(tailwindcss@3.4.10): + /@tailwindcss/typography@0.5.12(tailwindcss@3.4.3): resolution: {integrity: sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' @@ -9998,7 +10386,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.10(ts-node@10.9.2) + tailwindcss: 3.4.3(ts-node@10.9.2) /@tailwindcss/typography@0.5.15(tailwindcss@3.4.10): resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} @@ -10059,8 +10447,8 @@ packages: zod: 3.23.8 dev: false - /@trigger.dev/core@3.1.0: - resolution: {integrity: sha512-Rq8Oa3fkevZLRd6yx6XqLe1jXYD41X1mN7O6R/pkaTXakPy6g44FvvlFw3XNi9TodrTG1m+ym1s7wR1Ydy+54A==} + /@trigger.dev/core@3.1.2: + resolution: {integrity: sha512-a9kQK20zehyVuXxWm2j0st+ydmNU4SB+4Ye+rC4ZwwoTFFUb4D9p2uiEjqYrKKUAJxExj/mixgcldOlznfdJiw==} engines: {node: '>=18.20.0'} dependencies: '@electric-sql/client': 0.6.3 @@ -10093,28 +10481,28 @@ packages: - utf-8-validate dev: false - /@trigger.dev/nextjs@3.1.0(@trigger.dev/sdk@3.1.0)(next@14.2.10): - resolution: {integrity: sha512-/VsJqt6s3vWnTFkeC0Qz08Fr3gUyeTffcSwQ/UAAWLRyfW+CGKhxf8W4+PT1Z+HG/W6xsyvmGRprcOk1O1h6sQ==} + /@trigger.dev/nextjs@3.1.2(@trigger.dev/sdk@3.1.2)(next@14.2.10): + resolution: {integrity: sha512-uwdQE1vM7Do7xCbqpw4PKw8/YbW3mjwpeTK7so5hsrndcKDxhr5rarPrjQaAKt0saa7mhxwmp+wFnmeCeRdTvQ==} engines: {node: '>=18.0.0'} peerDependencies: '@trigger.dev/sdk': ~2.3.0 || ^3.0.0 next: '>=12.0.0' dependencies: - '@trigger.dev/sdk': 3.1.0 + '@trigger.dev/sdk': 3.1.2 debug: 4.3.7(supports-color@8.1.1) - next: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) transitivePeerDependencies: - supports-color dev: false - /@trigger.dev/sdk@3.1.0: - resolution: {integrity: sha512-GxLw2aWa5Dk5wb9ZboE2l7k1iYEbnKUyfEZ4B96/B+npdYTR/BAZddMlOzNTr5YvAvgj4Bpf7aDcNrMjqAkWUA==} + /@trigger.dev/sdk@3.1.2: + resolution: {integrity: sha512-5G1mvZgTTFHaNzXV+wL5V6o2mfCd9gyH2jTehJVGDak2PbFTcXXLYHMY+TOWG0G2eAAdUm6kCGpCZCNYiY+StQ==} engines: {node: '>=18.20.0'} dependencies: '@opentelemetry/api': 1.4.1 '@opentelemetry/api-logs': 0.52.1 '@opentelemetry/semantic-conventions': 1.13.0 - '@trigger.dev/core': 3.1.0 + '@trigger.dev/core': 3.1.2 chalk: 5.3.0 cronstrue: 2.51.0 debug: 4.3.7(supports-color@8.1.1) @@ -10131,12 +10519,12 @@ packages: - utf-8-validate dev: false - /@trigger.dev/slack@3.1.0: - resolution: {integrity: sha512-+9GMVale1BIsxvZYvpRW0w5Msb/u/tQCDlFzBIVrWnuBEV/YRUIHMDaFZ0ZB/JRMpyBYWjYJ/j1KnkAPx11p3Q==} + /@trigger.dev/slack@3.1.2: + resolution: {integrity: sha512-PjZ5grV18LEZNw6UhnaAA7n3TVjFpSqxQx/o4D2qUEItqWhtcojwjEkvVE3Qi740rgIsO9FMl+sD3iZRfOVF2g==} engines: {node: '>=16.8.0'} dependencies: '@slack/web-api': 6.13.0 - '@trigger.dev/sdk': 3.1.0 + '@trigger.dev/sdk': 3.1.2 zod: 3.22.3 transitivePeerDependencies: - bufferutil @@ -10247,13 +10635,13 @@ packages: /@types/d3-axis@3.0.6: resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} dependencies: - '@types/d3-selection': 3.0.11 + '@types/d3-selection': 3.0.10 dev: false /@types/d3-brush@3.0.6: resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} dependencies: - '@types/d3-selection': 3.0.11 + '@types/d3-selection': 3.0.10 dev: false /@types/d3-chord@3.0.6: @@ -10290,7 +10678,7 @@ packages: /@types/d3-drag@3.0.7: resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} dependencies: - '@types/d3-selection': 3.0.11 + '@types/d3-selection': 3.0.10 dev: false /@types/d3-dsv@3.0.7: @@ -10377,8 +10765,8 @@ packages: '@types/d3-time': 3.0.3 dev: false - /@types/d3-selection@3.0.11: - resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + /@types/d3-selection@3.0.10: + resolution: {integrity: sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==} dev: false /@types/d3-shape@1.3.12: @@ -10417,17 +10805,17 @@ packages: resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} dev: false - /@types/d3-transition@3.0.9: - resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + /@types/d3-transition@3.0.8: + resolution: {integrity: sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==} dependencies: - '@types/d3-selection': 3.0.11 + '@types/d3-selection': 3.0.10 dev: false /@types/d3-zoom@3.0.8: resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} dependencies: '@types/d3-interpolate': 3.0.4 - '@types/d3-selection': 3.0.11 + '@types/d3-selection': 3.0.10 dev: false /@types/d3@7.4.3: @@ -10456,12 +10844,12 @@ packages: '@types/d3-random': 3.0.3 '@types/d3-scale': 4.0.8 '@types/d3-scale-chromatic': 3.0.3 - '@types/d3-selection': 3.0.11 + '@types/d3-selection': 3.0.10 '@types/d3-shape': 3.1.6 '@types/d3-time': 3.0.3 '@types/d3-time-format': 4.0.3 '@types/d3-timer': 3.0.2 - '@types/d3-transition': 3.0.9 + '@types/d3-transition': 3.0.8 '@types/d3-zoom': 3.0.8 dev: false @@ -10478,33 +10866,23 @@ packages: resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} dev: false - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.6 - dev: false - - /@types/eslint@9.6.1: - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - dependencies: - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 - dev: false - /@types/estree-jsx@1.0.5: resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} dependencies: '@types/estree': 1.0.6 + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + /@types/estree@1.0.6: resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - /@types/express-serve-static-core@4.19.6: - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + /@types/express-serve-static-core@4.19.5: + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} dependencies: '@types/node': 20.14.9 - '@types/qs': 6.9.16 + '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 dev: false @@ -10513,8 +10891,8 @@ packages: resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==} dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.16 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.15 '@types/serve-static': 1.15.7 dev: false @@ -10571,8 +10949,8 @@ packages: resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} dev: false - /@types/lodash@4.17.13: - resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + /@types/lodash@4.17.7: + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} dev: false /@types/mdast@3.0.15: @@ -10639,8 +11017,8 @@ packages: resolution: {integrity: sha512-vmYJF0REqDyyU0gviezF/KHq/fYaUbFhkcNbQCuPGFQj6VTbXuHZoxs/Y7mutWe73C8AC6l9fFu8mSYiBAqkGA==} dev: false - /@types/node@18.19.64: - resolution: {integrity: sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==} + /@types/node@18.19.48: + resolution: {integrity: sha512-7WevbG4ekUcRQSZzOwxWgi5dZmTak7FaxXDoW7xVxPBmKx1rTzfmRLkeCgJzcbBnOV2dkhAPc8cCeT6agocpjg==} dependencies: undici-types: 5.26.5 dev: false @@ -10656,12 +11034,6 @@ packages: undici-types: 6.19.8 dev: true - /@types/node@22.9.0: - resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} - dependencies: - undici-types: 6.19.8 - dev: true - /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true @@ -10670,14 +11042,14 @@ packages: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: true - /@types/prismjs@1.26.5: - resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + /@types/prismjs@1.26.4: + resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==} - /@types/prop-types@15.7.13: - resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - /@types/qs@6.9.16: - resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} + /@types/qs@6.9.15: + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} dev: false /@types/range-parser@1.2.7: @@ -10698,7 +11070,7 @@ packages: /@types/react@18.3.11: resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} dependencies: - '@types/prop-types': 15.7.13 + '@types/prop-types': 15.7.12 csstype: 3.1.3 /@types/resolve@1.20.6: @@ -10755,7 +11127,7 @@ packages: dependencies: '@types/node': 20.14.9 tapable: 2.2.1 - webpack: 5.96.1(@swc/core@1.3.101)(esbuild@0.19.11) + webpack: 5.94.0(@swc/core@1.3.101)(esbuild@0.19.11) transitivePeerDependencies: - '@swc/core' - esbuild @@ -10767,8 +11139,8 @@ packages: resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} dev: true - /@types/ws@8.5.13: - resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} + /@types/ws@8.5.12: + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} dependencies: '@types/node': 20.14.9 dev: true @@ -10939,7 +11311,7 @@ packages: peerDependencies: react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/lodash': 4.17.13 + '@types/lodash': 4.17.7 '@types/react': 18.3.11 lodash: 4.17.21 prop-types: 15.8.1 @@ -10959,7 +11331,7 @@ packages: dependencies: '@types/d3-path': 1.0.11 '@types/d3-shape': 1.3.12 - '@types/lodash': 4.17.13 + '@types/lodash': 4.17.7 '@types/react': 18.3.11 '@visx/curve': 3.3.0 '@visx/group': 3.3.0(react@18.3.1) @@ -10977,7 +11349,7 @@ packages: peerDependencies: react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/lodash': 4.17.13 + '@types/lodash': 4.17.7 '@types/react': 18.3.11 classnames: 2.5.1 lodash: 4.17.21 @@ -11068,7 +11440,7 @@ packages: /@vitest/snapshot@1.6.0: resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: - magic-string: 0.30.12 + magic-string: 0.30.11 pathe: 1.1.2 pretty-format: 29.7.0 dev: true @@ -11095,7 +11467,7 @@ packages: fflate: 0.8.2 flatted: 3.3.1 pathe: 1.1.2 - picocolors: 1.1.1 + picocolors: 1.0.1 sirv: 2.0.4 vitest: 1.6.0(@types/node@20.14.9)(@vitest/ui@1.6.0) dev: true @@ -11365,12 +11737,25 @@ packages: engines: {node: '>=0.4.0'} dev: true + /acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.14.0 + dev: true + /acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} dependencies: acorn: 8.14.0 + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -11419,7 +11804,48 @@ packages: indent-string: 5.0.0 dev: true - /ai@3.4.7(openai@4.52.1)(react@18.3.1)(svelte@5.1.9)(vue@3.5.12)(zod@3.23.8): + /ai@3.0.23(react@18.3.1)(solid-js@1.9.3)(svelte@4.2.19)(vue@3.5.12)(zod@3.23.8): + resolution: {integrity: sha512-VL8Fx9euEtffzIu0BpLDZkACB+oU6zj4vHXSsSoT5VfwAzE009FJedOMPK1M4u60RpYw/DgwlD7OLN7XQfvSHw==} + engines: {node: '>=18'} + peerDependencies: + react: ^18.2.0 + solid-js: ^1.7.7 + svelte: ^3.0.0 || ^4.0.0 + vue: ^3.3.4 + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + solid-js: + optional: true + svelte: + optional: true + vue: + optional: true + zod: + optional: true + dependencies: + '@ai-sdk/provider': 0.0.0 + '@ai-sdk/provider-utils': 0.0.1(zod@3.23.8) + eventsource-parser: 1.1.2 + json-schema: 0.4.0 + jsondiffpatch: 0.6.0 + nanoid: 3.3.6 + react: 18.3.1 + secure-json-parse: 2.7.0 + solid-js: 1.9.3 + solid-swr-store: 0.10.7(solid-js@1.9.3)(swr-store@0.10.6) + sswr: 2.0.0(svelte@4.2.19) + svelte: 4.2.19 + swr: 2.2.0(react@18.3.1) + swr-store: 0.10.6 + swrv: 1.0.4(vue@3.5.12) + vue: 3.5.12(typescript@5.5.3) + zod: 3.23.8 + zod-to-json-schema: 3.22.5(zod@3.23.8) + dev: false + + /ai@3.4.7(react@18.3.1)(svelte@5.1.9)(vue@3.5.12)(zod@3.23.8): resolution: {integrity: sha512-SutkVjFE86+xNql7fJERJkSEwpILEuiQvCoogJef6ZX/PGHvu3yepwHwVwedgABXe9SudOIKN48EQESrXX/xCw==} engines: {node: '>=18'} peerDependencies: @@ -11452,7 +11878,6 @@ packages: json-schema: 0.4.0 jsondiffpatch: 0.6.0 nanoid: 3.3.6 - openai: 4.52.1 react: 18.3.1 secure-json-parse: 2.7.0 svelte: 5.1.9 @@ -11578,7 +12003,6 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -11772,43 +12196,43 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.24.2 - caniuse-lite: 1.0.30001677 + browserslist: 4.23.3 + caniuse-lite: 1.0.30001667 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.1.1 + picocolors: 1.1.0 postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: false - /autoprefixer@10.4.20(postcss@8.4.38): - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + /autoprefixer@10.4.19(postcss@8.4.38): + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.24.2 - caniuse-lite: 1.0.30001677 + browserslist: 4.23.3 + caniuse-lite: 1.0.30001655 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.1.1 + picocolors: 1.0.1 postcss: 8.4.38 postcss-value-parser: 4.2.0 - /autoprefixer@10.4.20(postcss@8.4.45): + /autoprefixer@10.4.20(postcss@8.4.47): resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.24.2 - caniuse-lite: 1.0.30001677 + browserslist: 4.23.3 + caniuse-lite: 1.0.30001667 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.4.45 + picocolors: 1.1.0 + postcss: 8.4.47 postcss-value-parser: 4.2.0 dev: true @@ -11850,7 +12274,7 @@ packages: resolution: {integrity: sha512-fdRxJkQ9MUSEi4jH2DcV3FAPFktk0wefilxrwNyUuWpoWawQGN7G7cB+fOYTtFfI6XNkFgwqJ/D3G18BoJJ/jg==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.25.6 dev: false /babylon@6.18.0: @@ -11887,6 +12311,10 @@ packages: /before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + /before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + dev: false + /better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -11921,8 +12349,8 @@ packages: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} dev: true - /body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 @@ -11933,7 +12361,7 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.13.0 + qs: 6.11.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -11968,15 +12396,15 @@ packages: wcwidth: 1.0.1 dev: true - /browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + /browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001677 - electron-to-chromium: 1.5.51 + caniuse-lite: 1.0.30001667 + electron-to-chromium: 1.5.13 node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) + update-browserslist-db: 1.1.0(browserslist@4.23.3) /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -12105,8 +12533,11 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: false - /caniuse-lite@1.0.30001677: - resolution: {integrity: sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==} + /caniuse-lite@1.0.30001655: + resolution: {integrity: sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==} + + /caniuse-lite@1.0.30001667: + resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==} /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} @@ -12167,7 +12598,6 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -12214,8 +12644,8 @@ packages: get-func-name: 2.0.2 dev: true - /checkly@4.9.1(@types/node@20.14.9)(typescript@5.5.3): - resolution: {integrity: sha512-BLVLb9EB8iOQVNZIRUjoEYVPdzOSiBwPlbNOYXOWDoMZHo6dUxWB4ckqJhqWfrvmVPEnSw6JMQ0v/XAXaGYmqw==} + /checkly@4.9.0(@types/node@20.14.9)(typescript@5.5.3): + resolution: {integrity: sha512-LqohEntErF7dJaJPsEpjvr/O9wUfzBRac6DOXgFDMEw+dNi19oBAcspdOqVGjPjMoCZ9/s5b5tSJI1pusY4mJQ==} engines: {node: '>=16.0.0'} hasBin: true dependencies: @@ -12342,8 +12772,13 @@ packages: engines: {node: '>=8'} dev: true + /cjs-module-lexer@1.4.0: + resolution: {integrity: sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==} + dev: true + /cjs-module-lexer@1.4.1: resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} + dev: false /class-variance-authority@0.7.0: resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} @@ -12521,21 +12956,14 @@ packages: - '@types/react-dom' dev: false - /cmdk@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg==} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - react-dom: ^18 || ^19 || ^19.0.0-rc + /code-red@1.0.4: + resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} dependencies: - '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.2.2(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + acorn: 8.14.0 + estree-walker: 3.0.3 + periscopic: 3.1.0 dev: false /collapse-white-space@2.1.0: @@ -12629,8 +13057,8 @@ packages: minimist: 1.2.8 dev: true - /commitizen@4.3.1(@types/node@20.14.9)(typescript@5.5.3): - resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} + /commitizen@4.3.0(@types/node@20.14.9)(typescript@5.5.3): + resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} engines: {node: '>= 12'} hasBin: true dependencies: @@ -12692,8 +13120,8 @@ packages: semver: 7.6.3 dev: true - /confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + /confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} dev: true /config-chain@1.1.13: @@ -12706,7 +13134,6 @@ packages: /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} - dev: false /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} @@ -12738,19 +13165,13 @@ packages: /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - dev: false /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - /cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - dev: true - - /cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} dev: true @@ -12773,8 +13194,8 @@ packages: object-assign: 4.1.1 vary: 1.1.2 - /cosmiconfig-typescript-loader@5.1.0(@types/node@20.14.9)(cosmiconfig@9.0.0)(typescript@5.5.3): - resolution: {integrity: sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==} + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.14.9)(cosmiconfig@9.0.0)(typescript@5.5.3): + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} peerDependencies: '@types/node': '*' @@ -12890,6 +13311,14 @@ packages: postcss-value-parser: 4.2.0 dev: false + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + dev: false + /css-what@2.1.3: resolution: {integrity: sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==} dev: true @@ -12937,7 +13366,7 @@ packages: engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.1(@types/node@20.14.9)(typescript@5.5.3) + commitizen: 4.3.0(@types/node@20.14.9)(typescript@5.5.3) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 @@ -13210,6 +13639,18 @@ packages: ms: 2.1.2 dev: true + /debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + /debug@4.3.7(supports-color@8.1.1): resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -13279,7 +13720,7 @@ packages: is-regex: 1.1.4 object-is: 1.1.6 object-keys: 1.1.1 - regexp.prototype.flags: 1.5.3 + regexp.prototype.flags: 1.5.2 dev: false /deep-freeze@0.0.1: @@ -13594,7 +14035,7 @@ packages: resolution: {integrity: sha512-nXOaTSFiuIaTMhS8WJC2d4EBeIcN9OSt2A2cyFbQYBAZbi7lRsVGJNqDpEwPqYfJz38yxbY/UtbvBBahBfnExQ==} hasBin: true dependencies: - '@drizzle-team/brocli': 0.10.2 + '@drizzle-team/brocli': 0.10.1 '@esbuild-kit/esm-loader': 2.6.5 esbuild: 0.19.12 esbuild-register: 3.6.0(esbuild@0.19.12) @@ -14031,8 +14472,8 @@ packages: jake: 10.9.2 dev: true - /electron-to-chromium@1.5.51: - resolution: {integrity: sha512-kKeWV57KSS8jH4alKt/jKnvHPmJgBxXzGUSbMd4eQF+iOsVPl7bz2KUmu6eo80eMP8wVioTfTyTzdMgM15WXNg==} + /electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} /emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -14048,11 +14489,6 @@ packages: engines: {node: '>= 0.8'} dev: true - /encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - dev: true - /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -14095,27 +14531,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false - - /engine.io@6.6.2: - resolution: {integrity: sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==} - engines: {node: '>=10.2.0'} - dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.17 - '@types/node': 20.14.9 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.7.2 - cors: 2.8.5 - debug: 4.3.7(supports-color@8.1.1) - engine.io-parser: 5.2.3 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true /enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} @@ -14195,7 +14610,7 @@ packages: object-inspect: 1.13.2 object-keys: 1.1.1 object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 + regexp.prototype.flags: 1.5.2 safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 string.prototype.trim: 1.2.9 @@ -14261,6 +14676,7 @@ packages: devlop: 1.1.0 estree-util-visit: 2.0.0 unist-util-position-from-estree: 2.0.0 + dev: true /esast-util-from-js@2.0.1: resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} @@ -14269,6 +14685,7 @@ packages: acorn: 8.14.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 + dev: true /esbuild-register@3.6.0(esbuild@0.19.12): resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} @@ -14585,7 +15002,7 @@ packages: '@eslint/plugin-kit': 0.2.2 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.0 + '@humanwhocodes/retry': 0.4.1 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -14695,12 +15112,6 @@ packages: /estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - /estree-util-scope@1.0.0: - resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} - dependencies: - '@types/estree': 1.0.6 - devlop: 1.1.0 - /estree-util-to-js@1.2.0: resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} dependencies: @@ -14715,8 +15126,8 @@ packages: astring: 1.9.0 source-map: 0.7.4 - /estree-util-value-to-estree@3.2.1: - resolution: {integrity: sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw==} + /estree-util-value-to-estree@3.1.2: + resolution: {integrity: sha512-S0gW2+XZkmsx00tU2uJ4L9hUT7IFabbml9pHh2WQqFmAbxit++YGZne0sKJbNwkj9Wvg9E4uqWl4nCIFQMmfag==} dependencies: '@types/estree': 1.0.6 @@ -14852,36 +15263,36 @@ packages: engines: {node: ^v12.20.0 || >=v14.13.0} dev: false - /express@4.21.1: - resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.3 + body-parser: 1.20.2 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.7.1 + cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 2.0.0 + encodeurl: 1.0.2 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.3.1 + finalhandler: 1.2.0 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.3 + merge-descriptors: 1.0.1 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.10 + path-to-regexp: 0.1.7 proxy-addr: 2.0.7 - qs: 6.13.0 + qs: 6.11.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 + send: 0.18.0 + serve-static: 1.15.0 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -14993,7 +15404,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: escape-html: 1.0.3 - sharp: 0.33.4 + sharp: 0.33.5 xml2js: 0.6.2 dev: true @@ -15082,12 +15493,12 @@ packages: engines: {node: '>=0.10.0'} dev: true - /finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: debug: 2.6.9 - encodeurl: 2.0.0 + encodeurl: 1.0.2 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -15289,7 +15700,7 @@ packages: dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tslib: 2.8.1 + tslib: 2.7.0 dev: false /free-email-domains@1.2.13: @@ -15382,23 +15793,23 @@ packages: react: '>= 18' react-dom: '>= 18' dependencies: - '@formatjs/intl-localematcher': 0.5.7 - '@shikijs/rehype': 1.22.2 - '@shikijs/transformers': 1.22.2 + '@formatjs/intl-localematcher': 0.5.4 + '@shikijs/rehype': 1.21.0 + '@shikijs/transformers': 1.21.0 flexsearch: 0.7.21 github-slugger: 2.0.0 image-size: 1.1.1 - negotiator: 0.6.4 - next: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + negotiator: 0.6.3 + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) npm-to-yarn: 3.0.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.5.10(@types/react@18.3.11)(react@18.3.1) remark: 15.0.1 remark-gfm: 4.0.0 - remark-mdx: 3.1.0 + remark-mdx: 3.0.1 scroll-into-view-if-needed: 3.1.0 - shiki: 1.22.2 + shiki: 1.21.0 swr: 2.2.5(react@18.3.1) unist-util-visit: 5.0.0 transitivePeerDependencies: @@ -15406,26 +15817,25 @@ packages: - supports-color dev: false - /fumadocs-mdx@10.0.2(acorn@8.14.0)(fumadocs-core@13.4.10)(next@14.2.10): + /fumadocs-mdx@10.0.2(fumadocs-core@13.4.10)(next@14.2.10): resolution: {integrity: sha512-kpM4QfLXF3CjqBCLsYySZNvXvKpDrqDCK7wobhoAbTTmzql2cGXBk+bkAogwjgW3sidGw9d/HIGOcB61R07QLA==} hasBin: true peerDependencies: fumadocs-core: ^13.2.1 next: '>= 14.1.0' dependencies: - '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + '@mdx-js/mdx': 3.0.1 chokidar: 3.6.0 cross-spawn: 7.0.3 esbuild: 0.23.1 - estree-util-value-to-estree: 3.2.1 + estree-util-value-to-estree: 3.1.2 fast-glob: 3.3.2 fumadocs-core: 13.4.10(@types/react@18.3.11)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) gray-matter: 4.0.3 micromatch: 4.0.8 - next: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) zod: 3.23.8 transitivePeerDependencies: - - acorn - supports-color dev: false @@ -15436,25 +15846,25 @@ packages: react: '>= 18' react-dom: '>= 18' dependencies: - '@radix-ui/react-accordion': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-accordion': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-direction': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-popover': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-scroll-area': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-tabs': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tabs': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@tailwindcss/typography': 0.5.15(tailwindcss@3.4.10) class-variance-authority: 0.7.0 - cmdk: 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + cmdk: 1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) fumadocs-core: 13.4.10(@types/react@18.3.11)(next@14.2.10)(react-dom@18.3.1)(react@18.3.1) lucide-react: 0.438.0(react@18.3.1) - next: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) next-themes: 0.3.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-medium-image-zoom: 5.2.10(react-dom@18.3.1)(react@18.3.1) swr: 2.2.5(react@18.3.1) - tailwind-merge: 2.5.4 + tailwind-merge: 2.5.3 transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -15486,7 +15896,7 @@ packages: peerDependencies: next: '>=13.2.0 <15.0.0-0' dependencies: - next: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) dev: false /generate-function@2.3.1: @@ -15502,8 +15912,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} dev: true @@ -15569,8 +15979,8 @@ packages: es-errors: 1.3.0 get-intrinsic: 1.2.4 - /get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + /get-tsconfig@4.8.0: + resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -15639,7 +16049,7 @@ packages: jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 - package-json-from-dist: 1.0.1 + package-json-from-dist: 1.0.0 path-scurry: 1.11.1 /glob@7.2.3: @@ -15804,7 +16214,6 @@ packages: /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -15883,7 +16292,7 @@ packages: dependencies: '@types/hast': 3.0.4 hast-util-from-dom: 5.0.0 - hast-util-from-html: 2.0.3 + hast-util-from-html: 2.0.2 unist-util-remove-position: 5.0.0 dev: true @@ -15892,18 +16301,18 @@ packages: dependencies: '@types/hast': 2.3.10 hast-util-from-parse5: 7.1.2 - parse5: 7.2.1 + parse5: 7.1.2 vfile: 5.3.7 vfile-message: 3.1.4 dev: true - /hast-util-from-html@2.0.3: - resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + /hast-util-from-html@2.0.2: + resolution: {integrity: sha512-HwOHwxdt2zC5KQ/CNoybBntRook2zJvfZE/u5/Ap7aLPe22bDqen7KwGkOqOyzL5zIqKwiYX/OTtE0FWgr6XXA==} dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 hast-util-from-parse5: 8.0.1 - parse5: 7.2.1 + parse5: 7.1.2 vfile: 6.0.3 vfile-message: 4.0.2 @@ -15990,7 +16399,7 @@ packages: hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - parse5: 7.2.1 + parse5: 7.1.2 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 vfile: 6.0.3 @@ -16030,7 +16439,7 @@ packages: estree-util-attach-comments: 3.0.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-expression: 2.0.0 mdast-util-mdx-jsx: 3.1.3 mdast-util-mdxjs-esm: 2.0.1 property-information: 6.5.0 @@ -16073,8 +16482,8 @@ packages: zwitch: 2.0.4 dev: false - /hast-util-to-jsx-runtime@2.3.2: - resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} dependencies: '@types/estree': 1.0.6 '@types/hast': 3.0.4 @@ -16083,12 +16492,12 @@ packages: devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-expression: 2.0.0 mdast-util-mdx-jsx: 3.1.3 mdast-util-mdxjs-esm: 2.0.1 property-information: 6.5.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.8 + style-to-object: 1.0.7 unist-util-position: 5.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -16123,6 +16532,12 @@ packages: '@types/hast': 2.3.10 dev: true + /hast-util-to-string@3.0.0: + resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + dependencies: + '@types/hast': 3.0.4 + dev: false + /hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} dependencies: @@ -16214,10 +16629,6 @@ packages: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: false - /highlightjs-vue@1.0.0: - resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - dev: false - /homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} @@ -16453,8 +16864,8 @@ packages: /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - /inline-style-parser@0.2.4: - resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + /inline-style-parser@0.2.3: + resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} /input-otp@1.2.4(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-md6rhmD+zmMnUh5crQNSQxq3keBRYvE3odbr4Qb9g2NWzQv9azi+t1a3X4TBTbh98fsGHgEEJlzbe1q860uGCA==} @@ -16673,7 +17084,7 @@ packages: resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} engines: {node: '>=18'} dependencies: - get-east-asian-width: 1.3.0 + get-east-asian-width: 1.2.0 dev: true /is-generator-function@1.0.10: @@ -17034,9 +17445,9 @@ packages: dependencies: argparse: 2.0.1 - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} hasBin: true /json-buffer@3.0.1: @@ -17109,8 +17520,8 @@ packages: graceful-fs: 4.2.11 dev: true - /jsonrepair@3.9.0: - resolution: {integrity: sha512-gC8z8NP6gEh/9DwDFl8G8nr6KSxdUQBhjTyCq+aZy1mT8DxZf9/V1947MztjLDCdnsn8VjoXj0b2R4HGJdEo7A==} + /jsonrepair@3.10.0: + resolution: {integrity: sha512-0Ex64Exiw0rPUEcSbhPN0ae4/5D0DZLIob9yagAF1OG5iU0mP+/t7q4gcxtQdn6i7FuQy2J/w1XbOdu/uhGV0w==} hasBin: true dev: false @@ -17181,7 +17592,7 @@ packages: summary: 2.1.0 typescript: 5.5.3 zod: 3.23.8 - zod-validation-error: 3.4.0(zod@3.23.8) + zod-validation-error: 3.3.1(zod@3.23.8) dev: true /ky@1.7.2: @@ -17311,8 +17722,8 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} dependencies: - mlly: 1.7.2 - pkg-types: 1.2.1 + mlly: 1.7.1 + pkg-types: 1.2.0 dev: true /locate-character@3.0.0: @@ -17565,6 +17976,12 @@ packages: sourcemap-codec: 1.4.8 dev: true + /magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + /magic-string@0.30.12: resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} dependencies: @@ -17595,8 +18012,8 @@ packages: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} - /markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} /marked@7.0.4: resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} @@ -17659,8 +18076,8 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-from-markdown@2.0.2: - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + /mdast-util-from-markdown@2.0.1: + resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 @@ -17691,8 +18108,8 @@ packages: '@types/mdast': 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: - supports-color @@ -17728,8 +18145,8 @@ packages: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 micromark-util-normalize-identifier: 2.0.0 transitivePeerDependencies: - supports-color @@ -17745,8 +18162,8 @@ packages: resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: false @@ -17755,7 +18172,7 @@ packages: resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} dependencies: '@types/mdast': 3.0.15 - markdown-table: 3.0.4 + markdown-table: 3.0.3 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: @@ -17766,9 +18183,9 @@ packages: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: false @@ -17784,8 +18201,8 @@ packages: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: false @@ -17806,13 +18223,13 @@ packages: /mdast-util-gfm@3.0.0: resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} dependencies: - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.1 mdast-util-gfm-autolink-literal: 2.0.1 mdast-util-gfm-footnote: 2.0.0 mdast-util-gfm-strikethrough: 2.0.0 mdast-util-gfm-table: 2.0.0 mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color dev: false @@ -17836,15 +18253,15 @@ packages: transitivePeerDependencies: - supports-color - /mdast-util-mdx-expression@2.0.1: - resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -17875,8 +18292,8 @@ packages: '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 @@ -17898,11 +18315,11 @@ packages: /mdast-util-mdx@3.0.0: resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} dependencies: - mdast-util-from-markdown: 2.0.2 - mdast-util-mdx-expression: 2.0.1 + mdast-util-from-markdown: 2.0.1 + mdast-util-mdx-expression: 2.0.0 mdast-util-mdx-jsx: 3.1.3 mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -17924,8 +18341,8 @@ packages: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -17978,15 +18395,14 @@ packages: unist-util-visit: 4.1.2 zwitch: 2.0.4 - /mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 - micromark-util-classify-character: 2.0.0 micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 @@ -18006,16 +18422,20 @@ packages: deprecated: '`mdast` was renamed to `remark`' dev: true - /mdx-bundler@10.0.3(acorn@8.14.0)(esbuild@0.19.12): + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: false + + /mdx-bundler@10.0.3(esbuild@0.19.12): resolution: {integrity: sha512-vRtVZ5t+nUP0QtoRVgjDFO10YDjRgKe/19ie0IR8FqE8SugNn5RP4sCWBPzKoEwoGbqfQOrgHy+PHCVyfaCDQQ==} engines: {node: '>=18', npm: '>=6'} peerDependencies: esbuild: 0.* dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@esbuild-plugins/node-resolve': 0.2.2(esbuild@0.19.12) '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@mdx-js/esbuild': 3.1.0(acorn@8.14.0)(esbuild@0.19.12) + '@mdx-js/esbuild': 3.0.1(esbuild@0.19.12) esbuild: 0.19.12 gray-matter: 4.0.3 remark-frontmatter: 5.0.0 @@ -18023,7 +18443,6 @@ packages: uuid: 9.0.1 vfile: 6.0.3 transitivePeerDependencies: - - acorn - supports-color dev: true @@ -18049,8 +18468,8 @@ packages: yargs-parser: 18.1.3 dev: true - /merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: true /merge-stream@2.0.0: @@ -18293,7 +18712,7 @@ packages: dependencies: '@types/estree': 1.0.6 devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.2 + micromark-factory-mdx-expression: 2.0.1 micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-events-to-acorn: 2.0.2 @@ -18314,17 +18733,16 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-extension-mdx-jsx@3.0.1: - resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.6 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.2 + micromark-factory-mdx-expression: 2.0.1 micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 vfile-message: 4.0.2 @@ -18383,7 +18801,7 @@ packages: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdx-jsx: 3.0.0 micromark-extension-mdx-md: 2.0.0 micromark-extension-mdxjs-esm: 3.0.0 micromark-util-combine-extensions: 2.0.0 @@ -18431,12 +18849,11 @@ packages: uvu: 0.5.6 vfile-message: 3.1.4 - /micromark-factory-mdx-expression@2.0.2: - resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} dependencies: '@types/estree': 1.0.6 devlop: 1.1.0 - micromark-factory-space: 2.0.0 micromark-util-character: 2.1.0 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.0 @@ -18787,8 +19204,8 @@ packages: engines: {node: '>=4'} dev: true - /miniflare@3.20240524.2: - resolution: {integrity: sha512-Js+8cB61KJG0z2HuQTPLT9S6FwTBuMZfjtml3azUarLYsCF91N+PhIkvNpbkwCXcfRvscdjJ0RlT6lBQYEuIwA==} + /miniflare@3.20240610.0: + resolution: {integrity: sha512-J6aXmkII5gcq+kC4TurxKiR4rC++apPST/K8P/YjqoQQgrJ+NRPacBhf6iVh8R3ujnXYXaq+Ae+gm+LM0XHK/w==} engines: {node: '>=16.13'} hasBin: true dependencies: @@ -18800,9 +19217,9 @@ packages: glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.28.4 - workerd: 1.20240524.0 + workerd: 1.20240610.1 ws: 8.18.0 - youch: 3.3.4 + youch: 3.3.3 zod: 3.23.8 transitivePeerDependencies: - bufferutil @@ -18825,7 +19242,7 @@ packages: undici: 5.28.4 workerd: 1.20241011.1 ws: 8.18.0 - youch: 3.3.4 + youch: 3.3.3 zod: 3.23.8 transitivePeerDependencies: - bufferutil @@ -18975,8 +19392,8 @@ packages: ml-array-min: 1.2.3 dev: false - /ml-matrix@6.12.0: - resolution: {integrity: sha512-AGfR+pWaC0GmzjUnB6BfwhndPEUGz0i7QUYdqNuw1zhTov/vSRJ9pP2hs6BoGpaSbtXgrKjZz2zjD1M0xuur6A==} + /ml-matrix@6.11.1: + resolution: {integrity: sha512-Fvp1xF1O07tt6Ux9NcnEQTei5UlqbRpvvaFZGs7l3Ij+nOaEDcmbSVtxwNa8V4IfdyFI1NLNUteroMJ1S6vcEg==} dependencies: is-any-array: 2.0.1 ml-array-rescale: 1.3.7 @@ -18988,12 +19405,12 @@ packages: ml-array-rescale: 1.3.7 dev: false - /mlly@1.7.2: - resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==} + /mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} dependencies: acorn: 8.14.0 pathe: 1.1.2 - pkg-types: 1.2.1 + pkg-types: 1.2.0 ufo: 1.5.4 dev: true @@ -19083,7 +19500,7 @@ packages: dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 - '@inquirer/confirm': 3.2.0 + '@inquirer/confirm': 3.1.22 '@mswjs/cookies': 1.1.1 '@mswjs/interceptors': 0.26.15 '@open-draft/until': 2.1.0 @@ -19094,9 +19511,9 @@ packages: headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 - path-to-regexp: 6.3.0 + path-to-regexp: 6.2.2 strict-event-emitter: 0.5.1 - type-fest: 4.26.1 + type-fest: 4.26.0 typescript: 5.5.3 yargs: 17.7.2 dev: true @@ -19171,11 +19588,6 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - /negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - dev: false - /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: false @@ -19206,7 +19618,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /next@14.1.0(@babel/core@7.26.0)(react-dom@18.3.1)(react@18.3.1): + /next@14.1.0(@babel/core@7.25.2)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} engines: {node: '>=18.17.0'} hasBin: true @@ -19224,12 +19636,12 @@ packages: '@next/env': 14.1.0 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001677 + caniuse-lite: 1.0.30001667 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.26.0)(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.25.2)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.1.0 '@next/swc-darwin-x64': 14.1.0 @@ -19245,7 +19657,7 @@ packages: - babel-plugin-macros dev: false - /next@14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1): + /next@14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} engines: {node: '>=18.17.0'} hasBin: true @@ -19267,12 +19679,12 @@ packages: '@opentelemetry/api': 1.4.1 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001677 + caniuse-lite: 1.0.30001655 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.26.0)(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.25.2)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.10 '@next/swc-darwin-x64': 14.2.10 @@ -19312,6 +19724,10 @@ packages: resolution: {integrity: sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==} dev: false + /node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + dev: true + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -19525,7 +19941,7 @@ packages: next: '>=13.4 <14.0.2 || ^14.0.3' dependencies: mitt: 3.0.1 - next: 14.2.10(@babel/core@7.26.0)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) + next: 14.2.10(@babel/core@7.25.2)(@opentelemetry/api@1.4.1)(react-dom@18.3.1)(react@18.3.1) dev: false /object-assign@4.1.1: @@ -19621,7 +20037,7 @@ packages: /oniguruma-to-js@0.4.3: resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} dependencies: - regex: 4.4.0 + regex: 4.3.3 dev: false /open@8.4.0: @@ -19646,7 +20062,7 @@ packages: resolution: {integrity: sha512-kv2hevAWZZ3I/vd2t8znGO2rd8wkowncsfcYpo8i+wU9ML+JEcdqiViANXXjWWGjIhajFNixE6gOY1fEgqILAg==} hasBin: true dependencies: - '@types/node': 18.19.64 + '@types/node': 18.19.48 '@types/node-fetch': 2.6.11 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -19677,7 +20093,7 @@ packages: /openapi3-ts@4.4.0: resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==} dependencies: - yaml: 2.6.0 + yaml: 2.5.0 dev: false /opener@1.5.2: @@ -19871,8 +20287,8 @@ packages: engines: {node: '>=6'} dev: true - /package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + /package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} /pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} @@ -19926,7 +20342,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -19957,8 +20373,8 @@ packages: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true - /parse5@7.2.1: - resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.5.0 @@ -20012,14 +20428,18 @@ packages: lru-cache: 10.4.3 minipass: 7.1.2 - /path-to-regexp@0.1.10: - resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false + /path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + dev: true + /path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} dev: true @@ -20060,6 +20480,12 @@ packages: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + /picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + /picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -20098,11 +20524,11 @@ packages: find-up: 4.1.0 dev: true - /pkg-types@1.2.1: - resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + /pkg-types@1.2.0: + resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} dependencies: - confbox: 0.1.8 - mlly: 1.7.2 + confbox: 0.1.7 + mlly: 1.7.1 pathe: 1.1.2 dev: true @@ -20144,6 +20570,17 @@ packages: postcss-selector-parser: 6.1.2 dev: false + /postcss-import@15.1.0(postcss@8.4.38): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + /postcss-import@15.1.0(postcss@8.4.47): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -20155,6 +20592,15 @@ packages: read-cache: 1.0.0 resolve: 1.22.8 + /postcss-js@4.0.1(postcss@8.4.38): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + /postcss-js@4.0.1(postcss@8.4.47): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} @@ -20164,6 +20610,23 @@ packages: camelcase-css: 2.0.1 postcss: 8.4.47 + /postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.2 + postcss: 8.4.38 + ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.3) + yaml: 2.5.0 + /postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} @@ -20179,7 +20642,16 @@ packages: lilconfig: 3.1.2 postcss: 8.4.47 ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.3) - yaml: 2.6.0 + yaml: 2.5.0 + + /postcss-nested@6.2.0(postcss@8.4.38): + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.1.2 /postcss-nested@6.2.0(postcss@8.4.47): resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} @@ -20220,8 +20692,8 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.1.1 - source-map-js: 1.0.2 + picocolors: 1.1.0 + source-map-js: 1.2.1 dev: false /postcss@8.4.38: @@ -20229,17 +20701,8 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - /postcss@8.4.45: - resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.1 - source-map-js: 1.2.1 - dev: true + picocolors: 1.0.1 + source-map-js: 1.2.0 /postcss@8.4.47: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} @@ -20249,12 +20712,19 @@ packages: picocolors: 1.1.1 source-map-js: 1.2.1 + /posthog-js@1.130.1: + resolution: {integrity: sha512-BC283kxeJnVIeAxn7ZPHf5sCTA6oXs4uvo9fdGAsbKwwfmF9g09rnJOOaoF95J/auf8HT4YB6Vt2KytqtJD44w==} + dependencies: + fflate: 0.4.8 + preact: 10.23.2 + dev: false + /posthog-js@1.179.0: resolution: {integrity: sha512-TLmDA3oDdjZfOaNCueXBdlWD+kTzBGvz2QpOY/zdzljbazXXl25xzXBINLIC7IxIS2gNAfCDRuOUosSZALOyUQ==} dependencies: core-js: 3.39.0 fflate: 0.4.8 - preact: 10.24.3 + preact: 10.23.2 web-vitals: 4.2.4 dev: false @@ -20278,8 +20748,8 @@ packages: - debug dev: false - /preact@10.24.3: - resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + /preact@10.23.2: + resolution: {integrity: sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==} dev: false /preferred-pm@3.1.4: @@ -20335,7 +20805,7 @@ packages: peerDependencies: react: '>=16.0.0' dependencies: - '@types/prismjs': 1.26.5 + '@types/prismjs': 1.26.4 clsx: 1.2.1 react: 18.3.1 dev: false @@ -20345,7 +20815,7 @@ packages: peerDependencies: react: '>=16.0.0' dependencies: - '@types/prismjs': 1.26.5 + '@types/prismjs': 1.26.4 clsx: 2.1.1 react: 18.3.1 dev: false @@ -20363,7 +20833,7 @@ packages: /probe.gl@3.6.0: resolution: {integrity: sha512-19JydJWI7+DtR4feV+pu4Mn1I5TAc0xojuxVgZdXIyfmTLfUaFnk4OloWK1bKbPtkgGKLr2lnbnCXmpZEcEp9g==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 '@probe.gl/env': 3.6.0 '@probe.gl/log': 3.6.0 '@probe.gl/stats': 3.6.0 @@ -20527,11 +20997,19 @@ packages: engines: {node: '>=6.0.0'} dev: false + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: true + /qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.6 + dev: false /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -20586,11 +21064,11 @@ packages: peerDependencies: react: '>=16' dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 react: 18.3.1 - react-syntax-highlighter: 15.6.1(react@18.3.1) + react-syntax-highlighter: 15.5.0(react@18.3.1) styled-components: 6.1.13(react-dom@18.3.1)(react@18.3.1) - tslib: 2.8.1 + tslib: 2.7.0 transitivePeerDependencies: - react-dom dev: false @@ -20612,7 +21090,7 @@ packages: dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - ua-parser-js: 0.7.39 + ua-parser-js: 0.7.38 dev: false /react-dom@18.2.0(react@18.2.0): @@ -20646,7 +21124,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: true - /react-email@2.1.1(@babel/core@7.26.0)(eslint@9.14.0)(ts-node@10.9.2): + /react-email@2.1.1(@babel/core@7.25.2)(eslint@9.14.0)(ts-node@10.9.2): resolution: {integrity: sha512-09oMVl/jN0/Re0bT0sEqYjyyFSCN/Tg0YmzjC9wfYpnMx02Apk40XXitySDfUBMR9EgTdr6T4lYknACqiLK3mg==} engines: {node: '>=18.0.0'} hasBin: true @@ -20678,7 +21156,7 @@ packages: glob: 10.3.4 log-symbols: 4.1.0 mime-types: 2.1.35 - next: 14.1.0(@babel/core@7.26.0)(react-dom@18.3.1)(react@18.3.1) + next: 14.1.0(@babel/core@7.25.2)(react-dom@18.3.1)(react@18.3.1) normalize-path: 3.0.0 ora: 5.4.1 postcss: 8.4.35 @@ -20731,7 +21209,7 @@ packages: react: '>=16' dependencies: '@types/hast': 2.3.10 - '@types/prop-types': 15.7.13 + '@types/prop-types': 15.7.12 '@types/react': 18.3.11 '@types/unist': 2.0.11 comma-separated-tokens: 2.0.3 @@ -20793,6 +21271,25 @@ packages: react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) tslib: 2.8.1 + /react-remove-scroll@2.5.10(@types/react@18.3.11)(react@18.3.1): + resolution: {integrity: sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.3.11 + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.11)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) + dev: false + /react-remove-scroll@2.5.4(react@18.3.1): resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} engines: {node: '>=10'} @@ -20847,7 +21344,6 @@ packages: tslib: 2.8.1 use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) - dev: false /react-remove-scroll@2.6.0(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} @@ -20866,6 +21362,7 @@ packages: tslib: 2.8.1 use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) + dev: false /react-style-singleton@2.2.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} @@ -20888,22 +21385,8 @@ packages: peerDependencies: react: '>= 0.14.0' dependencies: - '@babel/runtime': 7.26.0 - highlight.js: 10.7.3 - lowlight: 1.20.0 - prismjs: 1.29.0 - react: 18.3.1 - refractor: 3.6.0 - dev: false - - /react-syntax-highlighter@15.6.1(react@18.3.1): - resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==} - peerDependencies: - react: '>= 0.14.0' - dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 highlight.js: 10.7.3 - highlightjs-vue: 1.0.0 lowlight: 1.20.0 prismjs: 1.29.0 react: 18.3.1 @@ -21044,40 +21527,6 @@ packages: resolve: 1.22.8 dev: false - /recma-build-jsx@1.0.0: - resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} - dependencies: - '@types/estree': 1.0.6 - estree-util-build-jsx: 3.0.1 - vfile: 6.0.3 - - /recma-jsx@1.0.0(acorn@8.14.0): - resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} - dependencies: - acorn-jsx: 5.3.2(acorn@8.14.0) - estree-util-to-js: 2.0.0 - recma-parse: 1.0.0 - recma-stringify: 1.0.0 - unified: 11.0.5 - transitivePeerDependencies: - - acorn - - /recma-parse@1.0.0: - resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} - dependencies: - '@types/estree': 1.0.6 - esast-util-from-js: 2.0.1 - unified: 11.0.5 - vfile: 6.0.3 - - /recma-stringify@1.0.0: - resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - dependencies: - '@types/estree': 1.0.6 - estree-util-to-js: 2.0.0 - unified: 11.0.5 - vfile: 6.0.3 - /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -21122,7 +21571,7 @@ packages: resolution: {integrity: sha512-/fk5sI0iTgFYlmVGYVew90AoYnNMP6pooClx/XKqyeeCQXrL0Kvgn8V0VEht5ccdljbzzF1i3Q213gcntkRExg==} dependencies: '@types/hast': 2.3.10 - '@types/prismjs': 1.26.5 + '@types/prismjs': 1.26.4 hastscript: 7.2.0 parse-entities: 4.0.1 dev: true @@ -21130,12 +21579,12 @@ packages: /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - /regex@4.4.0: - resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} + /regex@4.3.3: + resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} dev: false - /regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -21178,11 +21627,11 @@ packages: unist-util-visit: 4.1.2 dev: true - /rehype-parse@9.0.1: - resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + /rehype-parse@9.0.0: + resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} dependencies: '@types/hast': 3.0.4 - hast-util-from-html: 2.0.3 + hast-util-from-html: 2.0.2 unified: 11.0.5 dev: false @@ -21193,9 +21642,9 @@ packages: shiki: ^1.3.0 dependencies: '@types/hast': 3.0.4 - hast-util-to-string: 3.0.1 + hast-util-to-string: 3.0.0 parse-numeric-range: 1.3.0 - rehype-parse: 9.0.1 + rehype-parse: 9.0.0 shiki: 1.12.0 unified: 11.0.5 unist-util-visit: 5.0.0 @@ -21209,22 +21658,13 @@ packages: vfile: 6.0.3 dev: false - /rehype-recma@1.0.0: - resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} - dependencies: - '@types/estree': 1.0.6 - '@types/hast': 3.0.4 - hast-util-to-estree: 3.1.0 - transitivePeerDependencies: - - supports-color - /rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} dependencies: '@types/hast': 3.0.4 github-slugger: 2.0.0 hast-util-heading-rank: 3.0.0 - hast-util-to-string: 3.0.1 + hast-util-to-string: 3.0.0 unist-util-visit: 5.0.0 dev: false @@ -21289,10 +21729,10 @@ packages: dependencies: '@types/mdast': 4.0.4 estree-util-is-identifier-name: 3.0.0 - estree-util-value-to-estree: 3.2.1 + estree-util-value-to-estree: 3.1.2 toml: 3.0.0 unified: 11.0.5 - yaml: 2.6.0 + yaml: 2.5.0 dev: true /remark-mdx@2.3.0: @@ -21303,8 +21743,8 @@ packages: transitivePeerDependencies: - supports-color - /remark-mdx@3.1.0: - resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + /remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} dependencies: mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 @@ -21324,7 +21764,7 @@ packages: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.1 micromark-util-types: 2.0.0 unified: 11.0.5 transitivePeerDependencies: @@ -21338,8 +21778,8 @@ packages: mdast-util-to-hast: 12.3.0 unified: 10.1.2 - /remark-rehype@11.1.1: - resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + /remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -21368,7 +21808,7 @@ packages: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} dependencies: '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.2 + mdast-util-to-markdown: 2.1.0 unified: 11.0.5 dev: false @@ -21605,6 +22045,32 @@ packages: source-map-support: 0.3.3 dev: false + /rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 + fsevents: 2.3.3 + dev: true + /rollup@4.24.4: resolution: {integrity: sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -21777,8 +22243,8 @@ packages: engines: {node: '>=10'} hasBin: true - /send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: debug: 2.6.9 @@ -21806,14 +22272,28 @@ packages: dependencies: randombytes: 2.1.0 - /serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + /seroval-plugins@1.1.1(seroval@1.1.1): + resolution: {integrity: sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + dependencies: + seroval: 1.1.1 + dev: false + + /seroval@1.1.1: + resolution: {integrity: sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==} + engines: {node: '>=10'} + dev: false + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: - encodeurl: 2.0.0 + encodeurl: 1.0.2 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.19.0 + send: 0.18.0 transitivePeerDependencies: - supports-color dev: true @@ -21878,6 +22358,37 @@ packages: '@img/sharp-wasm32': 0.33.4 '@img/sharp-win32-ia32': 0.33.4 '@img/sharp-win32-x64': 0.33.4 + dev: false + + /sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + dev: true /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} @@ -21931,14 +22442,14 @@ packages: '@types/hast': 3.0.4 dev: false - /shiki@1.22.2: - resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} + /shiki@1.21.0: + resolution: {integrity: sha512-apCH5BoWTrmHDPGgg3RF8+HAAbEL/CdbYr8rMw7eIrdhCkZHdVGat5mMNlRtd1erNG01VPMIKHNQ0Pj2HMAiog==} dependencies: - '@shikijs/core': 1.22.2 - '@shikijs/engine-javascript': 1.22.2 - '@shikijs/engine-oniguruma': 1.22.2 - '@shikijs/types': 1.22.2 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/core': 1.21.0 + '@shikijs/engine-javascript': 1.21.0 + '@shikijs/engine-oniguruma': 1.21.0 + '@shikijs/types': 1.21.0 + '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 dev: false @@ -21987,7 +22498,7 @@ packages: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} dependencies: - '@polka/url': 1.0.0-next.28 + '@polka/url': 1.0.0-next.25 mrmime: 2.0.0 totalist: 3.0.1 @@ -22129,15 +22640,15 @@ packages: - utf-8-validate dev: false - /socket.io@4.8.1: - resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + /socket.io@4.7.5: + resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} engines: {node: '>=10.2.0'} dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 debug: 4.3.7(supports-color@8.1.1) - engine.io: 6.6.2 + engine.io: 6.5.5 socket.io-adapter: 2.5.5 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -22146,6 +22657,25 @@ packages: - utf-8-validate dev: true + /solid-js@1.9.3: + resolution: {integrity: sha512-5ba3taPoZGt9GY3YlsCB24kCg0Lv/rie/HTD4kG6h4daZZz7+yK02xn8Vx8dLYBc9i6Ps5JwAbEiqjmKaLB3Ag==} + dependencies: + csstype: 3.1.3 + seroval: 1.1.1 + seroval-plugins: 1.1.1(seroval@1.1.1) + dev: false + + /solid-swr-store@0.10.7(solid-js@1.9.3)(swr-store@0.10.6): + resolution: {integrity: sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g==} + engines: {node: '>=10'} + peerDependencies: + solid-js: ^1.2 + swr-store: ^0.10 + dependencies: + solid-js: 1.9.3 + swr-store: 0.10.6 + dev: false + /sonner@1.3.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-+rOAO56b2eI3q5BtgljERSn2umRk63KFIvgb2ohbZ5X+Eb5u+a/7/0ZgswYqgBMg8dyl7n6OXd9KasA8QF9ToA==} peerDependencies: @@ -22178,6 +22708,10 @@ packages: engines: {node: '>=0.10.0'} dev: false + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + /source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -22275,6 +22809,15 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} + /sswr@2.0.0(svelte@4.2.19): + resolution: {integrity: sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==} + peerDependencies: + svelte: ^4.0.0 + dependencies: + svelte: 4.2.19 + swrev: 4.0.0 + dev: false + /sswr@2.1.0(svelte@5.1.9): resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==} peerDependencies: @@ -22367,7 +22910,7 @@ packages: engines: {node: '>=18'} dependencies: emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 + get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 dev: true @@ -22496,10 +23039,10 @@ packages: dependencies: inline-style-parser: 0.1.1 - /style-to-object@1.0.8: - resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + /style-to-object@1.0.7: + resolution: {integrity: sha512-uSjr59G5u6fbxUfKbb8GcqMGT3Xs9v5IbPkjb0S16GyOeBLAzSRK0CixBv5YrYvzO6TDLzIS6QCn78tkqWngPw==} dependencies: - inline-style-parser: 0.2.4 + inline-style-parser: 0.2.3 /styled-components@6.1.13(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==} @@ -22521,7 +23064,7 @@ packages: tslib: 2.6.2 dev: false - /styled-jsx@5.1.1(@babel/core@7.26.0)(react@18.3.1): + /styled-jsx@5.1.1(@babel/core@7.25.2)(react@18.3.1): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -22534,7 +23077,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.25.2 client-only: 0.0.1 react: 18.3.1 @@ -22576,7 +23119,6 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -22606,6 +23148,26 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /svelte@4.2.19: + resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} + engines: {node: '>=16'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + '@types/estree': 1.0.6 + acorn: 8.14.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.12 + periscopic: 3.1.0 + dev: false + /svelte@5.1.9: resolution: {integrity: sha512-nzq+PPKGS2PoEWDjAcXSrKSbXmmmOAxd6dAz1IhRusUpVkFS6DMELWPyBPGwu6TpO/gsgtFXwX0M4+pAR5gzKw==} engines: {node: '>=18'} @@ -22646,6 +23208,13 @@ packages: - encoding dev: false + /swr-store@0.10.6: + resolution: {integrity: sha512-xPjB1hARSiRaNNlUQvWSVrG5SirCjk2TmaUyzzvk69SZQan9hCJqw/5rG9iL7xElHU784GxRPISClq4488/XVw==} + engines: {node: '>=10'} + dependencies: + dequal: 2.0.3 + dev: false + /swr@2.2.0(react@18.3.1): resolution: {integrity: sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==} peerDependencies: @@ -22680,34 +23249,34 @@ packages: /tailwind-merge@2.2.0: resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 dev: false /tailwind-merge@2.3.0: resolution: {integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==} dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.25.6 dev: false - /tailwind-merge@2.5.4: - resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==} + /tailwind-merge@2.5.3: + resolution: {integrity: sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw==} dev: false - /tailwind-scrollbar@3.1.0(tailwindcss@3.4.10): + /tailwind-scrollbar@3.1.0(tailwindcss@3.4.3): resolution: {integrity: sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==} engines: {node: '>=12.13.0'} peerDependencies: tailwindcss: 3.x dependencies: - tailwindcss: 3.4.10(ts-node@10.9.2) + tailwindcss: 3.4.3(ts-node@10.9.2) dev: true - /tailwindcss-animate@1.0.7(tailwindcss@3.4.10): + /tailwindcss-animate@1.0.7(tailwindcss@3.4.3): resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' dependencies: - tailwindcss: 3.4.10(ts-node@10.9.2) + tailwindcss: 3.4.3(ts-node@10.9.2) dev: false /tailwindcss@3.4.0(ts-node@10.9.2): @@ -22717,7 +23286,7 @@ packages: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 - chokidar: 3.5.3 + chokidar: 3.6.0 didyoumean: 1.2.2 dlv: 1.1.3 fast-glob: 3.3.2 @@ -22728,7 +23297,7 @@ packages: micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.1.1 + picocolors: 1.1.0 postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) @@ -22759,7 +23328,7 @@ packages: micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.1.1 + picocolors: 1.1.0 postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) @@ -22771,6 +23340,36 @@ packages: transitivePeerDependencies: - ts-node + /tailwindcss@3.4.3(ts-node@10.9.2): + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2) + postcss-nested: 6.2.0(postcss@8.4.38) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -22843,7 +23442,7 @@ packages: supports-hyperlinks: 2.3.0 dev: false - /terser-webpack-plugin@5.3.10(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.96.1): + /terser-webpack-plugin@5.3.10(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.94.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -22865,12 +23464,12 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.36.0 - webpack: 5.96.1(@swc/core@1.3.101)(esbuild@0.19.11) + terser: 5.31.6 + webpack: 5.94.0(@swc/core@1.3.101)(esbuild@0.19.11) dev: false - /terser@5.36.0: - resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} + /terser@5.31.6: + resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -22936,6 +23535,10 @@ packages: os-tmpdir: 1.0.2 dev: true + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + /to-no-case@1.0.2: resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} @@ -23007,7 +23610,7 @@ packages: '@trpc/server': ^10.0.0 typescript: ^5.1 dependencies: - '@actions/core': 1.11.1 + '@actions/core': 1.10.1 '@actions/github': 5.1.1 '@octokit/core': 5.2.0 '@onetyped/core': 0.1.1 @@ -23064,8 +23667,8 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.14.9 - acorn: 8.14.0 - acorn-walk: 8.3.4 + acorn: 8.12.1 + acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -23126,6 +23729,14 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: false + /tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + dev: false + + /tslib@2.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + dev: false + /tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -23151,14 +23762,14 @@ packages: bundle-require: 4.2.1(esbuild@0.19.12) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.6 esbuild: 0.19.12 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2) resolve-from: 5.0.0 - rollup: 4.24.4 + rollup: 4.21.2 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 @@ -23174,7 +23785,7 @@ packages: hasBin: true dependencies: esbuild: 0.23.1 - get-tsconfig: 4.8.1 + get-tsconfig: 4.8.0 optionalDependencies: fsevents: 2.3.3 dev: true @@ -23314,9 +23925,15 @@ packages: engines: {node: '>=12.20'} dev: false + /type-fest@4.26.0: + resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} + engines: {node: '>=16'} + dev: true + /type-fest@4.26.1: resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} engines: {node: '>=16'} + dev: false /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} @@ -23391,9 +24008,8 @@ packages: hasBin: true dev: true - /ua-parser-js@0.7.39: - resolution: {integrity: sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==} - hasBin: true + /ua-parser-js@0.7.38: + resolution: {integrity: sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==} dev: false /ufo@1.5.4: @@ -23450,6 +24066,17 @@ packages: dependencies: '@fastify/busboy': 2.1.1 + /unenv-nightly@1.10.0-1717606461.a117952: + resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==} + dependencies: + consola: 3.2.3 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.4 + pathe: 1.1.2 + ufo: 1.5.4 + dev: true + /unenv-nightly@2.0.0-20241009-125958-e8ea22f: resolution: {integrity: sha512-hRxmKz1iSVRmuFx/vBdPsx7rX4o7Cas9vdjDNeUeWpQTK2LzU3Xy3Jz0zbo7MJX0bpqo/LEFCA+GPwsbl6zKEQ==} dependencies: @@ -23630,6 +24257,10 @@ packages: /universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + /universal-user-agent@7.0.2: + resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + dev: false + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -23645,28 +24276,24 @@ packages: engines: {node: '>= 0.8'} dev: true - /unplugin@1.15.0: - resolution: {integrity: sha512-jTPIs63W+DUEDW207ztbaoO7cQ4p5aVaB823LSlxpsFEU3Mykwxf3ZGC/wzxFJeZlASZYgVrWeo7LgOrqJZ8RA==} + /unplugin@1.12.3: + resolution: {integrity: sha512-my8DH0/T/Kx33KO+6QXAqdeMYgyy0GktlOpdQjpagfHKw5DrD0ctPr7SHUyOT3g4ZVpzCQGt/qcpuoKJ/pniHA==} engines: {node: '>=14.0.0'} - peerDependencies: - webpack-sources: ^3 - peerDependenciesMeta: - webpack-sources: - optional: true dependencies: acorn: 8.14.0 + webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.2 dev: true - /update-browserslist-db@1.1.1(browserslist@4.24.2): - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + /update-browserslist-db@1.1.0(browserslist@4.23.3): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.24.2 + browserslist: 4.23.3 escalade: 3.2.0 - picocolors: 1.1.1 + picocolors: 1.1.0 /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -23878,8 +24505,8 @@ packages: cac: 6.7.14 debug: 4.3.7(supports-color@8.1.1) pathe: 1.1.2 - picocolors: 1.1.1 - vite: 5.4.10(@types/node@20.14.9) + picocolors: 1.1.0 + vite: 5.4.2(@types/node@20.14.9) transitivePeerDependencies: - '@types/node' - less @@ -23931,6 +24558,45 @@ packages: fsevents: 2.3.3 dev: true + /vite@5.4.2(@types/node@20.14.9): + resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.14.9 + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.21.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vitest@1.5.3(@types/node@20.14.9)(@vitest/ui@1.6.0): resolution: {integrity: sha512-2oM7nLXylw3mQlW6GXnRriw+7YvZFk/YNV8AxIC3Z3MfFbuziLGWP9GPxxu/7nRlXhqyxBikpamr+lEEj1sUEw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -24021,19 +24687,19 @@ packages: '@vitest/spy': 1.6.0 '@vitest/ui': 1.6.0(vitest@1.6.0) '@vitest/utils': 1.6.0 - acorn-walk: 8.3.4 + acorn-walk: 8.3.3 chai: 4.5.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.6 execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.12 + magic-string: 0.30.11 pathe: 1.1.2 - picocolors: 1.1.1 + picocolors: 1.0.1 std-env: 3.7.0 strip-literal: 2.1.0 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.10(@types/node@20.14.9) + vite: 5.4.2(@types/node@20.14.9) vite-node: 1.6.0(@types/node@20.14.9) why-is-node-running: 2.3.0 transitivePeerDependencies: @@ -24104,8 +24770,8 @@ packages: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} dev: false - /webcrypto-core@1.8.1: - resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==} + /webcrypto-core@1.8.0: + resolution: {integrity: sha512-kR1UQNH8MD42CYuLzvibfakG5Ew5seG85dMMoAM/1LqvckxaF6pUiidLuraIu4V+YCIFabYecUZAW0TuxAoaqw==} dependencies: '@peculiar/asn1-schema': 2.3.13 '@peculiar/json-schema': 1.1.12 @@ -24136,7 +24802,7 @@ packages: html-escaper: 2.0.2 is-plain-object: 5.0.0 opener: 1.5.2 - picocolors: 1.1.1 + picocolors: 1.1.0 sirv: 2.0.4 ws: 7.5.10 transitivePeerDependencies: @@ -24147,14 +24813,13 @@ packages: /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - dev: false /webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} dev: true - /webpack@5.96.1(@swc/core@1.3.101)(esbuild@0.19.11): - resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} + /webpack@5.94.0(@swc/core@1.3.101)(esbuild@0.19.11): + resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -24163,13 +24828,13 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.14.0 - browserslist: 4.24.2 + acorn-import-attributes: 1.9.5(acorn@8.14.0) + browserslist: 4.23.3 chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.1 es-module-lexer: 1.5.4 @@ -24183,7 +24848,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.96.1) + terser-webpack-plugin: 5.3.10(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.94.0) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -24296,17 +24961,17 @@ packages: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true - /workerd@1.20240524.0: - resolution: {integrity: sha512-LWLe5D8PVHBcqturmBbwgI71r7YPpIMYZoVEH6S4G35EqIJ55cb0n3FipoSyraoIfpcCxCFxX1K6WsRHbP3pFA==} + /workerd@1.20240610.1: + resolution: {integrity: sha512-Rtut5GrsODQMh6YU43b9WZ980Wd05Ov1/ds88pT/SoetmXFBvkBzdRfiHiATv+azmGX8KveE0i/Eqzk/yI01ug==} engines: {node: '>=16'} hasBin: true requiresBuild: true optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20240524.0 - '@cloudflare/workerd-darwin-arm64': 1.20240524.0 - '@cloudflare/workerd-linux-64': 1.20240524.0 - '@cloudflare/workerd-linux-arm64': 1.20240524.0 - '@cloudflare/workerd-windows-64': 1.20240524.0 + '@cloudflare/workerd-darwin-64': 1.20240610.1 + '@cloudflare/workerd-darwin-arm64': 1.20240610.1 + '@cloudflare/workerd-linux-64': 1.20240610.1 + '@cloudflare/workerd-linux-arm64': 1.20240610.1 + '@cloudflare/workerd-windows-64': 1.20240610.1 dev: true /workerd@1.20241011.1: @@ -24322,12 +24987,12 @@ packages: '@cloudflare/workerd-windows-64': 1.20241011.1 dev: true - /wrangler@3.59.0(@cloudflare/workers-types@4.20240603.0): - resolution: {integrity: sha512-MLKejazUJrekbD8EnQfN6d7fei+IGnq2aVXeILFDy0aTktVNXKvO+eC+mND1zOr+k0KvQN4sJo8vGwqYoY7btw==} + /wrangler@3.60.3(@cloudflare/workers-types@4.20240603.0): + resolution: {integrity: sha512-a6zn/KFnYaYp3nxJR/aP0TeaBvJDkrrfI89KoxUtx28H7zpya/5/VLu3CxQ3PRspEojJGF0s6f3/pddRy3F+BQ==} engines: {node: '>=16.17.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20240524.0 + '@cloudflare/workers-types': ^4.20240605.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -24339,13 +25004,14 @@ packages: blake3-wasm: 2.1.5 chokidar: 3.6.0 esbuild: 0.17.19 - miniflare: 3.20240524.2 + miniflare: 3.20240610.0 nanoid: 3.3.7 - path-to-regexp: 6.3.0 + path-to-regexp: 6.2.2 resolve: 1.22.8 resolve.exports: 2.0.2 selfsigned: 2.4.1 source-map: 0.6.1 + unenv: /unenv-nightly@1.10.0-1717606461.a117952 xxhash-wasm: 1.0.2 optionalDependencies: fsevents: 2.3.3 @@ -24548,8 +25214,8 @@ packages: engines: {node: '>= 14'} dev: true - /yaml@2.6.0: - resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} + /yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} engines: {node: '>= 14'} hasBin: true @@ -24657,10 +25323,10 @@ packages: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} dev: false - /youch@3.3.4: - resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} + /youch@3.3.3: + resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} dependencies: - cookie: 0.7.2 + cookie: 0.5.0 mustache: 4.2.0 stacktracey: 2.1.8 dev: true @@ -24675,13 +25341,20 @@ packages: zod: 3.23.8 dev: false + /zod-to-json-schema@3.22.5(zod@3.23.8): + resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} + peerDependencies: + zod: ^3.22.4 + dependencies: + zod: 3.23.8 + dev: false + /zod-to-json-schema@3.23.2(zod@3.23.8): resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==} peerDependencies: zod: ^3.23.3 dependencies: zod: 3.23.8 - dev: false /zod-to-json-schema@3.23.5(zod@3.23.8): resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} @@ -24689,6 +25362,7 @@ packages: zod: ^3.23.3 dependencies: zod: 3.23.8 + dev: false /zod-validation-error@1.5.0(zod@3.22.3): resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==} @@ -24699,6 +25373,15 @@ packages: zod: 3.22.3 dev: false + /zod-validation-error@3.3.1(zod@3.23.8): + resolution: {integrity: sha512-uFzCZz7FQis256dqw4AhPQgD6f3pzNca/Zh62RNELavlumQB3nDIUFbF5JQfFLcMbO1s02Q7Xg/gpcOBlEnYZA==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + dependencies: + zod: 3.23.8 + dev: true + /zod-validation-error@3.4.0(zod@3.23.8): resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} engines: {node: '>=18.0.0'} @@ -24706,6 +25389,7 @@ packages: zod: ^3.18.0 dependencies: zod: 3.23.8 + dev: false /zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==}