diff --git a/packages/agents/docs/agents/agents.md b/packages/agents/docs/agents/agents.md index 9828016..dc34d50 100644 --- a/packages/agents/docs/agents/agents.md +++ b/packages/agents/docs/agents/agents.md @@ -1,37 +1,47 @@ -Task Interface +# Agents -```ts -import { Schema } from "@effect/schema" +An Agent is responsible for processing Tasks, and specializes in certain kinds of tasks. -interface Task{ - - - summary: string - acceptanceCriteria: string[] - format: Schema - - parent: Task - - - -} +There are different kinds of Agents: +| Kind | Purpose | Examples | +|-----------|-------------------------------------------|----------------------------------------| +| Execution | Perform concrete, well defined tasks. | Web Search, Writer, Coder | +| Reasoning | Refines complex tasks into smaller tasks. | Intent Refiner, Solution Planner | +| Experts | Able to resolve domain specific details. | Marketing Expert, Data Modeling Expert | +| Directors | Orchestrate and monitor tasks and agents. | Task Assigner, Metric Monitor, | -``` +## Creating Agents -Agent Interface +### Typescript classes -```ts +Agents can be created by extending the `Agent` class and implementing the necessary methods. These classes can then be registered with the runtime. +```ts -interface Agent{ - - assign(task:Task){ - -} +class WikipediaAgent extends ExecutionAgent { + + name = "Wikipedia"; + description = "Searches Wikipedia for a given term"; + prompt = "You are an expert wikipedia searcher who helps....."; + + override async process(task: Task): Promise { + return super.process(task); + } + + async search(query: string): Promise { + const url = `https://wikipedia.com/wiki/${snake(query)}`; + const response = await fetch(url); + if (response.ok) { + const contents = await response.text(); + const startingPoint = contents.search("mw-content-text"); + return conents.substring(startingPoint); + } + throw new Error(response.statusText); + } } @@ -39,28 +49,43 @@ interface Agent{ ``` +```ts +const runtime = new AgentRuntime(); +runtime.registerAgents([WikipediaAgent]); +``` -Status +### YAML Manifests -```ts +Agents can be declared as YAML files, making them easy to create for end users or LLMs. +```yaml +kind: Agent +name: Wikipedia +skills: + - Query wikipedia for background -interface { +prompt: | + You are an expert wikipedia searcher who helps perform background research. Ground your responses based on the results of the search tool. Do not make anything up. If the search returns a disambiguation page, extract the term from the page and search again. + +tools: + - name: search + parameters: + - query: + - type: string + description: The slug to query wikipedia for + source: + type: generate + prompt: Use the `query` parameter to construct a wikipedia url in the format `https://en.wikipedia.org/wiki/{query}`. Make sure to replace the spaces with underscores so it's URL Safe. Then fetch the html of that page. Return the contents of the div with id "mw-content-text". + + +model: + class: 'highest' + settings: + temperature: 0 -} +``` -interface AgentStatus { - class: "execution" | "reasoner" | "director"; - available: boolean; - invocations: number; - failRate: number; - p95: number; -} -interface SystemStatus { - agents: AgentStatus[]; -} -``` \ No newline at end of file diff --git a/packages/agents/docs/agents/directors/communicator.md b/packages/agents/docs/agents/directors/communicator.md new file mode 100644 index 0000000..f5c0e4c --- /dev/null +++ b/packages/agents/docs/agents/directors/communicator.md @@ -0,0 +1,22 @@ +# Communicator Agent + +This agent is responsible for drafting messages to be sent to the user based on details defined in the task. + +## Use Cases + +### Responding to Questions + +### Asking for clarifications + +## Responding +1. Ensures response lines up with question +2. Provides answer, then quick summary of activities to get it. +3. Provides Citations + +## Protocol + +Messages are formatted in markdown, with several custom directives available. + +### Choices UI + +If we need the user to choose between options, we can use the markdown directive `[button label="More" variant="outline"](https://)` \ No newline at end of file diff --git a/packages/agents/docs/agents/directors/process-monitor.md b/packages/agents/docs/agents/directors/process-monitor.md new file mode 100644 index 0000000..89ffd3b --- /dev/null +++ b/packages/agents/docs/agents/directors/process-monitor.md @@ -0,0 +1,15 @@ +# Process Monitor + +The process monitor tracks metrics relating to Agents, Tasks, and timing. + +## Monitoring + +Task Objects fire events on creation, assignment, and completion. Appends to a DuckDB table. + +## Rabbit Holes + +If a task produces many subtasks, or is cycling, this agent will force the task to return or terminate it. + +## User Activity + +If a task is expected to require multiple subtasks or is complex, the process monitor will issue new tasks to update the 'thinking' text to reflect what activity is occurring based on task assignment events. \ No newline at end of file diff --git a/packages/agents/docs/agents/directors/task-assigner.md b/packages/agents/docs/agents/directors/task-assigner.md new file mode 100644 index 0000000..6b955ed --- /dev/null +++ b/packages/agents/docs/agents/directors/task-assigner.md @@ -0,0 +1,12 @@ +# Task Assigner Agent + +This agent inspects a submitted task, and selects from the list of registered agents the one most appropriate. That agent is then assigned the task. + +## Details + +### Reassignment +If the model rejects the task, times out or fails to complete the task, the Task Assigner may re-assign it to another Agent. + +### Gibberish +If the task is nonsense or malformed, the agent can create a new task to respond to the user generically and assign the task to the Communication Agent. + diff --git a/packages/agents/docs/agents/execution/browser_agent.md b/packages/agents/docs/agents/execution/browser_agent.md new file mode 100644 index 0000000..025263d --- /dev/null +++ b/packages/agents/docs/agents/execution/browser_agent.md @@ -0,0 +1,13 @@ +# Browser Agent + +## Description +The Browser Agent is responsible for automating web browsing tasks. It can navigate to websites, interact with forms, click buttons, and extract data from web pages. + +## Tools +- **Navigate to URL**: Opens a web page and interacts with it. +- **Form Interaction**: Fills out forms and submits data. + +## Use Cases +- Automating interactions with web-based dashboards. +- Extracting data from forms or login-restricted content. +- Performing repetitive browsing tasks like checking page updates. \ No newline at end of file diff --git a/packages/agents/docs/agents/execution/cms_agent.md b/packages/agents/docs/agents/execution/cms_agent.md new file mode 100644 index 0000000..5b4292c --- /dev/null +++ b/packages/agents/docs/agents/execution/cms_agent.md @@ -0,0 +1,12 @@ +# CMS Agent + +## Description +The CMS Agent interacts with Content Management Systems (CMS) to manage and manipulate content. This agent can create, update, delete, or retrieve content from popular CMS platforms. + +## Tools +- **Manage CMS Content**: Interacts with CMS systems to handle content changes. + +## Use Cases +- Automating content updates in a CMS. +- Fetching and displaying specific content from a CMS. +- Managing large amounts of content across multiple platforms. \ No newline at end of file diff --git a/packages/agents/docs/agents/execution/code_agent.md b/packages/agents/docs/agents/execution/code_agent.md new file mode 100644 index 0000000..bc5ec2c --- /dev/null +++ b/packages/agents/docs/agents/execution/code_agent.md @@ -0,0 +1 @@ +# Code Agent diff --git a/packages/agents/docs/agents/execution/crawl_agent.md b/packages/agents/docs/agents/execution/crawl_agent.md new file mode 100644 index 0000000..d1283d5 --- /dev/null +++ b/packages/agents/docs/agents/execution/crawl_agent.md @@ -0,0 +1,12 @@ +# Crawl Agent + +## Description +The Crawl Agent is designed to scrape and crawl through websites to gather data. This agent can handle paginated websites and scrape specific content from HTML pages. + +## Tools +- **Web Scraper**: Extracts content from a webpage based on defined selectors. + +## Use Cases +- Gathering data for research purposes from a list of websites. +- Crawling e-commerce sites to collect product data. +- Monitoring changes on web pages. \ No newline at end of file diff --git a/packages/agents/docs/agents/execution/diagram_agent.md b/packages/agents/docs/agents/execution/diagram_agent.md new file mode 100644 index 0000000..7fdb077 --- /dev/null +++ b/packages/agents/docs/agents/execution/diagram_agent.md @@ -0,0 +1 @@ +# Diagram Agent diff --git a/packages/agents/docs/agents/execution/execution_agent_builder.md b/packages/agents/docs/agents/execution/execution_agent_builder.md new file mode 100644 index 0000000..b493164 --- /dev/null +++ b/packages/agents/docs/agents/execution/execution_agent_builder.md @@ -0,0 +1,12 @@ +# Execution Agent Builder + +## Description +The Execution Agent Builder creates customized execution agents that perform concrete tasks. These agents are specialized in task completion, with a strong focus on well-defined objectives. + +## Tools +- **Task Executor**: Executes tasks based on predefined steps. + +## Use Cases +- Creating tailored agents for specific operational tasks. +- Automating repeated workflows. +- Performing scheduled, recurring tasks across systems. \ No newline at end of file diff --git a/packages/agents/docs/agents/execution/extractor_agent.md b/packages/agents/docs/agents/execution/extractor_agent.md new file mode 100644 index 0000000..2f8ed3d --- /dev/null +++ b/packages/agents/docs/agents/execution/extractor_agent.md @@ -0,0 +1 @@ +# Extractor Agent diff --git a/packages/agents/docs/agents/execution/image_creator.md b/packages/agents/docs/agents/execution/image_creator.md new file mode 100644 index 0000000..43e7ad2 --- /dev/null +++ b/packages/agents/docs/agents/execution/image_creator.md @@ -0,0 +1,12 @@ +# Image Creator + +## Description +The Image Creator Agent generates images based on text descriptions. This agent can create realistic or abstract images using AI image generation models. + +## Tools +- **Image Generator**: Creates images from textual prompts. + +## Use Cases +- Generating illustrations or concepts for design purposes. +- Producing visuals for marketing campaigns. +- Crafting concept art or visual prototypes. \ No newline at end of file diff --git a/packages/agents/docs/agents/execution/rest_agent.md b/packages/agents/docs/agents/execution/rest_agent.md new file mode 100644 index 0000000..d342a96 --- /dev/null +++ b/packages/agents/docs/agents/execution/rest_agent.md @@ -0,0 +1,12 @@ +# REST Agent + +## Description +The REST Agent specializes in interacting with RESTful APIs. It can make GET, POST, PUT, DELETE, and other requests, and handle the responses effectively. + +## Tools +- **Send API Request**: Makes API calls based on the request method and parameters. + +## Use Cases +- Integrating with third-party services via APIs. +- Retrieving or updating data through web services. +- Automating API interactions for testing or data collection. \ No newline at end of file diff --git a/packages/agents/docs/agents/execution/shell_agent.md b/packages/agents/docs/agents/execution/shell_agent.md new file mode 100644 index 0000000..1ae9379 --- /dev/null +++ b/packages/agents/docs/agents/execution/shell_agent.md @@ -0,0 +1,12 @@ +# Shell Agent + +## Description +The Shell Agent can execute shell commands on a local or remote system. It interacts with the operating system through the command line, allowing it to manage files, processes, and system configurations. + +## Tools +- **Execute Shell Command**: Runs shell commands and retrieves their output. + +## Use Cases +- Running maintenance or deployment scripts. +- Monitoring system resource usage or log files. +- Automating repetitive terminal tasks. \ No newline at end of file diff --git a/packages/agents/docs/agents/execution/sourcegraph_agent.md b/packages/agents/docs/agents/execution/sourcegraph_agent.md new file mode 100644 index 0000000..4edbd09 --- /dev/null +++ b/packages/agents/docs/agents/execution/sourcegraph_agent.md @@ -0,0 +1,12 @@ +# SourceGraph Agent + +## Description +The SourceGraph Agent is specialized in searching and understanding large codebases. It uses SourceGraph's API to locate code snippets, classes, functions, and comments within repositories. + +## Tools +- **Code Search**: Search for code snippets, classes, or documentation across repositories. + +## Use Cases +- Locating specific code implementations across various repositories. +- Understanding the context of a function or class within large codebases. +- Navigating and indexing complex projects for analysis or refactoring. \ No newline at end of file diff --git a/packages/agents/docs/agents/execution/sql_agent.md b/packages/agents/docs/agents/execution/sql_agent.md new file mode 100644 index 0000000..b9dc4dd --- /dev/null +++ b/packages/agents/docs/agents/execution/sql_agent.md @@ -0,0 +1,12 @@ +# SQL Agent + +## Description +The SQL Agent specializes in interacting with databases to perform SQL queries. This agent is capable of retrieving data, updating records, and performing complex data manipulations through SQL statements. + +## Tools +- **Execute SQL**: Executes a provided SQL query against a database. + +## Use Cases +- Querying large datasets for specific metrics. +- Performing data aggregations and transformations. +- Managing and updating database records efficiently. \ No newline at end of file diff --git a/packages/agents/docs/agents/execution/web_search_agent.md b/packages/agents/docs/agents/execution/web_search_agent.md new file mode 100644 index 0000000..37b4c91 --- /dev/null +++ b/packages/agents/docs/agents/execution/web_search_agent.md @@ -0,0 +1,12 @@ +# Web Search Agent + +## Description +The Web Search Agent performs internet searches using a query. This agent is designed to find information and retrieve relevant links or summaries based on the search results. + +## Tools +- **Search**: Queries the web and returns the most relevant results. + +## Use Cases +- Researching a topic or gathering information from the web. +- Finding references, documentation, or tutorials. +- Monitoring search results for specific keywords. \ No newline at end of file diff --git a/packages/agents/docs/agents/impl.md b/packages/agents/docs/agents/impl.md deleted file mode 100644 index 5e5104d..0000000 --- a/packages/agents/docs/agents/impl.md +++ /dev/null @@ -1,64 +0,0 @@ -# Agents - -An Agent is responsible for processing Tasks, and specializes in certain kinds of tasks. - -There are different kinds of Agents: - - -| Kind | Purpose | Examples | -|-----------|-------------------------------------------|----------------------------------------| -| Execution | Perform concrete, well defined tasks. | Web Search, Writer, Coder | -| Reasoning | Refines complex tasks into smaller tasks. | Intent Refiner, Solution Planner | -| Experts | Able to resolve domain specific details. | Marketing Expert, Data Modeling Expert | -| Directors | Orchestrate and monitor tasks and agents. | Task Assigner, Metric Monitor, | - - -### Agent Declaration - -```ts -abstract class Agent{ - - name: string - skills: Array - - abstract process(task:Task): Promise> - - modelSettings: ModelSettings - -} - - -``` - -```yaml - -kind: execution -name: Payload CMS Agent -skills: - - Access Payload CMS - - Query / Read Documents - - Create / Update Documents - - Describe Collections - -prompt: | - You are an agent who can perform tasks and answer questions using the connected content management system. - - -workflows: - - name: 'List Collections' - prompt: | - Demo - fdsdsf - - - - -model: - class: 'highest' - settings: - temperature: 0 - - - -``` - diff --git a/packages/agents/docs/agents/reasoners/_reasoner.md b/packages/agents/docs/agents/reasoners/_reasoner.md new file mode 100644 index 0000000..005d2c9 --- /dev/null +++ b/packages/agents/docs/agents/reasoners/_reasoner.md @@ -0,0 +1,47 @@ +# Base Reasoner Class + +All reasoners inherit from a class providing basic tools and task creation instructions. + + +## Tools + +### Get Agents + +Lists the available agents and tools they can access + +### Request Information + +Get information on a topic or detail. + +### Ask Expert + +Ask an expert for help. + +## Conventions + +### Reflection +Think out loud before responding, reflect on anything any assumptions. When you have your thoughts together, use a directive separator '---' to start your final response. + +### Context + +Context is injected from parent tasks. + +## Response +Responses are in the form of markdown + +```md +--- +response: rejection +--- + +I'm rejecting this task because +- reason 1 +- reason 2 + + +``` + + + + + diff --git a/packages/agents/docs/agents/reasoners/intent-refiner.md b/packages/agents/docs/agents/reasoners/intent-refiner.md new file mode 100644 index 0000000..73d0b47 --- /dev/null +++ b/packages/agents/docs/agents/reasoners/intent-refiner.md @@ -0,0 +1,38 @@ +# Intent Refiner + +Generates a more explicit version of a user's message, filling in gaps and references, as well as formalizing what a response should look like. + +## Example + +### Message +"What are some possible article topics which would improve our SEO?" + +### Response + +Creates Task for background on "SEO", ways to improve it. + +Responds: +Intent: Generate Information +Intended Artifact: List of Titles (for Articles) +Schema: Array +Acceptance Criteria: + - Articles should improve SEO + - Articles must not exist already. + - Articles must be relevant to our existing content + - Articles must relate to search terms which have meaningful traffic but are low cost/difficulty + - Articles should be similar to existing articles in structure and format and voice. + + +## Intents + +| Feature | Description | +|------------------------|-------------------------------| +| Generate Information | wants new generated new data | +| Query Information | wants to find existing data | +| List available actions | wants to know what's possible | +| Perform Action | Wants us to perform an action | +| Analyze Data | Wants an analysis of data | + + + + diff --git a/packages/agents/docs/agents/reasoners/qa.md b/packages/agents/docs/agents/reasoners/qa.md new file mode 100644 index 0000000..5f5a410 --- /dev/null +++ b/packages/agents/docs/agents/reasoners/qa.md @@ -0,0 +1,3 @@ +# Quality Assurance + +Validates result is in the format expected and criteria is satisfied. \ No newline at end of file diff --git a/packages/agents/docs/agents/reasoners/researcher.md b/packages/agents/docs/agents/reasoners/researcher.md new file mode 100644 index 0000000..2d52f3f --- /dev/null +++ b/packages/agents/docs/agents/reasoners/researcher.md @@ -0,0 +1,24 @@ +# Researcher + +Aggregates information for vague requests or requests spanning multiple sources. + +## Example + +Continues Example from [Solution Planner](./solution-planner.md) + +Request: +1. Determine details about existing Articles + - High Level Topics + - Existing Article Titles (max 20) + Output is List of Topics, List of Existing Articles + + +Invokes tool to get agent list, identifying ones which may relate to Articles. + +Create Tasks +1. Query CMS for available collections +2. Find relevant collections for topics and articles +3. Query CMS for records +4. Extract from records + 5. List of topics + 6. List of Article Titles diff --git a/packages/agents/docs/agents/reasoners/solution-planner.md b/packages/agents/docs/agents/reasoners/solution-planner.md new file mode 100644 index 0000000..2d598ae --- /dev/null +++ b/packages/agents/docs/agents/reasoners/solution-planner.md @@ -0,0 +1,36 @@ +# Solution Planner + +Based on the extracted intent, creates a plan to achieve it. + +## General Algorithm + +Identify any information referred to explicitly, add to plan. + +Identify if an expert would provide a process or important information. + +Work Backwards from the desired intent to a list of necessary primitives. Add steps to get the primitives "somehow". + + + +## Example + +Intent based on [Intent Example](./intent-refiner.md) + +1. Determine details about existing Articles + - High Level Topics + - Existing Article Titles (max 20) + Output is List of Topics, List of Existing Articles +2. Bring in SEO Expert to + - Validate Relevant information + - Reframe topics as SEO terms + - Generate example terms + - Provide details on how to find Cost and Difficulty per term + Output is Further Guidance, Example Search Terms, Topics +3. Plan actions based on guidance and agents + - Read Only Actions + - Verify with Expert + - Output should be list of viable search terms to target +4. Generate Article Titles (3-5) that match search terms + - Similar in structure to existing articles retrieved earlier + - Verify article doesn't already exist +5. Present articles to user \ No newline at end of file diff --git a/packages/agents/package.json b/packages/agents/package.json index 90b85c7..3ceb8ad 100644 --- a/packages/agents/package.json +++ b/packages/agents/package.json @@ -22,17 +22,24 @@ "postinstall": "pnpm build:stub" }, "devDependencies": { - "vitest": "^2.1.1", - "vite-tsconfig-paths": "^5.0.1" - }, - "peerDependencies": { + "@types/mdast": "^4.0.4", + "vite-tsconfig-paths": "^5.0.1", + "vitest": "^2.1.1" }, "dependencies": { - "effect": "^3.7.2", - "radash": "^12.1.0", - "@effect/schema": "^0.74.1", "@effect/core": "latest", "@effect/platform": "latest", - "@effect/platform-node": "latest" + "@effect/platform-node": "latest", + "@effect/schema": "^0.74.1", + "effect": "^3.7.2", + "mdast": "^3.0.0", + "mdast-util-heading-range": "^4.0.0", + "ollama": "^0.5.9", + "radash": "^12.1.0", + "remark": "^15.0.1", + "remark-gfm": "^4.0.0", + "unified": "^11.0.5", + "unist-util-find": "^3.0.0", + "unist-util-select": "^5.1.0" } } diff --git a/packages/agents/src/Agent.spec.ts b/packages/agents/src/Agent.spec.ts new file mode 100644 index 0000000..06d58e6 --- /dev/null +++ b/packages/agents/src/Agent.spec.ts @@ -0,0 +1,26 @@ +import { HelloAgent, Task } from "./Agent"; +import { Effect, Layer, pipe } from "effect"; +import { Schema } from "@effect/schema"; +import { AppLayer, LLMServiceLive } from "./services"; + +describe("Agent", () => { + it("should ", {timeout:100000},async () => { + const program = Effect.gen(function* () { + const agent = new HelloAgent(); + const createTask = Effect.succeed( + new Task( + "Create a greeting for Alex Whiteside, a software architect who enjoys sarcasm and XKCD", + ["Be Positive", "Be Creative"], + Schema.Struct({greeting: Schema.String}), + ), + ); + const result = yield* agent.process(createTask); + console.log(result); + }); + + const ollamaLayer = LLMServiceLive(); + const runnable = Effect.provide(program, ollamaLayer); + + await Effect.runPromiseExit(runnable).then(console.log); + }); +}); diff --git a/packages/agents/src/Agent.ts b/packages/agents/src/Agent.ts new file mode 100644 index 0000000..588d4f4 --- /dev/null +++ b/packages/agents/src/Agent.ts @@ -0,0 +1,156 @@ +import { JSONSchema, Schema } from "@effect/schema"; +import { LLMService } from "./services"; +import { Effect, pipe, Either } from "effect"; +import { extractJSON, getMdast, stringifyMdast } from "./md"; +import { Match } from "effect"; +import { get, isArray, unique } from "radash"; +import { isSchema, transform } from "@effect/schema/Schema"; +import { getSectionByHeading } from "./md/getSection"; +import { Root } from "mdast"; + +export class Task { + constructor( + readonly instructions: string, + readonly acceptanceCriteria: Array = [], + readonly format: Schema.Schema.AnyNoContext, + ) {} +} + +class TaskResult { + constructor( + readonly data: Schema.Schema.Type, + readonly unstructured: string, + ) {} +} + +type SupportedFormats = string | string[] | Schema.Schema.AnyNoContext; + +const formatString = Match.type().pipe( + Match.when(Match.string, (_) => _), + Match.when(isArray, (_) => _.map((_) => `- ${_}`).join("\n")), + Match.when(isSchema, (_) => JSON.stringify(JSONSchema.make(_))), + Match.when(Match.record, (_) => JSON.stringify(_)), + Match.exhaustive, +); + +export const InjectSection = (section: string, data: SupportedFormats) => { + const content = formatString(data); + return [`## ${section}`, content].join("\n"); +}; + +type Section = { + heading: string; + purpose: string; + format: string; +}; + +const sections = { + planning: { + heading: "Planning", + purpose: + "Use this section to plan your response to the task step by step, and reflect on your approach. It will be discarded. ", + format: "valid markdown", + }, + data: { + heading: "Structured Data", + purpose: "Structured data conforming to the provided schema (JSON Schema)", + format: "A json code block containing the valid JSON ", + }, + unstructured: { + heading: "Unstructured Data", + purpose: + "Any additional data requested by the instructions which was not part of the structured data. This should rarely be used.", + format: "valid markdown", + }, +}; + +const toMarkdownTable = >(data: Array) => { + const keys = unique(data.flatMap((item) => Object.keys(item))); + const headingRow = `| ${keys.join(" | ")} |`; + const separatorRow = `|${keys.map(() => "-----").join("|")}|`; + const dataRows = data + .map((item) => `| ${keys.map((key) => get(item, key, "")).join(" | ")} |`) + .join("\n"); + return [headingRow, separatorRow, dataRows].join("\n"); +}; + +const promptContext = [ + "Your responses will only be seen by other Agents - so be precise, follow instructions, and format your response carefully.", + "Your response should be in markdown organized into sections by blocks which start with specific Heading Level 2 headings. For example, \n```md\n## MySection \n\n This is my section. \n```\n would be a MySection section with contents 'This is my section' ", + "The table below lists the valid sections, what heading to use, when to use it (purpose), and how to format their contents. ", + toMarkdownTable(Object.values(sections)), +]; + +export abstract class Agent { + abstract name: string; + abstract description: string; + + constructor() {} + + generatePrompt(task: Task) { + const about = InjectSection( + "About You", + [ + `You are a ${this.name}, responsible for ${this.description}.`, + "You are part of a multi-agent system which helps humans solve complex problems.", + ].join("\n"), + ); + + const context = InjectSection( + "Response Conventions", + promptContext.join("\n"), + ); + + const details = [ + InjectSection("Instructions", task.instructions), + InjectSection("Acceptance Criteria", task.acceptanceCriteria), + InjectSection("Schema (JsonSchema)", task.format), + ]; + + return [about, context, ...details].join("\n\n"); + } + + process(task: Effect.Effect, Error, never>) { + const generatePrompt = this.generatePrompt.bind(this); + return Effect.gen(function* () { + const llm = yield* LLMService; + + const taskReal = yield* task; + console.log(taskReal); + const prompt = generatePrompt(taskReal); + console.log(prompt); + const response = yield* llm.generateText(prompt, "mistral-small"); + return parseTaskResponse(taskReal, response); + }); + } +} + +export class HelloAgent extends Agent { + name = "Hello Agent"; + description = "Welcomes people to the project"; +} + +const parseTaskResponse = (task: Task, response: string) => { + const root = getMdast(response); + + const getSection = >( + heading: string, + transform?: T, + ) => { + return pipe( + Effect.try({ + try: () => getSectionByHeading(root, heading), + catch: (err) => err, + }), + Effect.map(transform ?? stringifyMdast), + ); + }; + + const data = getSection(sections.data.heading, (node) => + Schema.decodeEither(task.format)(extractJSON(node)), + ); + + if (task.format && data && Either.isLeft(data)) throw new Error("Failed"); + const unstructured = getSection(sections.unstructured.heading); + return new TaskResult(data, unstructured); +}; diff --git a/packages/agents/src/logic.ts b/packages/agents/src/logic.ts index fe35695..8ee9ff7 100644 --- a/packages/agents/src/logic.ts +++ b/packages/agents/src/logic.ts @@ -15,16 +15,14 @@ export class Director implements Agent { directives = [] taskAssigner = new TaskAssigner() - execute(context: AgentContext): Effect.Effect { - return Effect.gen(function* (this: Director, _) { + execute(context: AgentContext) { + return Effect.gen(this, function* () { const currentTask: Task = context.currentTask if (!currentTask.assignee) { - yield* _(Effect.suspend(() => this.taskAssigner.assignTask(currentTask))) + yield* Effect.suspend(() => this.taskAssigner.assignTask(currentTask)) } - - return context - }.bind(this)) + } } } diff --git a/packages/agents/src/md/extract.ts b/packages/agents/src/md/extract.ts new file mode 100644 index 0000000..ed6e105 --- /dev/null +++ b/packages/agents/src/md/extract.ts @@ -0,0 +1,10 @@ +import { Code, Root } from "mdast"; +import { select } from "unist-util-select"; + +export const extractJSON = (tree: Root) => { + const result = select("code[lang=json]", tree) as Code; + const object = JSON.parse(result.value); + return object; +}; + + diff --git a/packages/agents/src/md/getSection.ts b/packages/agents/src/md/getSection.ts new file mode 100644 index 0000000..93879c2 --- /dev/null +++ b/packages/agents/src/md/getSection.ts @@ -0,0 +1,42 @@ +import type { Parent, Root } from 'mdast' +import { headingRange } from 'mdast-util-heading-range' +import { find } from 'unist-util-find' +import between from 'unist-util-find-all-between' + +export const getSectionByHeading = ( + tree: Root, + query: string, +): Root => { + let section: Root | undefined = undefined + headingRange(tree, query, (start, between) => { + section = { type: 'root', children: between, data: { heading: start } } + }) + if(section) return section + throw new Error('Section not Found') +} + +export const getSections = (tree: Root | Parent) => { + const sections: Array = [] + let active = true + while (tree.children.length && active) { + active = false + headingRange(tree as Root, /(.*)/, (start, between, end) => { + sections.push({ + type: 'root', + children: between, + data: { heading: start }, + }) + tree.children = end ? tree.children.slice(tree.children.indexOf(end)) : [] + active = true + }) + } + return sections +} + +export const getNoHeadingContent = (tree: Root): Root | undefined => { + const firstHeading = find(tree, { type: 'heading', depth: 1 }) + const secondHeading = find(tree, { type: 'heading', depth: 2 }) + if (!firstHeading || !secondHeading) return undefined + // @ts-ignore + return { type: 'root', children: between(tree, firstHeading, secondHeading) } +} diff --git a/packages/agents/src/md/index.ts b/packages/agents/src/md/index.ts new file mode 100644 index 0000000..6c8c4de --- /dev/null +++ b/packages/agents/src/md/index.ts @@ -0,0 +1,2 @@ +export { extractJSON } from "./extract"; +export { getMdast, stringifyMdast } from "./pipeline"; diff --git a/packages/agents/src/md/md.spec.ts b/packages/agents/src/md/md.spec.ts new file mode 100644 index 0000000..4d72bf5 --- /dev/null +++ b/packages/agents/src/md/md.spec.ts @@ -0,0 +1,19 @@ +import { extractJSON } from "./extract"; +import { getMdast } from "./pipeline"; + +describe("Markdown", () => { + it("should ", () => { + const content = `# My Code + +\`\`\`json +{ +"foo": "bar" +} +\`\`\` + `; + + const mdast = getMdast(content); + const result = extractJSON(mdast); + expect(result).toMatchObject({ foo: "bar" }); + }); +}); diff --git a/packages/agents/src/md/pipeline.ts b/packages/agents/src/md/pipeline.ts new file mode 100644 index 0000000..c8796df --- /dev/null +++ b/packages/agents/src/md/pipeline.ts @@ -0,0 +1,11 @@ +import { remark } from "remark"; +import remarkGfm from "remark-gfm"; +import { Root } from "mdast"; + +const markdownPipeline = remark().use(remarkGfm); + +export const getMdast = (md: string) => { + return markdownPipeline.parse(md); +}; + +export const stringifyMdast = (node: Root)=> markdownPipeline.stringify(node) \ No newline at end of file diff --git a/packages/agents/src/services.ts b/packages/agents/src/services.ts index 53449b4..5ed4ec9 100644 --- a/packages/agents/src/services.ts +++ b/packages/agents/src/services.ts @@ -1,7 +1,8 @@ // services.ts -import { Effect, Context, Layer } from "effect" -import { LogEvent, ProcessStatus, Article } from "./types" +import { Effect, Context, Layer } from "effect"; +import { LogEvent, ProcessStatus, Article } from "./types"; +import { Ollama } from "ollama"; /** * LLMService tag @@ -9,8 +10,13 @@ import { LogEvent, ProcessStatus, Article } from "./types" export class LLMService extends Context.Tag("LLMService")< LLMService, { - readonly generateText: (prompt: string, model: string) => Effect.Effect - readonly getEmbedding: (text: string) => Effect.Effect + readonly generateText: ( + prompt: string, + model: string, + ) => Effect.Effect; + readonly getEmbedding: ( + text: string, + ) => Effect.Effect; } >() {} @@ -20,8 +26,14 @@ export class LLMService extends Context.Tag("LLMService")< export class VectorStoreService extends Context.Tag("VectorStoreService")< VectorStoreService, { - readonly storeVector: (id: string, vector: number[]) => Effect.Effect - readonly queryVector: (vector: number[], topK: number) => Effect.Effect + readonly storeVector: ( + id: string, + vector: number[], + ) => Effect.Effect; + readonly queryVector: ( + vector: number[], + topK: number, + ) => Effect.Effect; } >() {} @@ -31,8 +43,10 @@ export class VectorStoreService extends Context.Tag("VectorStoreService")< export class CMSService extends Context.Tag("CMSService")< CMSService, { - readonly fetchArticles: (args: any) => Effect.Effect - readonly checkArticleExists: (title: string) => Effect.Effect + readonly fetchArticles: (args: any) => Effect.Effect; + readonly checkArticleExists: ( + title: string, + ) => Effect.Effect; } >() {} @@ -42,31 +56,58 @@ export class CMSService extends Context.Tag("CMSService")< export class DatabaseService extends Context.Tag("DatabaseService")< DatabaseService, { - readonly logEvent: (event: LogEvent) => Effect.Effect - readonly getProcessStatus: (processId: string) => Effect.Effect - readonly updateProcessStatus: (processId: string, status: ProcessStatus) => Effect.Effect + readonly logEvent: (event: LogEvent) => Effect.Effect; + readonly getProcessStatus: ( + processId: string, + ) => Effect.Effect; + readonly updateProcessStatus: ( + processId: string, + status: ProcessStatus, + ) => Effect.Effect; } >() {} /** * Layers providing service implementations. */ -export const LLMServiceLive = Layer.succeed( - LLMService, - LLMService.of({ - generateText: (prompt: string, model: string) => - Effect.succeed(`Generated titles based on prompt: ${prompt}`), - getEmbedding: (text: string) => Effect.succeed([0.1, 0.2, 0.3]), - }) -) +export const LLMServiceLive = () => { + const ollama = new Ollama(); + + return Layer.succeed( + LLMService, + LLMService.of({ + generateText: (prompt: string, model: string) => + Effect.tryPromise({ + try: () => + ollama + .generate({ + prompt, + model, + stream: false, + }) + .then((x) => x.response), + catch: () => new Error(), + }), + getEmbedding: (text: string) => + Effect.tryPromise({ + try: () => + ollama + .embed({ model: "nomic-embed-text", input: text }) + .then((res) => res.embeddings), + catch: (err) => new Error(), + }), + }), + ); +}; export const VectorStoreServiceLive = Layer.succeed( VectorStoreService, VectorStoreService.of({ storeVector: (id: string, vector: number[]) => Effect.succeed(void 0), - queryVector: (vector: number[], topK: number) => Effect.succeed(["id1", "id2"]), - }) -) + queryVector: (vector: number[], topK: number) => + Effect.succeed(["id1", "id2"]), + }), +); export const DatabaseServiceLive = Layer.succeed( DatabaseService, @@ -74,9 +115,10 @@ export const DatabaseServiceLive = Layer.succeed( logEvent: (event: LogEvent) => Effect.succeed(void 0), getProcessStatus: (processId: string) => Effect.succeed({ id: processId, status: "in-progress" }), - updateProcessStatus: (processId: string, status: ProcessStatus) => Effect.succeed(void 0), - }) -) + updateProcessStatus: (processId: string, status: ProcessStatus) => + Effect.succeed(void 0), + }), +); export const CMSServiceLive = Layer.succeed( CMSService, @@ -87,17 +129,15 @@ export const CMSServiceLive = Layer.succeed( { id: "2", title: "Existing Article 2", content: "Content 2" }, ]), checkArticleExists: (title: string) => Effect.succeed(false), - }) -) + }), +); /** * Defines the application layer by composing service layers. */ export const AppLayer = Layer.mergeAll( - LLMServiceLive, + LLMServiceLive(), VectorStoreServiceLive, DatabaseServiceLive, - CMSServiceLive -) - - + CMSServiceLive, +); diff --git a/packages/agents/test/chat.spec.ts b/packages/agents/test/chat.spec.ts index ff1863a..8dfe2cd 100644 --- a/packages/agents/test/chat.spec.ts +++ b/packages/agents/test/chat.spec.ts @@ -1,78 +1,30 @@ // chat.spec.ts -import { describe, it, expect } from "vitest" -import { Effect, Layer } from "effect" -import { TaskManager, AgentContext } from "../src/types" -import { Director, ScribeAgent } from "../src/logic" -import { AppLayer, DatabaseService } from "../src/services" +import { describe, it, expect } from "vitest"; +import { Effect, Layer } from "effect"; +import { AppLayer, DatabaseService, LLMService } from "../src/services"; describe("Chat Use Case", () => { - it("should process the user's request and generate article topics", async () => { - // User input - const initialContext: AgentContext = { - userMessage: "What are some possible article topics which would improve our SEO?", - taskManager: new TaskManager(), // Temporary placeholder, will be replaced by service - } - - // Create initial task - const initialTask = initialContext.taskManager.createTask(initialContext) - initialContext.currentTask = initialTask - - // Start the process - const program: Effect.Effect = Effect.gen(function* (_) { - const taskManager = yield* _(TaskManagerService) - const director = yield* _(DirectorService) - const scribe = yield* _(ScribeAgentService) - - let currentTask = initialTask - - while (currentTask) { - // Set current task in context - currentTask.context.currentTask = currentTask - - // Director handles task assignment - yield* _(director.execute(currentTask.context)) - - // Agent executes the task - if (currentTask.assignee) { - currentTask.context.agentName = currentTask.assignee.name - currentTask.context.processId = currentTask.id - currentTask.context.message = `Task ${currentTask.id} executed by ${currentTask.assignee.name}` - - currentTask.context = yield* _( - currentTask.assignee.execute(currentTask.context) - ) - - currentTask.status = "completed" - taskManager.updateTask(currentTask) - - // Scribe logs the event - yield* _(scribe.execute(currentTask.context)) - } - - // Check for new tasks or subtasks - const nextTask = taskManager.getNextTask() - if (nextTask === undefined) { - break - } - currentTask = nextTask - } - - return initialContext - }) - - // Run the program with the composed layers - const finalContext = await Effect.runPromise(program.provideLayer(AppLayer)) - - // Assertions - if ('generatedTitles' in finalContext) { - expect(finalContext.generatedTitles).toBeDefined() - expect(finalContext.generatedTitles).toContain( - "Generated titles based on prompt: Generate article titles similar to existing articles." - ) - console.log("Generated Titles:", finalContext.generatedTitles) - } else { - throw new Error("generatedTitles not found in finalContext") - } - }) -}) \ No newline at end of file + it( + "should process the user's request and generate article topics", + { timeout: 1000000 }, + async () => { + const agent = (prompt: string) => + Effect.gen(function* () { + const llmService = yield* LLMService; + const model = "mistral-small"; + return yield* llmService.generateText(prompt, model); + }); + + const timedEffect = agent("What is the meaning of life?").pipe( + Effect.map((res) => { + console.log(res); + }), + Effect.timeout("113 seconds"), + ); + + const runnable = Effect.provide(timedEffect, AppLayer); + await Effect.runPromiseExit(runnable).then(console.log); + }, + ); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ebd22f..99afc3c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,10 +59,37 @@ importers: effect: specifier: ^3.7.2 version: 3.8.4 + mdast: + specifier: ^3.0.0 + version: 3.0.0 + mdast-util-heading-range: + specifier: ^4.0.0 + version: 4.0.0 + ollama: + specifier: ^0.5.9 + version: 0.5.9 radash: specifier: ^12.1.0 version: 12.1.0 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-gfm: + specifier: ^4.0.0 + version: 4.0.0 + unified: + specifier: ^11.0.5 + version: 11.0.5 + unist-util-find: + specifier: ^3.0.0 + version: 3.0.0 + unist-util-select: + specifier: ^5.1.0 + version: 5.1.0 devDependencies: + '@types/mdast': + specifier: ^4.0.4 + version: 4.0.4 vite-tsconfig-paths: specifier: ^5.0.1 version: 5.0.1(typescript@5.6.2)(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1)) @@ -77,13 +104,13 @@ importers: version: link:../chat-ui '@payloadcms/next': specifier: beta - version: 3.0.0-beta.108(@types/react@18.3.8)(graphql@16.9.0)(monaco-editor@0.38.0)(next@14.2.13(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2) + version: 3.0.0-beta.108(@types/react@18.3.8)(graphql@16.9.0)(monaco-editor@0.38.0)(next@14.2.13(@babel/core@7.25.2)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2) '@payloadcms/ui': specifier: beta - version: 3.0.0-beta.108(@types/react@18.3.8)(monaco-editor@0.38.0)(next@14.2.13(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2) + version: 3.0.0-beta.108(@types/react@18.3.8)(monaco-editor@0.38.0)(next@14.2.13(@babel/core@7.25.2)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2) '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)) + version: 4.3.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1)) '@workspace/llm-utils': specifier: workspace:* version: link:../llm-utils @@ -92,7 +119,7 @@ importers: version: 6.1.4 next: specifier: ^14.2.13 - version: 14.2.13(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1) + version: 14.2.13(@babel/core@7.25.2)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1) ollama: specifier: ^0.5.9 version: 0.5.9 @@ -122,10 +149,10 @@ importers: version: 4.26.1 vite-plugin-lib-inject-css: specifier: ^2.1.1 - version: 2.1.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)) + version: 2.1.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1)) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@3.29.4)(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)) + version: 0.22.0(rollup@4.21.3)(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)) devDependencies: '@types/react': specifier: 18.3.8 @@ -135,10 +162,10 @@ importers: version: 2.0.0(typescript@5.6.2) vite-plugin-dts: specifier: ^4.2.1 - version: 4.2.1(@types/node@22.5.5)(rollup@3.29.4)(typescript@5.6.2)(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)) + version: 4.2.1(@types/node@22.5.5)(rollup@4.21.3)(typescript@5.6.2)(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)) vite-plugin-externalize-deps: specifier: ^0.8.0 - version: 0.8.0(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)) + version: 0.8.0(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1)) packages/chat-ui: dependencies: @@ -211,7 +238,7 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)) + version: 4.3.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1)) chance: specifier: ^1.1.12 version: 1.1.12 @@ -238,10 +265,10 @@ importers: version: 5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1) vite-plugin-externalize-deps: specifier: ^0.8.0 - version: 0.8.0(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)) + version: 0.8.0(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1)) vite-plugin-lib-inject-css: specifier: ^2.1.1 - version: 2.1.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)) + version: 2.1.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1)) vitest: specifier: ^2.1.1 version: 2.1.1(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1) @@ -3257,6 +3284,9 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/doctrine@0.0.9': resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} @@ -3308,6 +3338,9 @@ packages: '@types/lodash@4.17.9': resolution: {integrity: sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} @@ -3317,6 +3350,9 @@ packages: '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/node-fetch@2.6.11': resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} @@ -3890,6 +3926,9 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -4077,6 +4116,9 @@ packages: caniuse-lite@1.0.30001660: resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} engines: {node: '>=12'} @@ -4107,6 +4149,9 @@ packages: chancejs@0.0.8: resolution: {integrity: sha512-l/9YGrByCChyTKwmV418rIqappb+8fhLLMmQogDDFfrki7EDq1hBp5L4iL8TFGFaweby667PLgH7Y+Y/ntgZ5g==} + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} @@ -4352,6 +4397,9 @@ packages: css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-selector-parser@3.0.5: + resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} + css-tree@2.2.1: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -4470,6 +4518,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -4543,6 +4594,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -4835,6 +4889,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -5112,6 +5170,9 @@ packages: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-base64-decode@1.0.0: resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} @@ -5727,6 +5788,10 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -6090,6 +6155,9 @@ packages: lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.iteratee@4.7.0: + resolution: {integrity: sha512-yv3cSQZmfpbIKo4Yo45B1taEvxjNvcpF1CEOc0Y6dEyvhPIfEJE3twDwPgWTPQubcSgXyBwBKG6wpQvWMDOf6Q==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -6108,6 +6176,9 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -6151,6 +6222,9 @@ packages: map-or-similar@1.5.0: resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + markdown-to-jsx@7.5.0: resolution: {integrity: sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==} engines: {node: '>= 10'} @@ -6163,6 +6237,46 @@ packages: md5@2.3.0: resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.1: + resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-heading-range@4.0.0: + resolution: {integrity: sha512-9qadnTU+W0MR69yITfUr/52eoVXcqUpFhN1ThjGSn59KGOdxgaOr4Nx4swa60SaXEq8/tjQZcq2sVPp2yJMNCA==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdast@3.0.0: + resolution: {integrity: sha512-xySmf8g4fPKMeC07jXGz971EkLbWAJ83s4US2Tj9lEdnZ142UP5grN73H1Xd3HzrdbU5o9GYYP/y8F9ZSwLE9g==} + deprecated: '`mdast` was renamed to `remark`' + mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} @@ -6196,6 +6310,90 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -7414,6 +7612,18 @@ packages: rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -8021,6 +8231,9 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} @@ -8222,9 +8435,21 @@ packages: unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-find@3.0.0: + resolution: {integrity: sha512-T7ZqS7immLjYyC4FCp2hDo3ksZ1v+qcbb+e5+iWxc2jONgHOLXPCpms1L8VV4hVxCXgWTxmBHDztuEZFVwC+Gg==} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-select@5.1.0: + resolution: {integrity: sha512-4A5mfokSHG/rNQ4g7gSbdEs+H586xyd24sdJqF1IWamqrLHvYb+DH48fzxowyOhOfK7YSqX+XlCojAyuuyyT2A==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} @@ -8337,6 +8562,12 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@2.1.1: resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -8618,6 +8849,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@adobe/css-tools@4.4.0': {} @@ -10811,17 +11045,17 @@ snapshots: '@payloadcms/eslint-config@1.1.1(typescript@5.6.2)': dependencies: '@types/eslint': 8.44.2 - '@typescript-eslint/eslint-plugin': 6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2) '@typescript-eslint/parser': 6.6.0(eslint@8.48.0)(typescript@5.6.2) eslint: 8.48.0 eslint-config-prettier: 9.0.0(eslint@8.48.0) eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0) - eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2) eslint-plugin-jest-dom: 5.1.0(eslint@8.48.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) eslint-plugin-node: 11.1.0(eslint@8.48.0) eslint-plugin-perfectionist: 2.0.0(eslint@8.48.0)(typescript@5.6.2) - eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0) + eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0) eslint-plugin-react: 7.33.2(eslint@8.48.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) eslint-plugin-regexp: 1.15.0(eslint@8.48.0) @@ -10867,19 +11101,19 @@ snapshots: '@payloadcms/live-preview@3.0.0-beta.108': {} - '@payloadcms/next@3.0.0-beta.108(@types/react@18.3.8)(graphql@16.9.0)(monaco-editor@0.38.0)(next@14.2.13(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2)': + '@payloadcms/next@3.0.0-beta.108(@types/react@18.3.8)(graphql@16.9.0)(monaco-editor@0.38.0)(next@14.2.13(@babel/core@7.25.2)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1) '@payloadcms/graphql': 3.0.0-beta.108(graphql@16.9.0)(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(typescript@5.6.2) '@payloadcms/translations': 3.0.0-beta.108 - '@payloadcms/ui': 3.0.0-beta.108(@types/react@18.3.8)(monaco-editor@0.38.0)(next@14.2.13(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2) + '@payloadcms/ui': 3.0.0-beta.108(@types/react@18.3.8)(monaco-editor@0.38.0)(next@14.2.13(@babel/core@7.25.2)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2) busboy: 1.6.0 file-type: 19.3.0 graphql: 16.9.0 graphql-http: 1.22.1(graphql@16.9.0) graphql-playground-html: 1.6.30 http-status: 1.6.2 - next: 14.2.13(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1) + next: 14.2.13(@babel/core@7.25.2)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1) path-to-regexp: 6.3.0 payload: 3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2) qs-esm: 7.0.2 @@ -11020,7 +11254,7 @@ snapshots: dependencies: date-fns: 3.3.1 - '@payloadcms/ui@3.0.0-beta.108(@types/react@18.3.8)(monaco-editor@0.38.0)(next@14.2.13(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2)': + '@payloadcms/ui@3.0.0-beta.108(@types/react@18.3.8)(monaco-editor@0.38.0)(next@14.2.13(@babel/core@7.25.2)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(payload@3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2))(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1))(react@18.3.1) @@ -11034,7 +11268,7 @@ snapshots: date-fns: 3.3.1 dequal: 2.0.3 md5: 2.3.0 - next: 14.2.13(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1) + next: 14.2.13(@babel/core@7.25.2)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1) object-to-formdata: 4.5.1 payload: 3.0.0-beta.108(graphql@16.9.0)(monaco-editor@0.38.0)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1)(typescript@5.6.2) qs-esm: 7.0.2 @@ -11362,13 +11596,13 @@ snapshots: optionalDependencies: rollup: 3.29.4 - '@rollup/plugin-inject@5.0.5(rollup@3.29.4)': + '@rollup/plugin-inject@5.0.5(rollup@4.21.3)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@rollup/pluginutils': 5.1.0(rollup@4.21.3) estree-walker: 2.0.2 magic-string: 0.30.11 optionalDependencies: - rollup: 3.29.4 + rollup: 4.21.3 '@rollup/plugin-json@6.1.0(rollup@3.29.4)': dependencies: @@ -12212,6 +12446,10 @@ snapshots: dependencies: '@types/node': 22.5.4 + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + '@types/doctrine@0.0.9': {} '@types/escape-html@1.0.4': {} @@ -12266,12 +12504,18 @@ snapshots: '@types/lodash@4.17.9': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/mdx@2.0.13': {} '@types/mime@1.3.5': {} '@types/minimatch@5.1.2': {} + '@types/ms@0.7.34': {} + '@types/node-fetch@2.6.11': dependencies: '@types/node': 22.5.4 @@ -12353,16 +12597,16 @@ snapshots: dependencies: '@types/node': 22.5.4 - '@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/parser': 6.6.0(eslint@8.48.0)(typescript@5.6.2) '@typescript-eslint/scope-manager': 6.6.0 '@typescript-eslint/type-utils': 6.6.0(eslint@8.48.0)(typescript@5.6.2) '@typescript-eslint/utils': 6.6.0(eslint@8.48.0)(typescript@5.6.2) '@typescript-eslint/visitor-keys': 6.6.0 debug: 4.3.7 - eslint: 8.57.1 + eslint: 8.48.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -12603,7 +12847,7 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.3.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1))': + '@vitejs/plugin-react@4.3.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) @@ -13019,6 +13263,8 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.8 + bail@2.0.2: {} + balanced-match@1.0.2: {} bare-events@2.4.2: @@ -13244,6 +13490,8 @@ snapshots: caniuse-lite@1.0.30001660: {} + ccount@2.0.1: {} + chai@5.1.1: dependencies: assertion-error: 2.0.1 @@ -13283,6 +13531,8 @@ snapshots: transitivePeerDependencies: - supports-color + character-entities@2.0.2: {} + charenc@0.0.2: {} check-error@2.1.1: {} @@ -13536,6 +13786,8 @@ snapshots: domutils: 3.1.0 nth-check: 2.1.1 + css-selector-parser@3.0.5: {} + css-tree@2.2.1: dependencies: mdn-data: 2.0.28 @@ -13656,6 +13908,10 @@ snapshots: dependencies: ms: 2.1.3 + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -13727,6 +13983,10 @@ snapshots: detect-node-es@1.1.0: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + didyoumean@1.2.2: {} diff@5.2.0: {} @@ -14110,6 +14370,8 @@ snapshots: escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -14257,12 +14519,12 @@ snapshots: eslint: 8.48.0 requireindex: 1.2.0 - eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2): + eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.48.0)(typescript@5.6.2) - eslint: 8.57.1 + eslint: 8.48.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2) transitivePeerDependencies: - supports-color - typescript @@ -14327,11 +14589,11 @@ snapshots: - supports-color - typescript - eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0): + eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0): dependencies: eslint: 8.48.0 optionalDependencies: - eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.48.0)(typescript@5.6.2) eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): dependencies: @@ -14591,6 +14853,8 @@ snapshots: dependencies: is-extendable: 0.1.1 + extend@3.0.2: {} + fast-base64-decode@1.0.0: {} fast-check@3.22.0: @@ -15199,6 +15463,8 @@ snapshots: is-path-inside@3.0.3: {} + is-plain-obj@4.1.0: {} + is-plain-object@5.0.0: {} is-reference@1.2.1: @@ -15536,6 +15802,8 @@ snapshots: lodash.isstring@4.0.1: {} + lodash.iteratee@4.7.0: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} @@ -15548,6 +15816,8 @@ snapshots: lodash@4.17.21: {} + longest-streak@3.1.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -15588,6 +15858,8 @@ snapshots: map-or-similar@1.5.0: {} + markdown-table@3.0.3: {} + markdown-to-jsx@7.5.0(react@18.3.1): dependencies: react: 18.3.1 @@ -15604,6 +15876,116 @@ snapshots: crypt: 0.0.2 is-buffer: 1.1.6 + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + 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.0 + transitivePeerDependencies: + - supports-color + + mdast-util-heading-range@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-markdown@2.1.0: + 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-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdast@3.0.0: {} + mdn-data@2.0.28: {} mdn-data@2.0.30: {} @@ -15626,6 +16008,197 @@ snapshots: methods@1.1.2: {} + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.7 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -15878,7 +16451,7 @@ snapshots: transitivePeerDependencies: - supports-color - next@14.2.13(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1): + next@14.2.13(@babel/core@7.25.2)(react-dom@19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801))(react@18.3.1): dependencies: '@next/env': 14.2.13 '@swc/helpers': 0.5.5 @@ -15888,7 +16461,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 19.0.0-rc-06d0b89e-20240801(react@19.0.0-rc-06d0b89e-20240801) - styled-jsx: 5.1.1(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.13 '@next/swc-darwin-x64': 14.2.13 @@ -17083,6 +17656,41 @@ snapshots: hast-util-to-string: 3.0.0 unist-util-visit: 5.0.0 + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + micromark-util-types: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -17573,10 +18181,12 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 5.2.0 - styled-jsx@5.1.1(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.25.2)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 + optionalDependencies: + '@babel/core': 7.25.2 styled-jsx@5.1.6(react@19.0.0-rc-06d0b89e-20240801): dependencies: @@ -17818,6 +18428,8 @@ snapshots: tree-kill@1.2.2: {} + trough@2.2.0: {} + truncate-utf8-bytes@1.0.2: dependencies: utf8-byte-length: 1.0.5 @@ -18032,10 +18644,38 @@ snapshots: unfetch@4.2.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-find@3.0.0: + dependencies: + '@types/unist': 3.0.3 + lodash.iteratee: 4.7.0 + unist-util-visit: 5.0.0 + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-select@5.1.0: + dependencies: + '@types/unist': 3.0.3 + css-selector-parser: 3.0.5 + devlop: 1.1.0 + nth-check: 2.1.1 + zwitch: 2.0.4 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -18146,6 +18786,16 @@ snapshots: vary@1.1.2: {} + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + vite-node@2.1.1(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1): dependencies: cac: 6.7.14 @@ -18163,10 +18813,10 @@ snapshots: - supports-color - terser - vite-plugin-dts@4.2.1(@types/node@22.5.5)(rollup@3.29.4)(typescript@5.6.2)(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)): + vite-plugin-dts@4.2.1(@types/node@22.5.5)(rollup@4.21.3)(typescript@5.6.2)(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@22.5.5) - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@rollup/pluginutils': 5.1.0(rollup@4.21.3) '@volar/typescript': 2.4.5 '@vue/language-core': 2.1.6(typescript@5.6.2) compare-versions: 6.1.1 @@ -18182,20 +18832,20 @@ snapshots: - rollup - supports-color - vite-plugin-externalize-deps@0.8.0(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)): + vite-plugin-externalize-deps@0.8.0(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1)): dependencies: vite: 5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1) - vite-plugin-lib-inject-css@2.1.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)): + vite-plugin-lib-inject-css@2.1.1(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1)): dependencies: '@ast-grep/napi': 0.22.6 magic-string: 0.30.11 picocolors: 1.1.0 vite: 5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1) - vite-plugin-node-polyfills@0.22.0(rollup@3.29.4)(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)): + vite-plugin-node-polyfills@0.22.0(rollup@4.21.3)(vite@5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(stylus@0.30.1)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@3.29.4) + '@rollup/plugin-inject': 5.0.5(rollup@4.21.3) node-stdlib-browser: 1.2.1 vite: 5.4.7(@types/node@22.5.5)(lightningcss@1.27.0)(sass@1.77.4)(stylus@0.30.1) transitivePeerDependencies: @@ -18429,3 +19079,5 @@ snapshots: lib0: 0.2.97 yocto-queue@0.1.0: {} + + zwitch@2.0.4: {}