diff --git a/.github/workflows/pdl-live-react-tests.yml b/.github/workflows/pdl-live-react-tests.yml new file mode 100644 index 00000000..42433389 --- /dev/null +++ b/.github/workflows/pdl-live-react-tests.yml @@ -0,0 +1,32 @@ +name: Viewer Tests + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +# cancel any prior runs for this workflow and this PR (or branch) +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + viewer: + name: Test PDL live viewer + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./pdl-live-react + steps: + - uses: actions/checkout@v4 + - name: Set up node + uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Install dependencies + run: yarn + - name: Install Playwright Browsers + run: yarn playwright install --with-deps + - name: Test pdl-live viewer + run: yarn test diff --git a/.gitignore b/.gitignore index 5f6cd585..85ad7682 100644 --- a/.gitignore +++ b/.gitignore @@ -155,4 +155,10 @@ pdl-live/package-lock.json _site # Generated version -src/pdl/_version.py \ No newline at end of file +src/pdl/_version.py + +# Emacs temps +*~ + +# Mac +.DS_Store \ No newline at end of file diff --git a/pdl-live-react/.editorconfig b/pdl-live-react/.editorconfig new file mode 100644 index 00000000..79fe8026 --- /dev/null +++ b/pdl-live-react/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +insert_final_newline = true diff --git a/pdl-live-react/.gitignore b/pdl-live-react/.gitignore new file mode 100644 index 00000000..68c5d18f --- /dev/null +++ b/pdl-live-react/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/pdl-live-react/README.md b/pdl-live-react/README.md new file mode 100644 index 00000000..ce247ea6 --- /dev/null +++ b/pdl-live-react/README.md @@ -0,0 +1,46 @@ +# PDL Viewer + +To get started, make sure you have a recent version of +[NodeJS](https://nodejs.org/en/download) installed and +[Yarn](https://classic.yarnpkg.com/lang/en/docs/install). On MacOS, +these can be installed via `brew install node yarn`. + +## Implementation Details + +The PDL Viewer uses [Vite](https://vite.dev/) for bundling, +[React](https://react.dev/) for the UI, +[PatternFly](https://www.patternfly.org/) for UI components, and is +written in [TypeScript](https://www.typescriptlang.org/). The React +components are written in [TSX](https://react.dev/learn/typescript) +(the Typescript variant of JSX). + +## Development + +To install dependencies: +```shell +yarn +``` + +To start the watcher: +```shell +yarn dev +``` + +Which will open up a local port which you can view in your favorite +browser. Edits to any source files will result in quick and automatic +updates to that running UI. + +## Tests + +There are currently only simple tests for: linting, formatting, and +type checking. These can be run via: +```shell +yarn test +``` + +## Production + +This will generate production bundles in `dist/` +```shell +yarn build +``` diff --git a/pdl-live-react/demos/error.pdl b/pdl-live-react/demos/error.pdl new file mode 100644 index 00000000..34f562aa --- /dev/null +++ b/pdl-live-react/demos/error.pdl @@ -0,0 +1,25 @@ +description: Creating JSON Data +defs: + data: + read: ./gen-data.yaml + parser: yaml + spec: { questions: [str], answers: [obj] } +text: + - model: ollama/llama3.1:8b + def: model_output + spec: {name: str, age: int} + input: + text: + - for: + question: ${ data.questions } + answer: ${ data.answers } + repeat: | + ${ question } + ${ answer } + - > + Question: Create a JSON object with fields 'name' and 'age' + and set them appropriately. Write the age in letters. + parser: yaml + parameters: + stop_sequences: "\n" + temperature: 0 \ No newline at end of file diff --git a/pdl-live-react/demos/gen-data.yaml b/pdl-live-react/demos/gen-data.yaml new file mode 100644 index 00000000..5d92f743 --- /dev/null +++ b/pdl-live-react/demos/gen-data.yaml @@ -0,0 +1,16 @@ +source_code: + | + @SuppressWarnings("unchecked") + public static Map deserializeOffsetMap(String lastSourceOffset) throws IOException { + Map offsetMap; + if (lastSourceOffset == null || lastSourceOffset.isEmpty()) { + offsetMap = new HashMap<>(); + } else { + offsetMap = JSON_MAPPER.readValue(lastSourceOffset, Map.class); + } + return offsetMap; + } +repo_info: + repo: streamsets/datacollector + path: stagesupport/src/main/java/com/.../OffsetUtil.java + function_name: OffsetUtil.deserializeOffsetMap diff --git a/pdl-live-react/eslint.config.js b/pdl-live-react/eslint.config.js new file mode 100644 index 00000000..c01de94b --- /dev/null +++ b/pdl-live-react/eslint.config.js @@ -0,0 +1,36 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist','test-results'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + '@typescript-eslint/no-unused-vars': [ + 'error', + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_" + } + ], + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/pdl-live-react/index.html b/pdl-live-react/index.html new file mode 100644 index 00000000..64d7c23f --- /dev/null +++ b/pdl-live-react/index.html @@ -0,0 +1,13 @@ + + + + + + + PDL Viewer + + +
+ + + diff --git a/pdl-live-react/package.json b/pdl-live-react/package.json new file mode 100644 index 00000000..2aec90b8 --- /dev/null +++ b/pdl-live-react/package.json @@ -0,0 +1,53 @@ +{ + "name": "pdl-live", + "private": true, + "type": "module", + "scripts": { + "dev": "concurrently vite 'tsc --build --watch --noEmit'", + "build": "tsc -b && vite build", + "lint": "eslint .", + "format": "prettier --write 'tests/**/*.ts' 'src/**/*.{ts,tsx,css}'", + "preview": "vite preview", + "test:quality": "concurrently -n 'lint,types,formatting' 'yarn lint' 'tsc --build --noEmit' \"prettier --check 'tests/**/*.ts' 'src/**/*.{ts,tsx,css}'\"", + "test:ui": "yarn playwright test", + "test": "concurrently -n 'quality,playwright' 'yarn test:quality' 'yarn test:ui'" + }, + "dependencies": { + "@patternfly/react-core": "^6.1.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-markdown": "^9.0.3", + "react-router-dom": "^7.1.2", + "react-syntax-highlighter": "^15.6.1", + "ts-pattern": "^5.6.0", + "yaml": "^2.7.0" + }, + "devDependencies": { + "@eslint/js": "^9.17.0", + "@playwright/test": "^1.49.1", + "@types/node": "22.10.5", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@types/react-syntax-highlighter": "^15.5.13", + "@vitejs/plugin-react": "^4.3.4", + "concurrently": "^9.1.2", + "eslint": "^9.17.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.14.0", + "json-schema-to-typescript": "^15.0.3", + "monaco-editor": "^0.52.2", + "prettier": "^3.4.2", + "typescript": "~5.6.2", + "typescript-eslint": "^8.18.2", + "vite": "^6.0.5", + "vite-plugin-checker": "^0.8.0", + "vite-plugin-svgr": "^4.3.0" + }, + "prettier": { + "semi": false + }, + "resolutions": { + "@types/react": "^18.3.18" + } +} diff --git a/pdl-live-react/playwright.config.ts b/pdl-live-react/playwright.config.ts new file mode 100644 index 00000000..cb59550b --- /dev/null +++ b/pdl-live-react/playwright.config.ts @@ -0,0 +1,80 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// import dotenv from 'dotenv'; +// import path from 'path'; +// dotenv.config({ path: path.resolve(__dirname, '.env') }); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'yarn dev', + timeout: 10*1000, + url: 'http://localhost:5173', + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/pdl-live-react/public/ai-governance--prompt.svg b/pdl-live-react/public/ai-governance--prompt.svg new file mode 100644 index 00000000..d70c0ad1 --- /dev/null +++ b/pdl-live-react/public/ai-governance--prompt.svg @@ -0,0 +1,22 @@ + + + + + + diff --git a/pdl-live-react/src/About.tsx b/pdl-live-react/src/About.tsx new file mode 100644 index 00000000..432dccb5 --- /dev/null +++ b/pdl-live-react/src/About.tsx @@ -0,0 +1,50 @@ +import { Content } from "@patternfly/react-core" +import Page from "./Page" + +export default function Welcome() { + return ( + + Prompt Declaration Language (PDL) + + + PDL is a declarative language designed for developers to create + reliable, composable LLM prompts and integrate them into software + systems. It provides a structured way to specify prompt templates, + enforce validation, and compose LLM calls with traditional rule-based + systems. + + + Key Features + + + + LLM Integration: Compatible with any LLM, including IBM watsonx + + Prompt Engineering: + + Template system for single/multi-shot prompting + + Composition of multiple LLM calls + + Integration with tools (code execution & APIs) + + Development Tools: + Type checking for model I/O + Python SDK + Chat API support + + Live document visualization for debugging + + + Control Flow: Variables, conditionals, loops, and functions + + + I/O Operations: File/stdin reading, JSON parsing + + + API Integration: Native REST API support (Python) + + + + ) +} diff --git a/pdl-live-react/src/App.css b/pdl-live-react/src/App.css new file mode 100644 index 00000000..0b6b26b7 --- /dev/null +++ b/pdl-live-react/src/App.css @@ -0,0 +1,13 @@ +#root { + width: 100%; +} + +.pf-v6-theme-dark .pdl-logo path { + fill: white; +} +.pdl-logo { + height: 2.25em; +} +.pdl-logo path { + fill: black; +} diff --git a/pdl-live-react/src/App.tsx b/pdl-live-react/src/App.tsx new file mode 100644 index 00000000..35696179 --- /dev/null +++ b/pdl-live-react/src/App.tsx @@ -0,0 +1,36 @@ +import { Routes, Route } from "react-router-dom" + +import Demo from "./Demo" +import About from "./About" +import Welcome from "./Welcome" +import Uploader from "./Uploader" +import PageNotFound from "./PageNotFound" + +import demos from "./demos/demos" +import useDynamicTitle from "./title" + +import "./App.css" +import "@patternfly/react-core/dist/styles/base.css" + +export default function App() { + useDynamicTitle() + + return ( + + } /> + } /> + } /> + } /> + + {demos.map((demo) => ( + } + /> + ))} + + } /> + + ) +} diff --git a/pdl-live-react/src/Context.ts b/pdl-live-react/src/Context.ts new file mode 100644 index 00000000..d74f65ec --- /dev/null +++ b/pdl-live-react/src/Context.ts @@ -0,0 +1,43 @@ +import { type MouseEvent, type ReactNode } from "react" + +type TA = (evt: MouseEvent) => void +type SDC = (props: { + header: string + description?: ReactNode + body: ReactNode +}) => void + +/** Context info passed along with the render */ +export default interface Context { + /** Current id contextualized in trace AST tree */ + id: string + + /** Are we rendering in dark mode? */ + darkMode: boolean + + /** Callback to toggle accordion */ + toggleAccordion: TA + + /** Callback to set drawer content */ + setDrawerContent: SDC + + /** In case of nested blocks */ + parents: string[] +} + +export function withId(ctx: Context, id: string | number): Context { + return Object.assign({}, ctx, { + id: ctx.id + "." + id, + }) +} + +export function withIter(ctx: Context, iter: number): Context { + // Note that we 1-index iters in the displayed UI + return withParent(withId(ctx, String(iter + 1)), `Iter ${iter + 1}`) +} + +export function withParent(ctx: Context, parent: string) { + return Object.assign({}, ctx, { + parents: [...ctx.parents, parent], + }) +} diff --git a/pdl-live-react/src/DarkModeContext.ts b/pdl-live-react/src/DarkModeContext.ts new file mode 100644 index 00000000..d8f73f6d --- /dev/null +++ b/pdl-live-react/src/DarkModeContext.ts @@ -0,0 +1,13 @@ +import { createContext } from "react" + +const darkModeLocalStorageKey = "pdl-viewer.dark-mode" + +export function getDarkModeUserSetting(): boolean { + return (localStorage.getItem(darkModeLocalStorageKey) || "false") == "true" +} + +export function setDarkModeUserSetting(darkMode: boolean) { + localStorage.setItem(darkModeLocalStorageKey, darkMode ? "true" : "false") +} + +export default createContext(getDarkModeUserSetting()) diff --git a/pdl-live-react/src/DarkModeToggle.tsx b/pdl-live-react/src/DarkModeToggle.tsx new file mode 100644 index 00000000..28861dfc --- /dev/null +++ b/pdl-live-react/src/DarkModeToggle.tsx @@ -0,0 +1,43 @@ +import { useCallback, useContext } from "react" + +import { ToggleGroup, ToggleGroupItem } from "@patternfly/react-core" + +import DarkModeContext, { setDarkModeUserSetting } from "./DarkModeContext" + +import SunIcon from "@patternfly/react-icons/dist/esm/icons/sun-icon" +import MoonIcon from "@patternfly/react-icons/dist/esm/icons/moon-icon" + +export type DarkModeProps = { setDarkMode: (value: boolean) => void } + +/** Replicating the dark mode toggler from the masthead of https://patternfly.org */ +export default function DarkModeToggle({ setDarkMode }: DarkModeProps) { + const darkMode = useContext(DarkModeContext) + + const handleClickSun = useCallback(() => { + setDarkMode(false) + setDarkModeUserSetting(false) + document.querySelector("html")?.classList.remove("pf-v6-theme-dark") + }, [setDarkMode]) + const handleClickMoon = useCallback(() => { + setDarkMode(true) + setDarkModeUserSetting(true) + document.querySelector("html")?.classList.add("pf-v6-theme-dark") + }, [setDarkMode]) + + return ( + + } + aria-label="light mode" + isSelected={!darkMode} + onChange={handleClickSun} + /> + } + aria-label="dark mode" + isSelected={darkMode} + onChange={handleClickMoon} + /> + + ) +} diff --git a/pdl-live-react/src/Demo.tsx b/pdl-live-react/src/Demo.tsx new file mode 100644 index 00000000..07fd0cc5 --- /dev/null +++ b/pdl-live-react/src/Demo.tsx @@ -0,0 +1,14 @@ +import Page from "./Page" +import Viewer from "./Viewer" + +type Props = { + value: string +} + +export default function Demo(props: Props) { + return ( + + + + ) +} diff --git a/pdl-live-react/src/DrawerContent.tsx b/pdl-live-react/src/DrawerContent.tsx new file mode 100644 index 00000000..149fa925 --- /dev/null +++ b/pdl-live-react/src/DrawerContent.tsx @@ -0,0 +1,43 @@ +import { type ReactNode } from "react" + +import { + Button, + Card, + CardHeader, + CardTitle, + CardBody, +} from "@patternfly/react-core" + +import CloseIcon from "@patternfly/react-icons/dist/esm/icons/times-icon" + +export type DrawerContentSpec = { + header: string + description?: ReactNode + body: ReactNode +} + +type Props = DrawerContentSpec & { + onCloseDrawer(): void +} + +export default function DrawerContent(props: Props) { + return ( + + } + /> + ), + }} + > + {props.header} + {props.description && props.description} + + {props.body} + + ) +} diff --git a/pdl-live-react/src/DrawerContentContext.ts b/pdl-live-react/src/DrawerContentContext.ts new file mode 100644 index 00000000..26f22bbb --- /dev/null +++ b/pdl-live-react/src/DrawerContentContext.ts @@ -0,0 +1,4 @@ +import { createContext } from "react" +import { type DrawerContentSpec } from "./DrawerContent" + +export default createContext((_spec: DrawerContentSpec) => {}) diff --git a/pdl-live-react/src/Masthead.tsx b/pdl-live-react/src/Masthead.tsx new file mode 100644 index 00000000..f7c14755 --- /dev/null +++ b/pdl-live-react/src/Masthead.tsx @@ -0,0 +1,88 @@ +import { + Flex, + Masthead, + MastheadMain, + MastheadToggle, + MastheadBrand, + MastheadLogo, + MastheadContent, + PageToggleButton, + Title, + Toolbar, + ToolbarContent, + ToolbarGroup, + ToolbarItem, +} from "@patternfly/react-core" + +import DarkModeToggle from "./DarkModeToggle" + +import BarsIcon from "@patternfly/react-icons/dist/esm/icons/bars-icon" +import PDLIcon from "./assets/ai-governance--prompt.svg?react" + +const alignRight = { default: "alignEnd" as const } +const alignCenter = { default: "alignItemsCenter" as const } + +function Toggle() { + return ( + + + + + + ) +} + +function Brand() { + return ( + + + + PDL + + + + ) +} + +function Main() { + return ( + + + + + ) +} + +function Content(props: import("./DarkModeToggle").DarkModeProps) { + return ( + + + + + + + + + + + + ) +} + +export default function PDLMasthead( + props: import("./DarkModeToggle").DarkModeProps, +) { + return ( + +
+ + + ) +} diff --git a/pdl-live-react/src/Page.tsx b/pdl-live-react/src/Page.tsx new file mode 100644 index 00000000..b030da18 --- /dev/null +++ b/pdl-live-react/src/Page.tsx @@ -0,0 +1,81 @@ +import { + useCallback, + useState, + type ReactNode, + type PropsWithChildren, +} from "react" +import { + Breadcrumb, + BreadcrumbItem, + Page, + PageSection, +} from "@patternfly/react-core" + +import Masthead from "./Masthead" +import Sidebar from "./Sidebar" +import DrawerContent from "./DrawerContent" + +import DrawerContext from "./DrawerContentContext" +import DarkModeContext, { getDarkModeUserSetting } from "./DarkModeContext" + +type Props = PropsWithChildren<{ + breadcrumb1?: string + breadcrumb2?: string +}> + +export default function PDLPage({ breadcrumb1, breadcrumb2, children }: Props) { + const [darkMode, setDarkMode] = useState(getDarkModeUserSetting()) + + /** Manage the drawer that slides in from the right */ + const [drawerContent, setDrawerContent] = useState(null) + const onCloseDrawer = useCallback( + () => setDrawerContent(null), + [setDrawerContent], + ) + + return ( + } + onCloseDrawer={onCloseDrawer} + /> + } + isContentFilled + isManagedSidebar + sidebar={} + masthead={ + + + + } + breadcrumb={ + breadcrumb1 && ( + + {breadcrumb1} + {breadcrumb2 && {breadcrumb2}} + + ) + } + > + + + + {children} + + + + + ) +} diff --git a/pdl-live-react/src/PageNotFound.tsx b/pdl-live-react/src/PageNotFound.tsx new file mode 100644 index 00000000..199c1571 --- /dev/null +++ b/pdl-live-react/src/PageNotFound.tsx @@ -0,0 +1,3 @@ +export default function PageNotFound() { + return "404" +} diff --git a/pdl-live-react/src/Sidebar.tsx b/pdl-live-react/src/Sidebar.tsx new file mode 100644 index 00000000..44ef6118 --- /dev/null +++ b/pdl-live-react/src/Sidebar.tsx @@ -0,0 +1,53 @@ +import { Link, useLocation } from "react-router-dom" +import { + Nav, + NavGroup, + NavList, + NavItem, + PageSidebar, + PageSidebarBody, +} from "@patternfly/react-core" + +import demos from "./demos/demos" + +export default function Sidebar() { + const { pathname: activeItem } = useLocation() + + return ( + + + + + + ) +} diff --git a/pdl-live-react/src/SplitPane.css b/pdl-live-react/src/SplitPane.css new file mode 100644 index 00000000..bf69d483 --- /dev/null +++ b/pdl-live-react/src/SplitPane.css @@ -0,0 +1,49 @@ +.Resizer { + background: #000; + opacity: 0.2; + z-index: 1; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -moz-background-clip: padding; + -webkit-background-clip: padding; + background-clip: padding-box; +} + +.Resizer:hover { + -webkit-transition: all 2s ease; + transition: all 2s ease; +} + +.Resizer.horizontal { + height: 11px; + margin: -5px 0; + border-top: 5px solid rgba(255, 255, 255, 0); + border-bottom: 5px solid rgba(255, 255, 255, 0); + cursor: row-resize; + width: 100%; +} + +.Resizer.horizontal:hover { + border-top: 5px solid rgba(0, 0, 0, 0.5); + border-bottom: 5px solid rgba(0, 0, 0, 0.5); +} + +.Resizer.vertical { + width: 11px; + margin: 0 -5px; + border-left: 5px solid rgba(255, 255, 255, 0); + border-right: 5px solid rgba(255, 255, 255, 0); + cursor: col-resize; +} + +.Resizer.vertical:hover { + border-left: 5px solid rgba(0, 0, 0, 0.5); + border-right: 5px solid rgba(0, 0, 0, 0.5); +} +.Resizer.disabled { + cursor: not-allowed; +} +.Resizer.disabled:hover { + border-color: transparent; +} diff --git a/pdl-live-react/src/Uploader.tsx b/pdl-live-react/src/Uploader.tsx new file mode 100644 index 00000000..b0f41d61 --- /dev/null +++ b/pdl-live-react/src/Uploader.tsx @@ -0,0 +1,148 @@ +import { useCallback, useMemo, useState } from "react" + +import { + FileUpload, + type FileUploadProps, + DropzoneErrorCode, + FileUploadHelperText, + Form, + FormGroup, + HelperText, + HelperTextItem, + Icon, +} from "@patternfly/react-core" + +import Page from "./Page" +import Viewer from "./Viewer" + +export default function Uploader() { + const [value, setValue] = useState("") + const [filename, setFilename] = useState("") + const [isLoading, setIsLoading] = useState(false) + const [isRejected, setIsRejected] = useState(false) + const [message, setMessage] = useState( + "Must be a JSON file no larger than 50 KB", + ) + + const handleFileInputChange = useCallback< + Required["onFileInputChange"] + >((_event, file) => { + setFilename(file.name) + }, []) + + const handleTextChange = useCallback< + Required["onTextChange"] + >( + (_event, value) => { + setValue(value) + }, + [setValue], + ) + + const handleDataChange = useCallback< + Required["onDataChange"] + >( + (_event, value) => { + setValue(value) + }, + [setValue], + ) + + const reset = useCallback(() => { + setValue("") + setFilename("") + }, [setValue]) + + const handleClear = useCallback["onClearClick"]>( + (_event) => { + reset() + setIsRejected(false) + }, + [reset], + ) + + const handleFileRejected = useCallback(() => { + reset() + setIsRejected(true) + }, [reset]) + + const handleFileAccepted = useCallback(() => { + setIsRejected(false) + }, []) + + const handleFileReadStarted = useCallback(() => { + setIsLoading(true) + }, []) + + const handleFileReadFinished = useCallback(() => { + setIsLoading(false) + }, []) + + const dropzoneProps = useMemo( + () => ({ + accept: { "application/json": [".json"] }, + maxSize: 50 * 1024, + onDropRejected: (rejections) => { + const error = rejections[0].errors[0] + if (error.code === DropzoneErrorCode.FileTooLarge) { + setMessage("File is too big") + } else if (error.code === DropzoneErrorCode.FileInvalidType) { + setMessage("File is not a JSON file") + } + handleFileRejected() + }, + onDropAccepted: handleFileAccepted, + }), + [handleFileAccepted, handleFileRejected], + ) + + return ( + +
+ + + {!value && ( + + + + {isRejected ? ( + <> + + {message} + + ) : ( + "Upload a JSON trace file" + )} + + + + )} + + +
+ + {value && } +
+ ) +} diff --git a/pdl-live-react/src/Viewer.css b/pdl-live-react/src/Viewer.css new file mode 100644 index 00000000..b856162f --- /dev/null +++ b/pdl-live-react/src/Viewer.css @@ -0,0 +1,44 @@ +/* Margin around text-ish comments between blocks */ +dl { + .pdl-defs { + margin-bottom: 0.25em; + } +} + +.pdl-interstitial-text { + margin-top: 1em; +} + +.pf-v6-c-clipboard-copy .pf-v6-c-form-control { + display: none; +} + +.pdl-wrap { + &, + & p { + white-space: pre-wrap; + } +} + +.pdl-mono { + font-family: var(--pf-t--global--font--family--mono); +} + +.pdl-transcript { + max-width: 800px; + + .pf-v6-c-accordion__expandable-content { + background-color: transparent; + } + .pf-v6-c-accordion__item { + &.pdl_block { + .pdl-block-icon { + font-size: 1.375em; + } + + .pdl-result-panel { + --pf-v6-c-panel--BackgroundColor: transparent; + } + } + } +} diff --git a/pdl-live-react/src/Viewer.tsx b/pdl-live-react/src/Viewer.tsx new file mode 100644 index 00000000..cf7ac9ef --- /dev/null +++ b/pdl-live-react/src/Viewer.tsx @@ -0,0 +1,47 @@ +import { useCallback, useContext, useMemo, useState } from "react" + +import { Tabs, Tab, TabTitleText, type TabsProps } from "@patternfly/react-core" + +import Code from "./view/Code" +import Transcript from "./view/transcript/Transcript" +import DarkModeContext from "./DarkModeContext" + +import type { PdlBlock } from "./pdl_ast" + +import "./Viewer.css" + +/** This is the main view component */ +export default function Viewer({ value }: { value: string }) { + // DarkMode state + const darkMode = useContext(DarkModeContext) + + const data = useMemo( + () => (value ? (JSON.parse(value) as PdlBlock) : null), + [value], + ) + + const [activeTab, setActiveTab] = useState("transcript") + const handleTabClick = useCallback["onSelect"]>( + (_event, tab) => setActiveTab(tab), + [setActiveTab], + ) + + return ( + data && ( + + Transcript} + > + + + Source}> + + + Raw Trace}> + + + + ) + ) +} diff --git a/pdl-live-react/src/Welcome.tsx b/pdl-live-react/src/Welcome.tsx new file mode 100644 index 00000000..43626a95 --- /dev/null +++ b/pdl-live-react/src/Welcome.tsx @@ -0,0 +1,15 @@ +import { Content } from "@patternfly/react-core" +import Page from "./Page" + +export default function Welcome() { + return ( + + Prompt Declaration Language (PDL) Viewer + + + You may either upload a trace, or select one of the demo traces from the + left. + + + ) +} diff --git a/pdl-live-react/src/assets/ai-governance--prompt.svg b/pdl-live-react/src/assets/ai-governance--prompt.svg new file mode 100644 index 00000000..ee1612cd --- /dev/null +++ b/pdl-live-react/src/assets/ai-governance--prompt.svg @@ -0,0 +1,22 @@ + + + + + + diff --git a/pdl-live-react/src/demos/README.md b/pdl-live-react/src/demos/README.md new file mode 100644 index 00000000..c66db991 --- /dev/null +++ b/pdl-live-react/src/demos/README.md @@ -0,0 +1,10 @@ +# Demo Traces + +These demo traces were sourced as follows: + +- demo1: From the top-level README +- demo2: [model_chaining.pdl](../../../examples/tutorial/model_chaining.pdl) +- demo3: [fib.pdl](../../../examples/fibonacci/fib.pdl) +- demo4: [chatbot.pdl](../../../examples/chatbot/chatbot.pdl) +- demo5: [6-code-json.pdl](../../../examples/talk/6-code-json.pdl) +- demo6: [error.pdl](../../demos/error.pdl) diff --git a/pdl-live-react/src/demos/demo1.json b/pdl-live-react/src/demos/demo1.json new file mode 100644 index 00000000..cb037616 --- /dev/null +++ b/pdl-live-react/src/demos/demo1.json @@ -0,0 +1,20 @@ +{ + "kind": "text", + "description": "Simple LLM interaction", + "defs": {}, + "text": [ + "write a hello world example\n", + { + "kind": "model", + "defs": {}, + "platform": "litellm", + "model": "ollama/granite-code:8b", + "parameters": { + "temperature": 0.0, + "stop_sequences": "!" + }, + "result": "```python\nprint(\"hello world\")\n```\n" + } + ], + "result": "write a hello world example\n```python\nprint(\"hello world\")\n```\n" +} diff --git a/pdl-live-react/src/demos/demo2.json b/pdl-live-react/src/demos/demo2.json new file mode 100644 index 00000000..adcb9abe --- /dev/null +++ b/pdl-live-react/src/demos/demo2.json @@ -0,0 +1 @@ +{"kind": "text", "description": "Model chaining", "defs": {}, "text": ["Hello\n", {"kind": "model", "defs": {}, "platform": "litellm", "model": "ollama/granite-code:8b", "parameters": {"stop_sequences": "!"}, "result": "Hello! How can I help you today?\n"}, "\nDid you just say Hello?\n", {"kind": "model", "defs": {}, "platform": "litellm", "model": "ollama/granite-code:8b", "parameters": {"stop_sequences": "!"}, "result": "Yes, I did. Is there anything I can help you with?\n"}], "result": "Hello\nHello! How can I help you today?\n\nDid you just say Hello?\nYes, I did. Is there anything I can help you with?\n"} \ No newline at end of file diff --git a/pdl-live-react/src/demos/demo3.json b/pdl-live-react/src/demos/demo3.json new file mode 100644 index 00000000..1d399143 --- /dev/null +++ b/pdl-live-react/src/demos/demo3.json @@ -0,0 +1,57 @@ +{ + "kind": "text", + "description": "Fibonacci", + "defs": {}, + "text": [ + { + "kind": "model", + "defs": {}, + "platform": "litellm", + "model": "ollama/granite-code:8b", + "input": "Write a Python function to compute the Fibonacci sequence. Do not include a doc string.\n\n", + "parameters": { + "temperature": 0.0 + }, + "def": "CODE", + "result": "Here is the implementation of the Fibonacci sequence in Python:\n\n```python\ndef fibonacci(n):\n if n <= 1:\n return n\n else:\n return fibonacci(n-1) + fibonacci(n-2)\n```\n" + }, + "\nExtract the Python code from the LLM response\n", + { + "kind": "code", + "defs": {}, + "lang": "python", + "code": "s = \"\"\"'Here is the implementation of the Fibonacci sequence in Python:\n\n```python\ndef fibonacci(n):\n if n <= 1:\n return n\n else:\n return fibonacci(n-1) + fibonacci(n-2)\n```\n '\"\"\"\nresult = s.split(\"```\")[1].replace(\"python\", \"\")\n", + "def": "EXTRACTED", + "result": "\ndef fibonacci(n):\n if n <= 1:\n return n\n else:\n return fibonacci(n-1) + fibonacci(n-2)\n" + }, + "\nFind a random number between 1 and 20\n", + { + "kind": "code", + "defs": {}, + "lang": "python", + "code": "import random\nresult = random.randint(1, 20)\n", + "def": "N", + "result": 14 + }, + "\nNow compute `fibonacci(14)`\n", + { + "kind": "code", + "defs": {}, + "lang": "python", + "code": "\ndef fibonacci(n):\n if n <= 1:\n return n\n else:\n return fibonacci(n-1) + fibonacci(n-2)\n\nresult = fibonacci(14)\n", + "def": "RESULT", + "contribute": [], + "result": 377 + }, + "The result is: 377", + "\n\nExplain what the above code does and what the result means\n\n", + { + "kind": "model", + "defs": {}, + "platform": "litellm", + "model": "ollama/granite-code:8b", + "result": "The Python code defines a recursive function called `fibonacci` that calculates the nth Fibonacci number. The function checks if n is less than or equal to 1, in which case it returns n. Otherwise, it recursively calls itself with arguments n-1 and n-2, and adds the results together.\n\nThe result of `fibonacci(14)` is 377, which means that the 14th Fibonacci number is 377. The Fibonacci sequence is a series of numbers in which each number is the sum of the two preceding ones, starting from 0 and 1. So, the first few Fibonacci numbers are:\n\n0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...\n\nThe 14th Fibonacci number is 377, which means that the sum of the 13th and 12th Fibonacci numbers is 377. This is an example of how the Fibonacci sequence can be used to calculate the sum of two preceding terms in the sequence.\n" + } + ], + "result": "Here is the implementation of the Fibonacci sequence in Python:\n\n```python\ndef fibonacci(n):\n if n <= 1:\n return n\n else:\n return fibonacci(n-1) + fibonacci(n-2)\n```\n\nExtract the Python code from the LLM response\n\ndef fibonacci(n):\n if n <= 1:\n return n\n else:\n return fibonacci(n-1) + fibonacci(n-2)\n\nFind a random number between 1 and 20\n14\nNow compute `fibonacci(14)`\nThe result is: 377\n\nExplain what the above code does and what the result means\n\nThe Python code defines a recursive function called `fibonacci` that calculates the nth Fibonacci number. The function checks if n is less than or equal to 1, in which case it returns n. Otherwise, it recursively calls itself with arguments n-1 and n-2, and adds the results together.\n\nThe result of `fibonacci(14)` is 377, which means that the 14th Fibonacci number is 377. The Fibonacci sequence is a series of numbers in which each number is the sum of the two preceding ones, starting from 0 and 1. So, the first few Fibonacci numbers are:\n\n0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...\n\nThe 14th Fibonacci number is 377, which means that the sum of the 13th and 12th Fibonacci numbers is 377. This is an example of how the Fibonacci sequence can be used to calculate the sum of two preceding terms in the sequence.\n" +} diff --git a/pdl-live-react/src/demos/demo4.json b/pdl-live-react/src/demos/demo4.json new file mode 100644 index 00000000..28fff66b --- /dev/null +++ b/pdl-live-react/src/demos/demo4.json @@ -0,0 +1 @@ +{"kind": "text", "description": "Chatbot", "defs": {}, "text": [{"kind": "read", "defs": {}, "read": null, "message": "What is your query?\n", "multiline": false, "contribute": ["context"], "result": "what is the fastest animal"}, {"kind": "repeat_until", "defs": {}, "repeat": {"kind": "text", "defs": {}, "text": [{"kind": "model", "defs": {}, "platform": "litellm", "model": "ollama/granite-code:8b"}, {"kind": "read", "defs": {}, "read": null, "message": "\nIs this a good answer[yes/no]?\n", "multiline": false, "def": "eval", "contribute": ["context"]}, {"kind": "if", "defs": {}, "if": "${ eval == 'no' }", "then": {"kind": "text", "defs": {}, "text": [{"kind": "read", "defs": {}, "read": null, "message": "Why not?\n", "multiline": false, "contribute": []}]}}]}, "until": "${ eval == 'yes'}", "join": {"with": ""}, "trace": [{"kind": "text", "defs": {}, "text": [{"kind": "model", "defs": {}, "platform": "litellm", "model": "ollama/granite-code:8b", "result": "The fastest animal is the cheetah. They can run up to speeds of 70 miles per hour, making them the fastest land animal.\n"}, {"kind": "read", "defs": {}, "read": null, "message": "\nIs this a good answer[yes/no]?\n", "multiline": false, "def": "eval", "contribute": ["context"], "result": "no"}, {"kind": "if", "defs": {}, "if": "${ eval == 'no' }", "then": {"kind": "text", "defs": {}, "text": [{"kind": "read", "defs": {}, "read": null, "message": "Why not?\n", "multiline": false, "contribute": [], "result": "in europe"}], "result": ""}, "if_result": true, "result": ""}], "result": "The fastest animal is the cheetah. They can run up to speeds of 70 miles per hour, making them the fastest land animal.\n"}, {"kind": "text", "defs": {}, "text": [{"kind": "model", "defs": {}, "platform": "litellm", "model": "ollama/granite-code:8b", "result": "I'm sorry, but you are incorrect. The cheetah is not the fastest animal. The fastest animal is the peregrine falcon, which can reach speeds of up to 240 miles per hour. Peregrine falcons are able to run at such high speeds due to their powerful wings and streamlined body shape. They are also able to hover in the air for short periods of time, allowing them to catch prey mid-air.\n"}, {"kind": "read", "defs": {}, "read": null, "message": "\nIs this a good answer[yes/no]?\n", "multiline": false, "def": "eval", "contribute": ["context"], "result": "yes"}, {"kind": "if", "defs": {}, "if": "${ eval == 'no' }", "then": {"kind": "text", "defs": {}, "text": [{"kind": "read", "defs": {}, "read": null, "message": "Why not?\n", "multiline": false, "contribute": []}]}, "if_result": false, "result": ""}], "result": "I'm sorry, but you are incorrect. The cheetah is not the fastest animal. The fastest animal is the peregrine falcon, which can reach speeds of up to 240 miles per hour. Peregrine falcons are able to run at such high speeds due to their powerful wings and streamlined body shape. They are also able to hover in the air for short periods of time, allowing them to catch prey mid-air.\n"}], "result": "The fastest animal is the cheetah. They can run up to speeds of 70 miles per hour, making them the fastest land animal.\nI'm sorry, but you are incorrect. The cheetah is not the fastest animal. The fastest animal is the peregrine falcon, which can reach speeds of up to 240 miles per hour. Peregrine falcons are able to run at such high speeds due to their powerful wings and streamlined body shape. They are also able to hover in the air for short periods of time, allowing them to catch prey mid-air.\n"}], "result": "The fastest animal is the cheetah. They can run up to speeds of 70 miles per hour, making them the fastest land animal.\nI'm sorry, but you are incorrect. The cheetah is not the fastest animal. The fastest animal is the peregrine falcon, which can reach speeds of up to 240 miles per hour. Peregrine falcons are able to run at such high speeds due to their powerful wings and streamlined body shape. They are also able to hover in the air for short periods of time, allowing them to catch prey mid-air.\n"} diff --git a/pdl-live-react/src/demos/demo5.json b/pdl-live-react/src/demos/demo5.json new file mode 100644 index 00000000..18ecb334 --- /dev/null +++ b/pdl-live-react/src/demos/demo5.json @@ -0,0 +1 @@ +{"kind": "lastOf", "description": "Code explanation example", "defs": {"CODE": {"kind": "read", "defs": {}, "read": "./data.yaml", "message": null, "multiline": false, "result": "source_code: \n |\n @SuppressWarnings(\"unchecked\")\n public static Map deserializeOffsetMap(String lastSourceOffset) throws IOException {\n Map offsetMap;\n if (lastSourceOffset == null || lastSourceOffset.isEmpty()) { \n offsetMap = new HashMap<>(); \n } else {\n offsetMap = JSON_MAPPER.readValue(lastSourceOffset, Map.class); \n }\n return offsetMap;\n }\nrepo_info: \n repo: streamsets/datacollector\n path: stagesupport/src/main/java/com/.../OffsetUtil.java\n function_name: OffsetUtil.deserializeOffsetMap", "parser": "yaml"}, "TRUTH": {"kind": "read", "defs": {}, "read": "./ground_truth.txt", "message": null, "multiline": false, "result": "The function `deserializeOffsetMap` takes a string as input and returns a map. It first checks if the input string is null or empty. If it is, it creates a new empty map and returns it. Otherwise, it uses the Jackson library to parse the input string into a map and returns it.\n\nThe `@SuppressWarnings(\"unchecked\")` annotation is used to suppress the warning that the type of the parsed map is not checked. This is because the Jackson library is used to parse the input string into a map, but the specific type of the map is not known at compile time. Therefore, the warning is suppressed to avoid potential issues."}}, "lastOf": [{"kind": "model", "defs": {}, "platform": "litellm", "model": "ollama/llama3.1:8b", "input": "Here is some info about the location of the function in the repo.\nrepo: \n${ CODE.repo_info.repo }\npath: ${ CODE.repo_info.path }\nFunction_name: ${ CODE.repo_info.function_name }\n\n\nExplain the following code:\n```\n${ CODE.source_code }```\n", "def": "EXPLANATION", "contribute": [], "result": "**Code Explanation: Deserializing an Offset Map from a JSON String**\n\nThis Java method, `deserializeOffsetMap`, is part of the `OffsetUtil` class in the `streamsets/datacollector` repository. It takes a string representation of an offset map (`lastSourceOffset`) as input and returns a deserialized `Map` containing the offset information.\n\n**Method Breakdown**\n\n1. **Suppression of unchecked cast warning**: The first line, `@SuppressWarnings(\"unchecked\")`, suppresses a warning that would otherwise be generated by Java due to the use of an unchecked cast.\n2. **Initialization of offset map**: A local variable `offsetMap` is declared as an instance of `Map`. This will store the deserialized offset information.\n3. **Handling null or empty input**: If the input string (`lastSourceOffset`) is either:\n\t* Null: An empty `HashMap` is created and assigned to `offsetMap`.\n\t* Empty (i.e., an empty string): An empty `HashMap` is created and assigned to `offsetMap`. This implies that no offset information is available, so an empty map is a reasonable default.\n4. **Deserialization using JSON_MAPPER**: If the input string is not null or empty, it's assumed to be a JSON representation of the offset map. The `JSON_MAPPER` object (an instance of `ObjectMapper`, likely created elsewhere in the codebase) is used to deserialize the JSON string into a Java `Map`. This map is then assigned to `offsetMap`.\n5. **Return the deserialized offset map**: Finally, the method returns the `offsetMap`.\n\n**Context**\n\nThis method is likely used in a context where offset information needs to be retrieved from a JSON-formatted string and stored in a Java `Map` for further processing or storage.\n\nExample usage:\n```java\nString jsonOffset = \"{\\\"key1\\\":\\\"value1\\\",\\\"key2\\\":\\\"value2\\\"}\";\nMap offsetMap = OffsetUtil.deserializeOffsetMap(jsonOffset);\n// Use the deserialized map as needed\n```\nNote that this method assumes the presence of a `JSON_MAPPER` instance elsewhere in the codebase. If not defined, you'll need to create an instance of `ObjectMapper` (e.g., using `new ObjectMapper()`) and configure it as necessary for your specific JSON serialization requirements."}, {"kind": "code", "defs": {}, "lang": "python", "code": "import textdistance\nexpl = \"\"\"\n**Code Explanation: Deserializing an Offset Map from a JSON String**\n\nThis Java method, `deserializeOffsetMap`, is part of the `OffsetUtil` class in the `streamsets/datacollector` repository. It takes a string representation of an offset map (`lastSourceOffset`) as input and returns a deserialized `Map` containing the offset information.\n\n**Method Breakdown**\n\n1. **Suppression of unchecked cast warning**: The first line, `@SuppressWarnings(\"unchecked\")`, suppresses a warning that would otherwise be generated by Java due to the use of an unchecked cast.\n2. **Initialization of offset map**: A local variable `offsetMap` is declared as an instance of `Map`. This will store the deserialized offset information.\n3. **Handling null or empty input**: If the input string (`lastSourceOffset`) is either:\n\t* Null: An empty `HashMap` is created and assigned to `offsetMap`.\n\t* Empty (i.e., an empty string): An empty `HashMap` is created and assigned to `offsetMap`. This implies that no offset information is available, so an empty map is a reasonable default.\n4. **Deserialization using JSON_MAPPER**: If the input string is not null or empty, it's assumed to be a JSON representation of the offset map. The `JSON_MAPPER` object (an instance of `ObjectMapper`, likely created elsewhere in the codebase) is used to deserialize the JSON string into a Java `Map`. This map is then assigned to `offsetMap`.\n5. **Return the deserialized offset map**: Finally, the method returns the `offsetMap`.\n\n**Context**\n\nThis method is likely used in a context where offset information needs to be retrieved from a JSON-formatted string and stored in a Java `Map` for further processing or storage.\n\nExample usage:\n```java\nString jsonOffset = \"{\\\"key1\\\":\\\"value1\\\",\\\"key2\\\":\\\"value2\\\"}\";\nMap offsetMap = OffsetUtil.deserializeOffsetMap(jsonOffset);\n// Use the deserialized map as needed\n```\nNote that this method assumes the presence of a `JSON_MAPPER` instance elsewhere in the codebase. If not defined, you'll need to create an instance of `ObjectMapper` (e.g., using `new ObjectMapper()`) and configure it as necessary for your specific JSON serialization requirements.\n\"\"\"\ntruth = \"\"\"\nThe function `deserializeOffsetMap` takes a string as input and returns a map. It first checks if the input string is null or empty. If it is, it creates a new empty map and returns it. Otherwise, it uses the Jackson library to parse the input string into a map and returns it.\n\nThe `@SuppressWarnings(\"unchecked\")` annotation is used to suppress the warning that the type of the parsed map is not checked. This is because the Jackson library is used to parse the input string into a map, but the specific type of the map is not known at compile time. Therefore, the warning is suppressed to avoid potential issues.\n\"\"\"\nresult = textdistance.levenshtein.normalized_similarity(expl, truth)\n", "def": "EVAL", "result": 0.19828364950316169}, {"kind": "data", "defs": {}, "data": {"input": {"source_code": "@SuppressWarnings(\"unchecked\")\npublic static Map deserializeOffsetMap(String lastSourceOffset) throws IOException {\n Map offsetMap;\n if (lastSourceOffset == null || lastSourceOffset.isEmpty()) { \n offsetMap = new HashMap<>(); \n } else {\n offsetMap = JSON_MAPPER.readValue(lastSourceOffset, Map.class); \n }\n return offsetMap;\n}\n", "repo_info": {"repo": "streamsets/datacollector", "path": "stagesupport/src/main/java/com/.../OffsetUtil.java", "function_name": "OffsetUtil.deserializeOffsetMap"}}, "output": "**Code Explanation: Deserializing an Offset Map from a JSON String**\n\nThis Java method, `deserializeOffsetMap`, is part of the `OffsetUtil` class in the `streamsets/datacollector` repository. It takes a string representation of an offset map (`lastSourceOffset`) as input and returns a deserialized `Map` containing the offset information.\n\n**Method Breakdown**\n\n1. **Suppression of unchecked cast warning**: The first line, `@SuppressWarnings(\"unchecked\")`, suppresses a warning that would otherwise be generated by Java due to the use of an unchecked cast.\n2. **Initialization of offset map**: A local variable `offsetMap` is declared as an instance of `Map`. This will store the deserialized offset information.\n3. **Handling null or empty input**: If the input string (`lastSourceOffset`) is either:\n\t* Null: An empty `HashMap` is created and assigned to `offsetMap`.\n\t* Empty (i.e., an empty string): An empty `HashMap` is created and assigned to `offsetMap`. This implies that no offset information is available, so an empty map is a reasonable default.\n4. **Deserialization using JSON_MAPPER**: If the input string is not null or empty, it's assumed to be a JSON representation of the offset map. The `JSON_MAPPER` object (an instance of `ObjectMapper`, likely created elsewhere in the codebase) is used to deserialize the JSON string into a Java `Map`. This map is then assigned to `offsetMap`.\n5. **Return the deserialized offset map**: Finally, the method returns the `offsetMap`.\n\n**Context**\n\nThis method is likely used in a context where offset information needs to be retrieved from a JSON-formatted string and stored in a Java `Map` for further processing or storage.\n\nExample usage:\n```java\nString jsonOffset = \"{\\\"key1\\\":\\\"value1\\\",\\\"key2\\\":\\\"value2\\\"}\";\nMap offsetMap = OffsetUtil.deserializeOffsetMap(jsonOffset);\n// Use the deserialized map as needed\n```\nNote that this method assumes the presence of a `JSON_MAPPER` instance elsewhere in the codebase. If not defined, you'll need to create an instance of `ObjectMapper` (e.g., using `new ObjectMapper()`) and configure it as necessary for your specific JSON serialization requirements.", "metric": 0.19828364950316169}, "result": {"input": {"source_code": "@SuppressWarnings(\"unchecked\")\npublic static Map deserializeOffsetMap(String lastSourceOffset) throws IOException {\n Map offsetMap;\n if (lastSourceOffset == null || lastSourceOffset.isEmpty()) { \n offsetMap = new HashMap<>(); \n } else {\n offsetMap = JSON_MAPPER.readValue(lastSourceOffset, Map.class); \n }\n return offsetMap;\n}\n", "repo_info": {"repo": "streamsets/datacollector", "path": "stagesupport/src/main/java/com/.../OffsetUtil.java", "function_name": "OffsetUtil.deserializeOffsetMap"}}, "output": "**Code Explanation: Deserializing an Offset Map from a JSON String**\n\nThis Java method, `deserializeOffsetMap`, is part of the `OffsetUtil` class in the `streamsets/datacollector` repository. It takes a string representation of an offset map (`lastSourceOffset`) as input and returns a deserialized `Map` containing the offset information.\n\n**Method Breakdown**\n\n1. **Suppression of unchecked cast warning**: The first line, `@SuppressWarnings(\"unchecked\")`, suppresses a warning that would otherwise be generated by Java due to the use of an unchecked cast.\n2. **Initialization of offset map**: A local variable `offsetMap` is declared as an instance of `Map`. This will store the deserialized offset information.\n3. **Handling null or empty input**: If the input string (`lastSourceOffset`) is either:\n\t* Null: An empty `HashMap` is created and assigned to `offsetMap`.\n\t* Empty (i.e., an empty string): An empty `HashMap` is created and assigned to `offsetMap`. This implies that no offset information is available, so an empty map is a reasonable default.\n4. **Deserialization using JSON_MAPPER**: If the input string is not null or empty, it's assumed to be a JSON representation of the offset map. The `JSON_MAPPER` object (an instance of `ObjectMapper`, likely created elsewhere in the codebase) is used to deserialize the JSON string into a Java `Map`. This map is then assigned to `offsetMap`.\n5. **Return the deserialized offset map**: Finally, the method returns the `offsetMap`.\n\n**Context**\n\nThis method is likely used in a context where offset information needs to be retrieved from a JSON-formatted string and stored in a Java `Map` for further processing or storage.\n\nExample usage:\n```java\nString jsonOffset = \"{\\\"key1\\\":\\\"value1\\\",\\\"key2\\\":\\\"value2\\\"}\";\nMap offsetMap = OffsetUtil.deserializeOffsetMap(jsonOffset);\n// Use the deserialized map as needed\n```\nNote that this method assumes the presence of a `JSON_MAPPER` instance elsewhere in the codebase. If not defined, you'll need to create an instance of `ObjectMapper` (e.g., using `new ObjectMapper()`) and configure it as necessary for your specific JSON serialization requirements.", "metric": 0.19828364950316169}}], "result": {"input": {"source_code": "@SuppressWarnings(\"unchecked\")\npublic static Map deserializeOffsetMap(String lastSourceOffset) throws IOException {\n Map offsetMap;\n if (lastSourceOffset == null || lastSourceOffset.isEmpty()) { \n offsetMap = new HashMap<>(); \n } else {\n offsetMap = JSON_MAPPER.readValue(lastSourceOffset, Map.class); \n }\n return offsetMap;\n}\n", "repo_info": {"repo": "streamsets/datacollector", "path": "stagesupport/src/main/java/com/.../OffsetUtil.java", "function_name": "OffsetUtil.deserializeOffsetMap"}}, "output": "**Code Explanation: Deserializing an Offset Map from a JSON String**\n\nThis Java method, `deserializeOffsetMap`, is part of the `OffsetUtil` class in the `streamsets/datacollector` repository. It takes a string representation of an offset map (`lastSourceOffset`) as input and returns a deserialized `Map` containing the offset information.\n\n**Method Breakdown**\n\n1. **Suppression of unchecked cast warning**: The first line, `@SuppressWarnings(\"unchecked\")`, suppresses a warning that would otherwise be generated by Java due to the use of an unchecked cast.\n2. **Initialization of offset map**: A local variable `offsetMap` is declared as an instance of `Map`. This will store the deserialized offset information.\n3. **Handling null or empty input**: If the input string (`lastSourceOffset`) is either:\n\t* Null: An empty `HashMap` is created and assigned to `offsetMap`.\n\t* Empty (i.e., an empty string): An empty `HashMap` is created and assigned to `offsetMap`. This implies that no offset information is available, so an empty map is a reasonable default.\n4. **Deserialization using JSON_MAPPER**: If the input string is not null or empty, it's assumed to be a JSON representation of the offset map. The `JSON_MAPPER` object (an instance of `ObjectMapper`, likely created elsewhere in the codebase) is used to deserialize the JSON string into a Java `Map`. This map is then assigned to `offsetMap`.\n5. **Return the deserialized offset map**: Finally, the method returns the `offsetMap`.\n\n**Context**\n\nThis method is likely used in a context where offset information needs to be retrieved from a JSON-formatted string and stored in a Java `Map` for further processing or storage.\n\nExample usage:\n```java\nString jsonOffset = \"{\\\"key1\\\":\\\"value1\\\",\\\"key2\\\":\\\"value2\\\"}\";\nMap offsetMap = OffsetUtil.deserializeOffsetMap(jsonOffset);\n// Use the deserialized map as needed\n```\nNote that this method assumes the presence of a `JSON_MAPPER` instance elsewhere in the codebase. If not defined, you'll need to create an instance of `ObjectMapper` (e.g., using `new ObjectMapper()`) and configure it as necessary for your specific JSON serialization requirements.", "metric": 0.19828364950316169}} \ No newline at end of file diff --git a/pdl-live-react/src/demos/demo6.json b/pdl-live-react/src/demos/demo6.json new file mode 100644 index 00000000..a06f7509 --- /dev/null +++ b/pdl-live-react/src/demos/demo6.json @@ -0,0 +1 @@ +{"kind": "error", "description": "Error Handling", "defs": {}, "program": {"kind": "read", "spec": {"questions": ["str"], "answers": ["obj"]}, "defs": {}, "read": "./gen-data.yaml", "message": null, "multiline": false, "result": "source_code: \n |\n @SuppressWarnings(\"unchecked\")\n public static Map deserializeOffsetMap(String lastSourceOffset) throws IOException {\n Map offsetMap;\n if (lastSourceOffset == null || lastSourceOffset.isEmpty()) { \n offsetMap = new HashMap<>(); \n } else {\n offsetMap = JSON_MAPPER.readValue(lastSourceOffset, Map.class); \n }\n return offsetMap;\n }\nrepo_info: \n repo: streamsets/datacollector\n path: stagesupport/src/main/java/com/.../OffsetUtil.java\n function_name: OffsetUtil.deserializeOffsetMap\n", "parser": "yaml"}, "msg": "Type errors during spec checking:\ndemos/error.pdl:3 - Missing required field: questions\ndemos/error.pdl:3 - Missing required field: answers\ndemos/error.pdl:3 - Field not allowed: source_code\ndemos/error.pdl:3 - Field not allowed: repo_info"} diff --git a/pdl-live-react/src/demos/demo7.json b/pdl-live-react/src/demos/demo7.json new file mode 100644 index 00000000..2c37874a --- /dev/null +++ b/pdl-live-react/src/demos/demo7.json @@ -0,0 +1 @@ +{"kind": "text", "description": "Function call", "defs": {}, "text": [{"kind": "function", "defs": {}, "function": {"sentence": "str", "language": "str"}, "return": {"kind": "lastOf", "defs": {}, "lastOf": ["\nTranslate the sentence '${ sentence }' to ${ language }.\n", {"kind": "model", "defs": {}, "platform": "litellm", "model": "ollama/llama3.1:8b", "parameters": {"temperature": 0.0, "stop_sequences": "\n"}}]}, "def": "translate", "result": ""}, {"kind": "call", "defs": {}, "call": "${ translate }", "args": {"sentence": "I love Paris!", "language": "French"}, "trace": {"kind": "lastOf", "defs": {}, "lastOf": ["\nTranslate the sentence 'I love Paris!' to French.\n", {"kind": "model", "defs": {}, "platform": "litellm", "model": "ollama/llama3.1:8b", "parameters": {"temperature": 0.0, "stop_sequences": "\n"}, "result": "### Translator\n\nThe translation of \"I love Paris!\" in French is: \n\n\"J'adore Paris!\"\n\nThis uses the formal form of \"to love\", which is suitable for most situations. If you want to use the informal form, it would be:\n\n\"Je t'aime bien Paris!\""}], "result": "### Translator\n\nThe translation of \"I love Paris!\" in French is: \n\n\"J'adore Paris!\"\n\nThis uses the formal form of \"to love\", which is suitable for most situations. If you want to use the informal form, it would be:\n\n\"Je t'aime bien Paris!\""}, "result": "### Translator\n\nThe translation of \"I love Paris!\" in French is: \n\n\"J'adore Paris!\"\n\nThis uses the formal form of \"to love\", which is suitable for most situations. If you want to use the informal form, it would be:\n\n\"Je t'aime bien Paris!\""}, "\n", {"kind": "call", "defs": {}, "call": "${ translate }", "args": {"sentence": "I love Madrid!", "language": "Spanish"}, "trace": {"kind": "lastOf", "defs": {}, "lastOf": ["\nTranslate the sentence 'I love Madrid!' to Spanish.\n", {"kind": "model", "defs": {}, "platform": "litellm", "model": "ollama/llama3.1:8b", "parameters": {"temperature": 0.0, "stop_sequences": "\n"}, "result": "The translation of \"I love Madrid!\" in Spanish is:\n\n\"Me encanta Madrid!\"\n\nThis uses the formal form of \"to love\", which is suitable for most situations. If you want to use the informal form, it would be:\n\n\"Me gusta Madrid\"\n\nHowever, if you want to express a stronger affection or passion for Madrid, you could use:\n\n\"Me encanta mucho Madrid!\""}], "result": "The translation of \"I love Madrid!\" in Spanish is:\n\n\"Me encanta Madrid!\"\n\nThis uses the formal form of \"to love\", which is suitable for most situations. If you want to use the informal form, it would be:\n\n\"Me gusta Madrid\"\n\nHowever, if you want to express a stronger affection or passion for Madrid, you could use:\n\n\"Me encanta mucho Madrid!\""}, "result": "The translation of \"I love Madrid!\" in Spanish is:\n\n\"Me encanta Madrid!\"\n\nThis uses the formal form of \"to love\", which is suitable for most situations. If you want to use the informal form, it would be:\n\n\"Me gusta Madrid\"\n\nHowever, if you want to express a stronger affection or passion for Madrid, you could use:\n\n\"Me encanta mucho Madrid!\""}], "result": "### Translator\n\nThe translation of \"I love Paris!\" in French is: \n\n\"J'adore Paris!\"\n\nThis uses the formal form of \"to love\", which is suitable for most situations. If you want to use the informal form, it would be:\n\n\"Je t'aime bien Paris!\"\nThe translation of \"I love Madrid!\" in Spanish is:\n\n\"Me encanta Madrid!\"\n\nThis uses the formal form of \"to love\", which is suitable for most situations. If you want to use the informal form, it would be:\n\n\"Me gusta Madrid\"\n\nHowever, if you want to express a stronger affection or passion for Madrid, you could use:\n\n\"Me encanta mucho Madrid!\""} diff --git a/pdl-live-react/src/demos/demos.ts b/pdl-live-react/src/demos/demos.ts new file mode 100644 index 00000000..c7cd4aa7 --- /dev/null +++ b/pdl-live-react/src/demos/demos.ts @@ -0,0 +1,21 @@ +import demo1 from "./demo1.json" +import demo2 from "./demo2.json" +import demo3 from "./demo3.json" +import demo4 from "./demo4.json" +import demo5 from "./demo5.json" +import demo6 from "./demo6.json" +import demo7 from "./demo7.json" + +type Demo = { + name: string + trace: string +} + +const demos: Demo[] = [demo1, demo2, demo3, demo4, demo5, demo6, demo7].map( + (demo) => ({ + name: demo.description, + trace: JSON.stringify(demo), + }), +) + +export default demos diff --git a/pdl-live-react/src/helpers.ts b/pdl-live-react/src/helpers.ts new file mode 100644 index 00000000..c84777e7 --- /dev/null +++ b/pdl-live-react/src/helpers.ts @@ -0,0 +1,111 @@ +import { type ReactElement } from "react" + +import type { BamModelBlock, PdlBlock, TextBlock } from "./pdl_ast" + +/** Re-export for convenience */ +export { type PdlBlock } from "./pdl_ast" + +export type NonScalarPdlBlock = Exclude< + PdlBlock, + null | string | boolean | number +> +export type PdlBlockWithResult = NonScalarPdlBlock & { + result: NonNullable +} + +/** Does the given block have a `result` field? */ +export function hasResult(block: PdlBlock): block is PdlBlockWithResult { + return ( + block != null && + typeof block === "object" && + "result" in block && + (typeof block.result !== "string" || block.result.length > 0) + ) +} + +export function isPdlBlock( + o: unknown | ReactElement | PdlBlock, +): o is PdlBlock { + const obj = o as PdlBlock + return ( + obj === null || + typeof obj === "string" || + typeof obj === "number" || + typeof obj === "boolean" || + typeof obj.kind === "string" + ) +} + +/** Does the given block have a `parser` field? */ +export function hasParser( + data: PdlBlock, +): data is NonScalarPdlBlock & { parser: import("./pdl_ast").Parser } { + return data != null && typeof data === "object" && "result" in data +} + +const markdownPattern = /`/ +/** Should we render `s` with react-markdown? */ +export function isMarkdownish(s: string): boolean { + /* try { + JSON.parse(s) + } catch(e) { + return false + } + try { + parseYaml(s) + } catch(e) { + return false + } */ + return markdownPattern.test(s) +} + +/** Is the given block a generic text block? */ +function isTextBlock(data: PdlBlock): data is TextBlock { + return (data as TextBlock).kind === "text" +} + +/** Is the given block a generic text block with non-null content? */ +type TextBlockWithContent = TextBlock & { text: NonNullable } +export function isTextBlockWithContent( + data: PdlBlock, +): data is TextBlockWithContent { + return isTextBlock(data) && data.text !== null +} + +/** Is the given block a generic text block with array content? */ +export function isTextBlockWithArrayContent( + data: PdlBlock, +): data is TextBlockWithContent & { text: PdlBlock[] } { + return isTextBlockWithContent(data) && Array.isArray(data.text) +} + +/** Does the given block represent an LLM interaction? */ +export function isLLMBlock(data: PdlBlock): data is BamModelBlock { + return (data as BamModelBlock).kind === "model" +} + +/** Does the given block have a `result` field? of type string */ +export function hasScalarResult( + block: PdlBlock, +): block is NonScalarPdlBlock & { result: string | boolean | number } { + return ( + block != null && + typeof block === "object" && + "result" in block && + (typeof block.result === "string" || + typeof block.result === "number" || + typeof block.result === "boolean") + ) +} + +const codeFenceStart = /^```[^\n]*$/ + +/** @return The text of `s` up till the first newline or end of string */ +export function firstLineOf(s: string) { + const lines = s.trim().split(/\n/) + const startIdx = codeFenceStart.test(lines[0]) ? 1 : 0 + const endIdx = + lines[lines.length - 1] === "```" ? lines.length - 1 : lines.length + const suffix = endIdx - startIdx === 1 ? "" : "…" + return lines[startIdx].replace(/:$/, "") + suffix +} diff --git a/pdl-live-react/src/main.tsx b/pdl-live-react/src/main.tsx new file mode 100644 index 00000000..eab6d1ec --- /dev/null +++ b/pdl-live-react/src/main.tsx @@ -0,0 +1,12 @@ +import { StrictMode } from "react" +import { createRoot } from "react-dom/client" +import { BrowserRouter } from "react-router-dom" +import App from "./App.tsx" + +createRoot(document.getElementById("root")!).render( + + + + + , +) diff --git a/pdl-live-react/src/pdl_ast.d.ts b/pdl-live-react/src/pdl_ast.d.ts new file mode 100644 index 00000000..72cd1b4c --- /dev/null +++ b/pdl-live-react/src/pdl_ast.d.ts @@ -0,0 +1,3336 @@ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +export type PDLSchemas = Program | PdlBlock +/** + * Prompt Declaration Language program (PDL) + */ +export type Program = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Documentation associated to the block. + * + */ +export type Description = string | null +/** + * Documentation associated to the block. + * + */ +export type Description1 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description2 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description3 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description4 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description5 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description6 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description7 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description8 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description9 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description10 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description11 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description12 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description13 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description14 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description15 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description16 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description17 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description18 = string | null +/** + * Documentation associated to the block. + * + */ +export type Description19 = string | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def = string | null +export type ContributeTarget = "result" | "context" +export type Value = unknown[] +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +export type Description20 = string | null +export type Spec20 = { + [k: string]: unknown +} | null +export type Pdl = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +export type Description21 = string | null +export type Spec21 = { + [k: string]: unknown +} | null +export type Regex = string +export type Mode = "search" | "match" | "fullmatch" | "split" | "findall" +/** + * Block to execute in case of error. + * + */ +export type Fallback = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role = string | null +export type Path = string[] +export type File = string +export type Kind = "empty" +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def1 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute1 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser1 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback1 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role1 = string | null +export type Kind1 = "error" +export type Msg = string +export type Program1 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def2 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute2 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser2 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback2 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role2 = string | null +export type Kind2 = "include" +/** + * Name of the file to include. + * + */ +export type Include = string +export type Trace = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def3 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute3 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser3 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback3 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role3 = string | null +export type Kind3 = "read" +/** + * Message to prompt the user to enter a value. + * + */ +export type Message = string | null +/** + * Indicate if one or multiple lines shoud be read. + * + */ +export type Multiline = boolean +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def4 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute4 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser4 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback4 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role of associated to the message. + */ +export type Role4 = string | null +export type Kind4 = "message" +/** + * Content of the message. + */ +export type Content = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def5 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute5 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser5 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback5 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role5 = string | null +export type Kind5 = "object" +export type Object = + | { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null + } + | ( + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null + )[] +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def6 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute6 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser6 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback6 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role6 = string | null +export type Kind6 = "array" +export type Array = ( + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +)[] +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def7 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute7 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser7 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback7 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role7 = string | null +export type Kind7 = "lastOf" +export type Lastof = ( + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +)[] +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def8 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute8 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser8 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback8 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role8 = string | null +export type Kind8 = "text" +/** + * Body of the text. + * + */ +export type Text = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | ( + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null + )[] + | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def9 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute9 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser9 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback9 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role9 = string | null +export type Kind9 = "for" +/** + * Body of the loop. + * + */ +export type Repeat = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Define how to combine the result of each iteration. + * + */ +export type Join = JoinText | JoinArray | JoinLastOf +/** + * String concatenation of the result of each iteration. + * + */ +export type As = "text" +/** + * String used to concatenate each iteration of the loop. + * + */ +export type With = string +/** + * Return the result of each iteration as an array. + * + */ +export type As1 = "array" +/** + * Return the result of the last iteration. + * + */ +export type As2 = "lastOf" +export type Trace1 = + | ( + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null + )[] + | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def10 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute10 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser10 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback10 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role10 = string | null +export type Kind10 = "repeat_until" +/** + * Body of the loop. + * + */ +export type Repeat1 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Define how to combine the result of each iteration. + * + */ +export type Join1 = JoinText | JoinArray | JoinLastOf +export type Trace2 = + | ( + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null + )[] + | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def11 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute11 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser11 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback11 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role11 = string | null +export type Kind11 = "repeat" +/** + * Body of the loop. + * + */ +export type Repeat2 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Number of iterations to perform. + * + */ +export type NumIterations = number +/** + * Define how to combine the result of each iteration. + * + */ +export type Join2 = JoinText | JoinArray | JoinLastOf +export type Trace3 = + | ( + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null + )[] + | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def12 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute12 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser12 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback12 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role12 = string | null +export type Kind12 = "if" +/** + * Branch to exectute if the condition is true. + * + */ +export type Then = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Branch to execute if the condition is false. + * + */ +export type Else = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +export type IfResult = boolean | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def13 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute13 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser13 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback13 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role13 = string | null +export type Kind13 = "data" +/** + * Do not evaluate expressions inside strings. + */ +export type Raw = boolean +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def14 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute14 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser14 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback14 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role14 = string | null +export type Kind14 = "get" +/** + * Name of the variable to access. + */ +export type Get = string +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def15 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute15 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser15 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback15 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role15 = string | null +export type Kind15 = "code" +/** + * Programming language of the code. + * + */ +export type Lang = "python" | "command" | "jinja" | "pdl" +/** + * Code to execute. + * + */ +export type Code = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def16 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute16 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser16 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback16 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role16 = string | null +export type Kind16 = "model" +export type Input = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +export type Trace4 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +export type Modelresponse = string | null +export type Platform = "bam" +export type PromptId = string | null +export type Enabled = boolean | null +export type SendTokens = boolean | null +export type Threshold = number | null +export type Enabled1 = boolean | null +export type SendTokens1 = boolean | null +export type Threshold1 = number | null +export type Enabled2 = boolean | null +export type SendTokens2 = boolean | null +export type Threshold2 = number | null +export type Enabled3 = boolean | null +export type SendTokens3 = boolean | null +export type Threshold3 = number | null +export type ExampleFileIds = + | [] + | [string] + | [string, string] + | [string, string, string] + | [string, string, string, string] + | [string, string, string, string, string] + | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def17 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute17 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser17 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback17 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role17 = string | null +export type Kind17 = "model" +export type Input1 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +export type Trace5 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +export type Modelresponse1 = string | null +export type Platform1 = "litellm" +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def18 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute18 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser18 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback18 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role18 = string | null +export type Kind18 = "call" +export type Trace6 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Name of the variable used to store the result of the execution of the block. + * + */ +export type Def19 = string | null +/** + * Indicate if the block contributes to the result and background context. + * + */ +export type Contribute19 = ( + | ContributeTarget + | { + [k: string]: ContributeValue + } +)[] +/** + * Parser to use to construct a value out of a string result. + */ +export type Parser19 = + | ("json" | "jsonl" | "yaml") + | PdlParser + | RegexParser + | null +/** + * Block to execute in case of error. + * + */ +export type Fallback19 = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +/** + * Role associated to the block and sub-blocks. + * + */ +export type Role19 = string | null +export type Kind19 = "function" +/** + * Functions parameters with their types. + * + */ +export type Function = { + [k: string]: unknown +} | null +/** + * Body of the function + * + */ +export type Return = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +export type Scope = { + [k: string]: unknown +} | null +export type PdlBlock = + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null + +/** + * Function declaration. + */ +export interface FunctionBlock { + description?: Description + spec?: Spec + defs?: Defs + def?: Def19 + contribute?: Contribute19 + parser?: Parser19 + fallback?: Fallback19 + role?: Role19 + result?: unknown + location?: LocationType | null + kind?: Kind19 + function: Function + return: Return + scope?: Scope +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Calling a function. + */ +export interface CallBlock { + description?: Description1 + spec?: Spec1 + defs?: Defs1 + def?: Def18 + contribute?: Contribute18 + parser?: Parser18 + fallback?: Fallback18 + role?: Role18 + result?: unknown + location?: LocationType | null + kind?: Kind18 + call: unknown + args?: Args + trace?: Trace6 +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec1 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs1 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Call a LLM through the LiteLLM API: https://docs.litellm.ai/. + */ +export interface LitellmModelBlock { + description?: Description2 + spec?: Spec2 + defs?: Defs2 + def?: Def17 + contribute?: Contribute17 + parser?: Parser17 + fallback?: Fallback17 + role?: Role17 + result?: unknown + location?: LocationType | null + kind?: Kind17 + model: unknown + input?: Input1 + trace?: Trace5 + modelResponse?: Modelresponse1 + platform?: Platform1 + parameters?: unknown +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec2 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs2 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +export interface BamModelBlock { + description?: Description3 + spec?: Spec3 + defs?: Defs3 + def?: Def16 + contribute?: Contribute16 + parser?: Parser16 + fallback?: Fallback16 + role?: Role16 + result?: unknown + location?: LocationType | null + kind?: Kind16 + model: unknown + input?: Input + trace?: Trace4 + modelResponse?: Modelresponse + platform: Platform + prompt_id?: PromptId + parameters?: unknown + moderations?: ModerationParameters | null + data?: PromptTemplateData | null + constraints?: Constraints +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec3 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs3 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Execute a piece of code. + */ +export interface CodeBlock { + description?: Description4 + spec?: Spec4 + defs?: Defs4 + def?: Def15 + contribute?: Contribute15 + parser?: Parser15 + fallback?: Fallback15 + role?: Role15 + result?: unknown + location?: LocationType | null + kind?: Kind15 + lang: Lang + code: Code +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec4 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs4 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Get the value of a variable. + */ +export interface GetBlock { + description?: Description5 + spec?: Spec5 + defs?: Defs5 + def?: Def14 + contribute?: Contribute14 + parser?: Parser14 + fallback?: Fallback14 + role?: Role14 + result?: unknown + location?: LocationType | null + kind?: Kind14 + get: Get +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec5 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs5 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Arbitrary JSON value. + */ +export interface DataBlock { + description?: Description6 + spec?: Spec6 + defs?: Defs6 + def?: Def13 + contribute?: Contribute13 + parser?: Parser13 + fallback?: Fallback13 + role?: Role13 + result?: unknown + location?: LocationType | null + kind?: Kind13 + data: unknown + raw?: Raw +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec6 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs6 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Conditional control structure. + */ +export interface IfBlock { + description?: Description7 + spec?: Spec7 + defs?: Defs7 + def?: Def12 + contribute?: Contribute12 + parser?: Parser12 + fallback?: Fallback12 + role?: Role12 + result?: unknown + location?: LocationType | null + kind?: Kind12 + if: unknown + then: Then + else?: Else + if_result?: IfResult +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec7 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs7 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Repeat the execution of a block for a fixed number of iterations. + */ +export interface RepeatBlock { + description?: Description8 + spec?: Spec8 + defs?: Defs8 + def?: Def11 + contribute?: Contribute11 + parser?: Parser11 + fallback?: Fallback11 + role?: Role11 + result?: unknown + location?: LocationType | null + kind?: Kind11 + repeat: Repeat2 + num_iterations: NumIterations + join?: Join2 + trace?: Trace3 +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec8 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs8 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Repeat the execution of a block until a condition is satisfied. + */ +export interface RepeatUntilBlock { + description?: Description9 + spec?: Spec9 + defs?: Defs9 + def?: Def10 + contribute?: Contribute10 + parser?: Parser10 + fallback?: Fallback10 + role?: Role10 + result?: unknown + location?: LocationType | null + kind?: Kind10 + repeat: Repeat1 + until: unknown + join?: Join1 + trace?: Trace2 +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec9 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs9 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Iteration over arrays. + */ +export interface ForBlock { + description?: Description10 + spec?: Spec10 + defs?: Defs10 + def?: Def9 + contribute?: Contribute9 + parser?: Parser9 + fallback?: Fallback9 + role?: Role9 + result?: unknown + location?: LocationType | null + kind?: Kind9 + for: For + repeat: Repeat + join?: Join + trace?: Trace1 +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec10 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs10 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Create the concatenation of the stringify version of the result of each block of the list of blocks. + */ +export interface TextBlock { + description?: Description11 + spec?: Spec11 + defs?: Defs11 + def?: Def8 + contribute?: Contribute8 + parser?: Parser8 + fallback?: Fallback8 + role?: Role8 + result?: unknown + location?: LocationType | null + kind?: Kind8 + text: Text +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec11 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs11 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Return the value of the last block if the list of blocks. + */ +export interface LastOfBlock { + description?: Description12 + spec?: Spec12 + defs?: Defs12 + def?: Def7 + contribute?: Contribute7 + parser?: Parser7 + fallback?: Fallback7 + role?: Role7 + result?: unknown + location?: LocationType | null + kind?: Kind7 + lastOf: Lastof +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec12 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs12 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Return the array of values computed by each block of the list of blocks. + */ +export interface ArrayBlock { + description?: Description13 + spec?: Spec13 + defs?: Defs13 + def?: Def6 + contribute?: Contribute6 + parser?: Parser6 + fallback?: Fallback6 + role?: Role6 + result?: unknown + location?: LocationType | null + kind?: Kind6 + array: Array +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec13 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs13 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Return the object where the value of each field is defined by a block. If the body of the object is an array, the resulting object is the union of the objects computed by each element of the array. + */ +export interface ObjectBlock { + description?: Description14 + spec?: Spec14 + defs?: Defs14 + def?: Def5 + contribute?: Contribute5 + parser?: Parser5 + fallback?: Fallback5 + role?: Role5 + result?: unknown + location?: LocationType | null + kind?: Kind5 + object: Object +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec14 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs14 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Create a message. + */ +export interface MessageBlock { + description?: Description15 + spec?: Spec15 + defs?: Defs15 + def?: Def4 + contribute?: Contribute4 + parser?: Parser4 + fallback?: Fallback4 + role: Role4 + result?: unknown + location?: LocationType | null + kind?: Kind4 + content: Content +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec15 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs15 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Read from a file or standard input. + */ +export interface ReadBlock { + description?: Description16 + spec?: Spec16 + defs?: Defs16 + def?: Def3 + contribute?: Contribute3 + parser?: Parser3 + fallback?: Fallback3 + role?: Role3 + result?: unknown + location?: LocationType | null + kind?: Kind3 + read: unknown + message?: Message + multiline?: Multiline +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec16 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs16 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Include a PDL file. + */ +export interface IncludeBlock { + description?: Description17 + spec?: Spec17 + defs?: Defs17 + def?: Def2 + contribute?: Contribute2 + parser?: Parser2 + fallback?: Fallback2 + role?: Role2 + result?: unknown + location?: LocationType | null + kind?: Kind2 + include: Include + trace?: Trace +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec17 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs17 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +export interface ErrorBlock { + description?: Description18 + spec?: Spec18 + defs?: Defs18 + def?: Def1 + contribute?: Contribute1 + parser?: Parser1 + fallback?: Fallback1 + role?: Role1 + result?: unknown + location?: LocationType | null + kind?: Kind1 + msg: Msg + program: Program1 +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec18 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs18 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +/** + * Block without an action. It can contain definitions. + */ +export interface EmptyBlock { + description?: Description19 + spec?: Spec19 + defs?: Defs19 + def?: Def + contribute?: Contribute + parser?: Parser + fallback?: Fallback + role?: Role + result?: unknown + location?: LocationType | null + kind?: Kind +} +/** + * Type specification of the result of the block. + * + */ +export interface Spec19 { + [k: string]: unknown +} +/** + * Set of definitions executed before the execution of the block. + * + */ +export interface Defs19 { + [k: string]: + | boolean + | number + | string + | FunctionBlock + | CallBlock + | LitellmModelBlock + | BamModelBlock + | CodeBlock + | GetBlock + | DataBlock + | IfBlock + | RepeatBlock + | RepeatUntilBlock + | ForBlock + | TextBlock + | LastOfBlock + | ArrayBlock + | ObjectBlock + | MessageBlock + | ReadBlock + | IncludeBlock + | ErrorBlock + | EmptyBlock + | null +} +export interface ContributeValue { + value: Value +} +export interface PdlParser { + description?: Description20 + spec?: Spec20 + pdl: Pdl +} +export interface RegexParser { + description?: Description21 + spec?: Spec21 + regex: Regex + mode?: Mode +} +export interface LocationType { + path: Path + file: File + table: Table +} +export interface Table { + [k: string]: number +} +/** + * Arrays to iterate over. + * + */ +export interface For { + [k: string]: unknown +} +export interface JoinText { + as?: As + with?: With +} +export interface JoinArray { + as: As1 +} +export interface JoinLastOf { + as: As2 +} +export interface ModerationParameters { + hap?: ModerationHAP | null + social_bias?: ModerationSocialBias | null + [k: string]: unknown +} +export interface ModerationHAP { + input?: ModerationHAPInput | null + output?: ModerationHAPOutput | null + [k: string]: unknown +} +export interface ModerationHAPInput { + enabled?: Enabled + send_tokens?: SendTokens + threshold?: Threshold + [k: string]: unknown +} +export interface ModerationHAPOutput { + enabled?: Enabled1 + send_tokens?: SendTokens1 + threshold?: Threshold1 + [k: string]: unknown +} +export interface ModerationSocialBias { + input?: ModerationSocialBiasInput | null + output?: ModerationSocialBiasOutput | null + [k: string]: unknown +} +export interface ModerationSocialBiasInput { + enabled?: Enabled2 + send_tokens?: SendTokens2 + threshold?: Threshold2 + [k: string]: unknown +} +export interface ModerationSocialBiasOutput { + enabled?: Enabled3 + send_tokens?: SendTokens3 + threshold?: Threshold3 + [k: string]: unknown +} +export interface PromptTemplateData { + example_file_ids?: ExampleFileIds + [k: string]: unknown +} +export interface Constraints { + [k: string]: unknown +} +/** + * Arguments of the function with their values. + * + */ +export interface Args { + [k: string]: unknown +} diff --git a/pdl-live-react/src/pdl_ast_utils.ts b/pdl-live-react/src/pdl_ast_utils.ts new file mode 100644 index 00000000..4b937272 --- /dev/null +++ b/pdl-live-react/src/pdl_ast_utils.ts @@ -0,0 +1,199 @@ +import { PdlBlock } from "./pdl_ast" +import { match, P } from "ts-pattern" + +export function map_block_children( + f: (block: PdlBlock) => PdlBlock, + block: PdlBlock, +): PdlBlock { + if ( + block === null || + typeof block === "boolean" || + typeof block === "number" || + typeof block === "string" + ) { + return block + } + let new_block: PdlBlock + if (block?.defs === undefined) { + new_block = { ...block } + } else { + const defs: { [k: string]: PdlBlock } = {} + for (const x in block.defs) { + defs[x] = f(block.defs[x]) + } + new_block = { ...block, defs: defs } + } + new_block = match(new_block) + // .with(P.string, s => s) + .with({ kind: "empty" }, (block) => block) + .with({ kind: "function" }, (block) => { + const returns = f(block.return) + return { ...block, return: returns } + }) + .with({ kind: "call" }, (block) => block) + .with({ kind: "model" }, (block) => { + if (block.input) { + const input = f(block.input) + block = { ...block, input: input } + } + return block + }) + .with({ kind: "code" }, (block) => { + const code = f(block.code) + return { ...block, code: code } + }) + .with({ kind: "get" }, (block) => block) + .with({ kind: "data" }, (block) => block) + .with({ kind: "text" }, (block) => { + let text + if (block.text instanceof Array) { + text = block.text.map(f) + } else { + text = f(block.text) + } + return { ...block, text: text } + }) + .with({ kind: "lastOf" }, (block) => { + const lastOf = block.lastOf.map(f) + return { ...block, lastOf: lastOf } + }) + .with({ kind: "array" }, (block) => { + const array = block.array.map(f) + return { ...block, array: array } + }) + .with({ kind: "object" }, (block) => { + let object + if (block.object instanceof Array) { + object = block.object.map(f) + } else { + object = Object.fromEntries( + Object.entries(block.object).map(([k, v]) => [k, f(v)]), + ) + } + return { ...block, object: object } + }) + .with({ kind: "message" }, (block) => { + const content = f(block.content) + return { ...block, content: content } + }) + .with({ kind: "if" }, (block) => { + const then_ = f(block.then) + const else_ = block.else ? f(block.else) : undefined + return { ...block, then: then_, else: else_ } + }) + .with({ kind: "repeat" }, (block) => { + const repeat = f(block.repeat) + return { ...block, repeat: repeat } + }) + .with({ kind: "repeat_until" }, (block) => { + const repeat = f(block.repeat) + return { ...block, repeat: repeat } + }) + .with({ kind: "for" }, (block) => { + const repeat = f(block.repeat) + return { ...block, repeat: repeat } + }) + .with({ kind: "error" }, (block) => { + const doc = f(block.program) + return { ...block, program: doc } + }) + .with({ kind: "read" }, (block) => block) + .with({ kind: "include" }, (block) => block) + .with({ kind: undefined }, (block) => block) + .exhaustive() + match(new_block) + .with({ parser: { pdl: P._ } }, (block) => { + block.parser.pdl = f(block.parser.pdl) + }) + .otherwise(() => {}) + if (block.fallback) { + block.fallback = f(block.fallback) + } + return new_block +} + +export function iter_block_children( + f: (block: PdlBlock) => void, + block: PdlBlock, +): void { + if ( + block === null || + typeof block === "boolean" || + typeof block === "number" || + typeof block === "string" + ) { + return + } + if (block?.defs) { + for (const x in block.defs) { + f(block.defs[x]) + } + } + match(block) + .with(P.string, () => {}) + .with({ kind: "empty" }, () => {}) + .with({ kind: "function" }, (block) => { + f(block.return) + }) + .with({ kind: "call" }, () => {}) + .with({ kind: "model" }, (block) => { + if (block.input) f(block.input) + }) + .with({ kind: "code" }, (block) => { + f(block.code) + }) + .with({ kind: "get" }, () => {}) + .with({ kind: "data" }, () => {}) + .with({ kind: "text" }, (block) => { + if (block.text instanceof Array) { + block.text.forEach(f) + } else { + f(block.text) + } + }) + .with({ kind: "lastOf" }, (block) => { + block.lastOf.forEach(f) + }) + .with({ kind: "array" }, (block) => { + block.array.forEach(f) + }) + .with({ kind: "object" }, (block) => { + let object + if (block.object instanceof Array) { + block.object.forEach(f) + } else { + Object.values(block.object).forEach(f) + } + return { ...block, object: object } + }) + + .with({ kind: "message" }, (block) => { + f(block.content) + }) + .with({ kind: "if" }, (block) => { + if (block.then) f(block.then) + if (block.else) f(block.else) + }) + .with({ kind: "repeat" }, (block) => { + f(block.repeat) + }) + .with({ kind: "repeat_until" }, (block) => { + f(block.repeat) + }) + .with({ kind: "for" }, (block) => { + f(block.repeat) + }) + .with({ kind: "error" }, (block) => f(block.program)) + .with({ kind: "read" }, () => {}) + .with({ kind: "include" }, () => {}) + .with({ kind: undefined }, () => {}) + .exhaustive() + match(block) + .with({ parser: { pdl: P._ } }, (block) => { + f(block.parser.pdl) + }) + .otherwise(() => {}) + if (block.fallback) { + f(block.fallback) + } +} diff --git a/pdl-live-react/src/svg.d.ts b/pdl-live-react/src/svg.d.ts new file mode 100644 index 00000000..7ac8a322 --- /dev/null +++ b/pdl-live-react/src/svg.d.ts @@ -0,0 +1,5 @@ +declare module "*.svg?react" { + import React from "react" + const SVG: React.VFC> + export default SVG +} diff --git a/pdl-live-react/src/title.ts b/pdl-live-react/src/title.ts new file mode 100644 index 00000000..6bfd877c --- /dev/null +++ b/pdl-live-react/src/title.ts @@ -0,0 +1,16 @@ +import { useEffect } from "react" +import { useLocation } from "react-router-dom" + +function capitalize(s: string) { + return s[0].toUpperCase() + s.slice(1) +} + +export default function useDynamicTitle() { + const { pathname } = useLocation() + + useEffect(() => { + document.title = + "PDL Live - " + + capitalize(decodeURIComponent(pathname.replace(/^\/(demos\/)?/, ""))) + }, [pathname]) +} diff --git a/pdl-live-react/src/view/Code.tsx b/pdl-live-react/src/view/Code.tsx new file mode 100644 index 00000000..e068d33c --- /dev/null +++ b/pdl-live-react/src/view/Code.tsx @@ -0,0 +1,71 @@ +import { stringify } from "yaml" +import { match, P } from "ts-pattern" + +import { type PdlBlock } from "../pdl_ast" +import { map_block_children } from "../pdl_ast_utils" + +import Preview, { type SupportedLanguage } from "./Preview" + +type Props = { + block: PdlBlock + darkMode: boolean + language?: SupportedLanguage + showLineNumbers?: boolean + limitHeight?: boolean + raw?: boolean +} + +export default function Code({ + block, + darkMode, + language = "yaml", + showLineNumbers = false, + limitHeight = true, + raw = false, +}: Props) { + return ( + + ) +} + +function block_code_cleanup(data: string | PdlBlock): string | PdlBlock { + if ( + data === null || + typeof data === "boolean" || + typeof data === "number" || + typeof data === "string" + ) { + return data + } + // remove result + const new_data = { ...data, result: undefined } + // remove trace + match(new_data).with({ trace: P._ }, (data) => { + data.trace = undefined + }) + // remove contribute: ["result", context] + if ( + new_data?.contribute?.includes("result") && + new_data?.contribute?.includes("context") + ) { + new_data.contribute = undefined + } + // remove empty defs list + if (Object.keys(data?.defs ?? {}).length === 0) { + new_data.defs = undefined + } + // remove location info + new_data.location = undefined + // recursive cleanup + return map_block_children(block_code_cleanup, new_data) +} diff --git a/pdl-live-react/src/view/CopyToClipboard.tsx b/pdl-live-react/src/view/CopyToClipboard.tsx new file mode 100644 index 00000000..6a6c1150 --- /dev/null +++ b/pdl-live-react/src/view/CopyToClipboard.tsx @@ -0,0 +1,14 @@ +import { useCallback } from "react" +import { ClipboardCopy } from "@patternfly/react-core" + +export default function CopyToClipboard(props: { children: string }) { + const copy = useCallback( + () => navigator.clipboard.writeText(props.children), + [props.children], + ) + return ( + + Copy + + ) +} diff --git a/pdl-live-react/src/view/Markdown.css b/pdl-live-react/src/view/Markdown.css new file mode 100644 index 00000000..010c020b --- /dev/null +++ b/pdl-live-react/src/view/Markdown.css @@ -0,0 +1,4 @@ +.pf-v6-c-panel__main > .pdl-markdown { + padding: 1em; + background-color: var(--pf-t--global--background--color--primary--default); +} diff --git a/pdl-live-react/src/view/Markdown.tsx b/pdl-live-react/src/view/Markdown.tsx new file mode 100644 index 00000000..e95e0502 --- /dev/null +++ b/pdl-live-react/src/view/Markdown.tsx @@ -0,0 +1,13 @@ +import { Content } from "@patternfly/react-core" +import RMD, { type Options as MarkdownProps } from "react-markdown" + +import "./Markdown.css" + +/** Simple wrapper over */ +export default function Markdown(props: MarkdownProps) { + return ( + + + + ) +} diff --git a/pdl-live-react/src/view/Preview.css b/pdl-live-react/src/view/Preview.css new file mode 100644 index 00000000..7ea7d7d8 --- /dev/null +++ b/pdl-live-react/src/view/Preview.css @@ -0,0 +1,11 @@ +.pdl-preview { + &[data-limit-height="true"] { + max-height: 350px; + overflow: auto; + } + pre { + margin: 0 !important; + font-size: 1em !important; + font-family: "Red Hat Mono" !important; + } +} diff --git a/pdl-live-react/src/view/Preview.tsx b/pdl-live-react/src/view/Preview.tsx new file mode 100644 index 00000000..cc8c918d --- /dev/null +++ b/pdl-live-react/src/view/Preview.tsx @@ -0,0 +1,53 @@ +import { useEffect, type PropsWithChildren } from "react" + +import { PrismAsyncLight as SyntaxHighlighter } from "react-syntax-highlighter" +import { + oneLight as light, + vscDarkPlus as dark, +} from "react-syntax-highlighter/dist/esm/styles/prism" +import yaml from "react-syntax-highlighter/dist/esm/languages/prism/yaml" +import json from "react-syntax-highlighter/dist/esm/languages/prism/json" +import python from "react-syntax-highlighter/dist/esm/languages/prism/python" + +/** + * This is TypeScript that says SupportedLanguage is the type union of + * all possible enum values of Language (which is an enum). + */ +export type SupportedLanguage = "yaml" | "json" | "python" | "plaintext" + +import "./Preview.css" + +type Props = { + value: string + darkMode?: boolean + language?: SupportedLanguage + showLineNumbers?: boolean + limitHeight?: boolean +} + +export default function Preview({ + language, + value, + darkMode, + showLineNumbers, + limitHeight, +}: PropsWithChildren) { + useEffect(() => { + SyntaxHighlighter.registerLanguage("json", json) + SyntaxHighlighter.registerLanguage("yaml", yaml) + SyntaxHighlighter.registerLanguage("python", python) + }, []) + + // other options we could enable: isCopyEnabled isDownloadEnabled isLanguageLabelVisible + return ( +
+ + {value} + +
+ ) +} diff --git a/pdl-live-react/src/view/transcript/Array.tsx b/pdl-live-react/src/view/transcript/Array.tsx new file mode 100644 index 00000000..f0f5c022 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Array.tsx @@ -0,0 +1,24 @@ +import show_block from "./Block" + +import Context, { withIter } from "../../Context" +import { type PdlBlock } from "../../pdl_ast" + +type Props = { + array: PdlBlock[] + ctx: Context +} + +export default function show_array({ array, ctx }: Props) { + return ( + <> +
{"["}
+ {array.flatMap((block, idx) => + [ +
{show_block(block, withIter(ctx, idx))}
, + idx < array.length - 1 &&
,
, + ].filter(Boolean), + )} +
{"]"}
+ + ) +} diff --git a/pdl-live-react/src/view/transcript/Block.css b/pdl-live-react/src/view/transcript/Block.css new file mode 100644 index 00000000..48499554 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Block.css @@ -0,0 +1,77 @@ +/* The color palette https://www.patternfly.org/design-foundations/colors#color-families */ + +.pdl-transcript .pdl_block { + --pdl-block-color-1: #fff4cc; + --pdl-block-color-2: #ffe072; + + &.pdl_model { + --pdl-block-color-1: #e0f0ff; + --pdl-block-color-2: var(--pf-t--global--color--nonstatus--blue--default); + } +} + +.pdl-transcript .pdl_block { + &.pdl_string { + background-color: var( + --pf-t--global--background--color--secondary--default + ); + } + + &.pdl_empty { + background-color: var( + --pf-t--global--icon--color--status--warning--default + ); + } + + &.pdl_text { + white-space: normal; + background-color: transparent; + } + + &.pdl_lastOf { + background-color: var( + --pf-t--global--background--color--secondary--default + ); + } + + &.pdl_object { + background-color: var( + --pf-t--global--border--color--nonstatus--purple--default + ); + } + + &.pdl_array { + background-color: var( + --pf-t--global--border--color--nonstatus--purple--clicked + ); + } + + /*.pdl_if, +.pdl_code, +.pdl_repeat_until, +.pdl_repeat, +.pdl_for { + background-color: var(--pf-t--global--background--color--secondary--default); +}*/ + + &.pdl_api { + background-color: var( + --pf-t--global--border--color--nonstatus--green--default + ); + } + + &.pdl_get { + background-color: var(--pf-t--global--color--nonstatus--blue--default); + } + + &.pdl_include { + background-color: var( + --pf-t--global--border--color--nonstatus--teal--clicked + ); + } + + &.pdl_error { + --pdl-block-color-1: #fce3e3; + --pdl-block-color-2: var(--pf-t--global--color--nonstatus--red--default); + } +} diff --git a/pdl-live-react/src/view/transcript/Block.tsx b/pdl-live-react/src/view/transcript/Block.tsx new file mode 100644 index 00000000..2a5e8b86 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Block.tsx @@ -0,0 +1,260 @@ +import { match } from "ts-pattern" +import { stringify } from "yaml" + +import { type ReactNode } from "react" +import { type DescriptionListProps } from "@patternfly/react-core" + +import ArrayUI from "./Array" +import Defs from "./Defs" +import Function from "./Function" +import LastOf from "./LastOf" +import ObjectUI from "./Object" +import Output from "./Output" +import Query from "./Query" +import Result from "./Result" +import ResultOrCode from "./ResultOrCode" +import Text from "./Text" +import TranscriptItem from "./TranscriptItem" + +import show_loop_trace from "./LoopTrace" +import show_block_conjoin from "./BlocksConjoin" + +import Context, { withParent } from "../../Context" + +import { isPdlBlock, type PdlBlock } from "../../helpers" + +import "./Block.css" + +/** + * Render one tree of blocks rooted at `data` as a list of + * `TranscriptItem`. + */ +export default function show_block( + data: PdlBlock, + ctx: Context, +): ReactNode | ReactNode[] { + if ( + data === null || + typeof data === "boolean" || + typeof data === "number" || + typeof data === "string" + ) { + if (typeof data === "string" && data.trim().length === 0) { + // Don't bother showing empty strings in the UI + return + } + return + } + + const { + C: extraClasses, + B: bodyContent, + P: prefixContent, + S: suffixContent, + } = match(data) + .returnType<{ + C: string[] + B?: ReactNode + P?: ReactNode + S?: ReactNode + D?: DescriptionListProps["columnModifier"] + }>() + .with({ kind: "model" }, (data) => ({ + C: ["pdl_model"], + B: ( + <> + {typeof data.model === "string" && ( + + )} + {data.input && } + + + ), + })) + .with({ kind: "code" }, (data) => ({ + C: ["pdl_code"], + B: , + })) + .with({ kind: "get" }, (data) => ({ + C: ["pdl_get"], + B: , + })) + .with({ kind: "data" }, (data) => ({ + C: ["pdl_data"], + B: ( + + ), + })) + .with({ kind: "if" }, (data) => ({ + C: ["pdl_if"], + B: ( + <> + + {data.if_result !== undefined && ( + + )} + + ), + S: + data.if_result === undefined ? ( + + ) : data.if_result ? ( + show_block_conjoin(data?.then ?? "", ctx) + ) : ( + show_block_conjoin(data?.else ?? "", ctx) + ), + })) + .with({ kind: "read" }, (data) => ({ + C: ["pdl_read"], + B: ( + <> + {data.message && ( + + )} + + + ), + })) + .with({ kind: "include" }, (data) => ({ + C: ["pdl_include"], + B: data.trace ? ( + show_block(data.trace, ctx) + ) : ( + + ), + })) + .with({ kind: "function" }, (data) => ({ + C: ["pdl_function"], + B: , + })) + // const args = document.createElement('pre'); + // args.innerHTML = htmlize(stringify({function: data.function})); + // body.appendChild(args); + // body.appendChild(show_blocks(data.return)); + .with({ kind: "call" }, (data) => ({ + C: ["pdl_call"], + B: data.trace ? ( + show_block(data.trace, ctx) + ) : ( + // const args = document.createElement('pre'); + // args.innerHTML = htmlize(stringify({call: data.call, args: data.args})); + // body.appendChild(args); + + ), + })) + .with({ kind: "text" }, (data) => ({ + C: ["pdl_text"], + B: data.text && , + })) + .with({ kind: "lastOf" }, (data) => ({ + C: ["pdl_lastOf"], + S: LastOf({ blocks: data.lastOf, ctx: withParent(ctx, data.kind) }), + })) + .with({ kind: "array" }, (data) => ({ + C: ["pdl_array"], + B: , + })) + .with({ kind: "object" }, (data) => ({ + C: ["pdl_object"], + B: + data.object instanceof Array ? ( + + ) : ( + + ), + })) + .with({ kind: "message" }, (data) => ({ + C: ["pdl_message"], + B: ( + <> +
{data.role + ": "}
+ {show_block(data.content, ctx)} + + ), + })) + .with({ kind: "repeat" }, (data) => ({ + C: ["pdl_repeat"], + P: show_loop_trace( + data?.trace ?? [data.repeat], + withParent(ctx, data.kind), + data.join, + ), + })) + .with({ kind: "repeat_until" }, (data) => ({ + C: ["pdl_repeat_until"], + S: show_loop_trace( + data?.trace ?? [data.repeat], + withParent(ctx, data.kind), + data.join, + ), + })) + .with({ kind: "for" }, (data) => ({ + C: ["pdl_for"], + P: show_loop_trace( + data?.trace ?? [data.repeat], + withParent(ctx, data.kind), + data.join, + ), + })) + .with({ kind: "empty" }, () => ({ C: ["pdl_empty"], B: "☐" })) + .with({ kind: "error" }, (data) => ({ + C: ["pdl_error"], + B: ( + + ), + })) + .with({ kind: undefined }, () => ({ + C: ["pdl_error"], + B: ( +
+          Missing kind: 
{JSON.stringify(data, undefined, 2)}
+
+ ), + })) + .exhaustive() + + return [ + prefixContent, + data.defs && Object.keys(data.defs).length > 0 && ( + + ), + bodyContent && + TranscriptItem({ + className: ["pdl_block", ...extraClasses].join(" "), + ctx, + block: data, + children: bodyContent, + }), + suffixContent, + ] + .filter(Boolean) + .flat() +} diff --git a/pdl-live-react/src/view/transcript/Blocks.tsx b/pdl-live-react/src/view/transcript/Blocks.tsx new file mode 100644 index 00000000..070eb662 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Blocks.tsx @@ -0,0 +1,15 @@ +import { type ReactElement } from "react" + +import show_block_conjoin from "./BlocksConjoin" + +import Context, { withIter } from "../../Context" +import { isPdlBlock, type PdlBlock } from "../../helpers" + +export default function show_blocks( + blocks: (ReactElement | PdlBlock)[], + ctx: Context, +) { + return blocks.flatMap((block, idx) => + !isPdlBlock(block) ? block : show_block_conjoin(block, withIter(ctx, idx)), + ) +} diff --git a/pdl-live-react/src/view/transcript/BlocksConjoin.tsx b/pdl-live-react/src/view/transcript/BlocksConjoin.tsx new file mode 100644 index 00000000..fffca2de --- /dev/null +++ b/pdl-live-react/src/view/transcript/BlocksConjoin.tsx @@ -0,0 +1,56 @@ +import show_block from "./Block" +import Context, { withId } from "../../Context" + +import { + isLLMBlock, + isTextBlockWithArrayContent, + type PdlBlock, +} from "../../helpers" + +export default function show_block_conjoin(block: PdlBlock, ctx: Context) { + if (isTextBlockWithArrayContent(block)) { + const { text: _text, result: _result, ...rest } = block + return [ + show_block(Object.assign(rest, { text: null }), withId(ctx, "rest")), + ...conjoinModelInput(block.text).flatMap((block, idx) => + show_block(block, withId(ctx, idx)), + ), + ].filter(Boolean) + } else { + return [show_block(block, ctx)] + } +} + +/** + * For any BamModelBlock (i.e. LLM interactions) without an `input` + * field that are preceded by a text element, and treat that as the + * input to the LLM. + */ +function conjoinModelInput(blocks: PdlBlock[]): PdlBlock[] { + return blocks + .flatMap((block, idx, A) => { + const next = A[idx + 1] + const prev = A[idx - 1] + if ( + idx < A.length - 1 && + typeof block === "string" && + isLLMBlock(next) && + !next.input + ) { + // Smash the prior 'text' element into this 'model' element's 'input' attribute + return Object.assign({}, A[idx + 1], { input: block }) + } else if ( + idx > 0 && + isLLMBlock(block) && + !block.input && + typeof prev === "string" + ) { + // Then we have already smashed this into the next block as the model.input attribute + return null + } else { + // Unchanged + return block + } + }, []) + .filter(Boolean) +} diff --git a/pdl-live-react/src/view/transcript/BreadcrumbBar.css b/pdl-live-react/src/view/transcript/BreadcrumbBar.css new file mode 100644 index 00000000..f37972ae --- /dev/null +++ b/pdl-live-react/src/view/transcript/BreadcrumbBar.css @@ -0,0 +1,100 @@ +.pf-v6-theme-dark .pdl-breadcrumb-bar li a { + color: var(--pf-t--global--background--color--primary--default); +} + +.pdl-breadcrumb-bar { + list-style: none; + display: inline-block; + font-size: 0.75em; + + li { + float: left; + a { + color: inherit; + display: block; + background: var(--pdl-block-color-1); + text-decoration: none; + position: relative; + height: calc(40px * 0.6875); + line-height: calc(40px * 0.6875); + padding: 0 calc(10px * 0.6875) 0 calc(5px * 0.6875); + text-align: center; + margin-right: calc(23px * 0.6875); + } + &:last-child { + a { + background-color: var(--pdl-block-color-2); + + &:before { + border-color: var(--pdl-block-color-2); + border-left-color: transparent; + } + &:after { + border-left-color: var(--pdl-block-color-2); + } + } + } + &:first-child { + a { + padding-left: calc(15px * 0.6875); + @include border-radius(calc(4px * 0.6875) 0 0 calc(4px * 0.6875)); + &:before { + border: none; + } + } + } + &:last-child { + a { + padding-right: calc(15px * 0.6875); + @include border-radius(calc(4px * 0.6875) 0 0 calc(4px * 0.6875)); + &:after { + border: none; + } + } + } + + a { + &:before, + &:after { + content: ""; + position: absolute; + top: 0; + border: 0 solid var(--pdl-block-color-1); + border-width: calc(20px * 0.6875) calc(10px * 0.6875); + width: 0; + height: 0; + } + &:before { + left: calc(-15px * 0.6875); + border-left-color: transparent; + } + &:after { + left: 100%; + border-color: transparent; + border-left-color: var(--pdl-block-color-1); + } + /* &:hover{ + background-color: #e9f7df; + + &:before{ + border-color:#e9f7df; + border-left-color:transparent; + } + &:after{ + border-left-color:#e9f7df; + } + } + &:active{ + background-color: #afdc8f; + + &:before{ + border-color:#afdc8f; + border-left-color:transparent; + } + &:after{ + border-left-color:#afdc8f; + } + }*/ + } + } +} diff --git a/pdl-live-react/src/view/transcript/BreadcrumbBar.tsx b/pdl-live-react/src/view/transcript/BreadcrumbBar.tsx new file mode 100644 index 00000000..6d5fd4a3 --- /dev/null +++ b/pdl-live-react/src/view/transcript/BreadcrumbBar.tsx @@ -0,0 +1,20 @@ +import "./BreadcrumbBar.css" + +import { type BreadcrumbBarItemComponent } from "./BreadcrumbBarItem" + +type Props = { + children: BreadcrumbBarItemComponent | BreadcrumbBarItemComponent[] +} + +/** Inspiration: https://codepen.io/renaudtertrais/pen/nMGWqm */ +export default function BreadcrumbBar(props: Props) { + return ( +
    + {props.children} +
+ ) +} diff --git a/pdl-live-react/src/view/transcript/BreadcrumbBarItem.tsx b/pdl-live-react/src/view/transcript/BreadcrumbBarItem.tsx new file mode 100644 index 00000000..7082bfb4 --- /dev/null +++ b/pdl-live-react/src/view/transcript/BreadcrumbBarItem.tsx @@ -0,0 +1,20 @@ +import type { ReactElement, ReactNode, JSXElementConstructor } from "react" + +type Props = { + children: ReactNode +} + +export type BreadcrumbBarItemComponent = ReactElement< + Props, + JSXElementConstructor +> + +export default function BreadcrumbBarItem(props: Props) { + return ( +
  • + + {props.children} + +
  • + ) +} diff --git a/pdl-live-react/src/view/transcript/CodeGroup.tsx b/pdl-live-react/src/view/transcript/CodeGroup.tsx new file mode 100644 index 00000000..39ebad08 --- /dev/null +++ b/pdl-live-react/src/view/transcript/CodeGroup.tsx @@ -0,0 +1,28 @@ +import { + DescriptionListTerm, + DescriptionListGroup, + DescriptionListDescription, +} from "@patternfly/react-core" + +import Code from "../Code" + +import type Context from "../../Context" +import { type SupportedLanguage } from "../Preview" + +type Props = { + code: string + ctx: Context + lang?: SupportedLanguage + term?: string +} + +export default function CodeGroup({ code, ctx, lang, term = "Code" }: Props) { + return ( + + {term} + + + + + ) +} diff --git a/pdl-live-react/src/view/transcript/Def.tsx b/pdl-live-react/src/view/transcript/Def.tsx new file mode 100644 index 00000000..97a036b4 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Def.tsx @@ -0,0 +1,16 @@ +import { Label } from "@patternfly/react-core" + +type Props = { children: string; asStatus?: boolean } + +/** One variable definition */ +export default function Def({ children, asStatus = true }: Props) { + return ( + + ) +} diff --git a/pdl-live-react/src/view/transcript/Defs.tsx b/pdl-live-react/src/view/transcript/Defs.tsx new file mode 100644 index 00000000..1ff7073d --- /dev/null +++ b/pdl-live-react/src/view/transcript/Defs.tsx @@ -0,0 +1,65 @@ +import { Flex } from "@patternfly/react-core" + +import Code from "../Code" +import Def from "./Def" +import Value from "./Value" +import show_block from "./Block" + +import type Context from "../../Context" +import type { PdlBlock } from "../../pdl_ast" + +import { hasParser, hasResult, isPdlBlock } from "../../helpers" + +type Props = { defs: { [k: string]: PdlBlock }; ctx: Context } + +const inlineFlex = { default: "inlineFlex" as const } + +/** A set of variable definitions */ +export default function Defs({ defs, ctx }: Props) { + const entries = Object.entries(defs) + return ( + entries.length > 0 && ( + + {entries.map(([key, value]) => ( + { + evt.stopPropagation() + ctx.setDrawerContent({ + header: "Variable definition", + description: {key}, + body: ( +
    + {hasResult(value) && isPdlBlock(value.result) ? ( + hasParser(value) && + (value.parser === "yaml" || + value.parser === "json" || + value.parser === "jsonl") ? ( + + ) : typeof value.result === "string" ? ( + {value.result} + ) : ( + show_block(value.result, ctx) + ) + ) : ( + show_block(value, ctx) + )} +
    + ), + }) + }} + > + {key} +
    + ))} +
    + ) + ) +} diff --git a/pdl-live-react/src/view/transcript/FinalResult.css b/pdl-live-react/src/view/transcript/FinalResult.css new file mode 100644 index 00000000..e69de29b diff --git a/pdl-live-react/src/view/transcript/FinalResult.tsx b/pdl-live-react/src/view/transcript/FinalResult.tsx new file mode 100644 index 00000000..f6842746 --- /dev/null +++ b/pdl-live-react/src/view/transcript/FinalResult.tsx @@ -0,0 +1,67 @@ +import { stringify } from "yaml" +import { Hint, HintBody, HintTitle } from "@patternfly/react-core" + +import Code from "../Code" +import Markdown from "../Markdown" +import CopyToClipboard from "../CopyToClipboard" + +import { hasScalarResult } from "../../helpers" + +import "./FinalResult.css" + +type Props = { + ctx: import("../../Context").default + block: import("../../helpers").PdlBlockWithResult +} + +/** The final result of a program */ +export default function FinalResult(props: Props) { + const { clipboard, element } = content(props) + + return ( + {clipboard}} + > + Final Result + {element} + + ) +} + +/** + * @return The content UI `element` and `clipboard` content text for clipboard copying + */ +function content({ block, ctx }: Props): { + clipboard: string + element: import("react").ReactNode +} { + if (hasScalarResult(block)) { + return { + clipboard: String(block.result), + element: ( + + {String(block.result)} + + ), + } + } else { + const content = + typeof block.result === "object" + ? stringify(block.result) + : String(block.result) + return { + clipboard: content, + element: ( + + ), + } + } +} diff --git a/pdl-live-react/src/view/transcript/Function.tsx b/pdl-live-react/src/view/transcript/Function.tsx new file mode 100644 index 00000000..16c0aa54 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Function.tsx @@ -0,0 +1,19 @@ +import { stringify } from "yaml" + +import Query from "./Query" +import CodeGroup from "./CodeGroup" + +type Props = { + f: import("../../pdl_ast").FunctionBlock + ctx: import("../../Context").default +} + +export default function Function({ f, ctx }: Props) { + return ( + <> + {f.def && } + + + + ) +} diff --git a/pdl-live-react/src/view/transcript/Icon.tsx b/pdl-live-react/src/view/transcript/Icon.tsx new file mode 100644 index 00000000..febe950e --- /dev/null +++ b/pdl-live-react/src/view/transcript/Icon.tsx @@ -0,0 +1,31 @@ +import DataIcon from "@patternfly/react-icons/dist/esm/icons/table-icon" +import CodeIcon from "@patternfly/react-icons/dist/esm/icons/code-icon" +import ErrorIcon from "@patternfly/react-icons/dist/esm/icons/error-circle-o-icon" +import RobotIcon from "@patternfly/react-icons/dist/esm/icons/robot-icon" +import RepeatIcon from "@patternfly/react-icons/dist/esm/icons/redo-icon" +import KeyboardIcon from "@patternfly/react-icons/dist/esm/icons/keyboard-icon" +import ConditionalIcon from "@patternfly/react-icons/dist/esm/icons/share-alt-icon" + +/** Icon to represent the given kind */ +export default function IconForKind({ kind }: { kind?: string }) { + switch (kind) { + case "model": + return + case "code": + return + case "read": + return + case "for": + case "repeat": + case "repeat_until": + return + case "if": + return + case "data": + return + case "error": + return + default: + return undefined + } +} diff --git a/pdl-live-react/src/view/transcript/InfoPopover.css b/pdl-live-react/src/view/transcript/InfoPopover.css new file mode 100644 index 00000000..d0ccc737 --- /dev/null +++ b/pdl-live-react/src/view/transcript/InfoPopover.css @@ -0,0 +1,3 @@ +.pdl-info-popover-button:not(:hover) { + color: var(--pf-t--global--icon--color--subtle); +} diff --git a/pdl-live-react/src/view/transcript/InfoPopover.tsx b/pdl-live-react/src/view/transcript/InfoPopover.tsx new file mode 100644 index 00000000..fd2c271c --- /dev/null +++ b/pdl-live-react/src/view/transcript/InfoPopover.tsx @@ -0,0 +1,46 @@ +import { useCallback, type MouseEvent } from "react" + +import Code from "../Code" +import type Context from "../../Context" +import PrettyKind from "./PrettyKind" + +import InfoIcon from "@patternfly/react-icons/dist/esm/icons/info-circle-icon" + +import "./InfoPopover.css" + +type Props = { + ctx: Context + block: Exclude< + import("../../pdl_ast").PdlBlock, + null | string | boolean | number + > +} + +//const paddingTop = { paddingTop: "1em" } + +export default function InfoPopover({ block, ctx }: Props) { + const { setDrawerContent, darkMode } = ctx + const onClick = useCallback( + (evt: MouseEvent) => { + evt.stopPropagation() + setDrawerContent({ + header: "Trace Snippet", + description: , + body: , + }) + }, + [setDrawerContent, block, darkMode], + ) + + return ( + typeof block === "object" && ( +
    + +
    + ) + ) +} diff --git a/pdl-live-react/src/view/transcript/LastOf.tsx b/pdl-live-react/src/view/transcript/LastOf.tsx new file mode 100644 index 00000000..e0033c18 --- /dev/null +++ b/pdl-live-react/src/view/transcript/LastOf.tsx @@ -0,0 +1,14 @@ +import show_block from "./Block" + +import type Context from "../../Context" +import { withId } from "../../Context" +import { type PdlBlock } from "../../pdl_ast" + +type Props = { + blocks: PdlBlock[] + ctx: Context +} + +export default function LastOf({ blocks, ctx }: Props) { + return blocks.flatMap((block, idx) => show_block(block, withId(ctx, idx))) +} diff --git a/pdl-live-react/src/view/transcript/LoopTrace.tsx b/pdl-live-react/src/view/transcript/LoopTrace.tsx new file mode 100644 index 00000000..e7cf2f9c --- /dev/null +++ b/pdl-live-react/src/view/transcript/LoopTrace.tsx @@ -0,0 +1,26 @@ +import { match, P } from "ts-pattern" + +import ArrayUI from "./Array" +import LastOf from "./LastOf" +import Text from "./Text" + +import show_blocks from "./Blocks" + +import type Context from "../../Context" +import type { Join, PdlBlock } from "../../pdl_ast" + +export default function show_loop_trace( + trace: PdlBlock[], + ctx: Context, + join_config?: Join, +) { + return match(join_config) + .with(P.nullish, () => ) + .with({ as: P.union("text", P.nullish) }, (cfg) => ( + + )) + .with({ as: "array" }, () => ) + .with({ as: "lastOf" }, () => LastOf({ blocks: trace, ctx })) + .with({ with: P._ }, () => show_blocks(trace, ctx)) + .exhaustive() +} diff --git a/pdl-live-react/src/view/transcript/Object.tsx b/pdl-live-react/src/view/transcript/Object.tsx new file mode 100644 index 00000000..fdfd0e00 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Object.tsx @@ -0,0 +1,24 @@ +import show_block from "./Block" +import type Context from "../../Context" +import { type PdlBlock } from "../../pdl_ast" + +type Props = { + ctx: Context + object: { [key: string]: PdlBlock } +} + +export default function show_object({ object, ctx }: Props) { + return ( + <> +
    {"{"}
    + {Object.keys(object).forEach((key) => ( + <> +
    {key + ":"}
    + {show_block(object[key], ctx)} +
    ,
    + + ))} +
    {"}"}
    + + ) +} diff --git a/pdl-live-react/src/view/transcript/Output.tsx b/pdl-live-react/src/view/transcript/Output.tsx new file mode 100644 index 00000000..c7edae27 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Output.tsx @@ -0,0 +1,28 @@ +import { match, P } from "ts-pattern" + +import Markdown from "../Markdown" +import { isMarkdownish, type PdlBlock } from "../../helpers" + +export default function Output({ data }: { data: PdlBlock }) { + return match(data) + .with( + P.string, + (output) => + output.trim().length > 0 && + (!isMarkdownish(output) ? ( + {output.trim()} + ) : ( + {output} + )), + ) + .with(P.union(P.number, P.boolean, P.nullish), (output) => String(output)) + .with({ contribute: P.union([], ["context"]) }, () => { + //div.classList.add('pdl_show_result_false'); // @nickm TODO + return "☐" + }) + .with({ result: P.string }, (data) => {data.result}) + .with({ result: P._ }, (data) => ( +
    {JSON.stringify(data.result, undefined, 2)}
    + )) + .otherwise(() => "☐") +} diff --git a/pdl-live-react/src/view/transcript/PrettyKind.tsx b/pdl-live-react/src/view/transcript/PrettyKind.tsx new file mode 100644 index 00000000..c4b1b3c8 --- /dev/null +++ b/pdl-live-react/src/view/transcript/PrettyKind.tsx @@ -0,0 +1,101 @@ +import QAV from "./QAV" +import { hasScalarResult, firstLineOf } from "../../helpers" + +/** Pretty print a kind field of a PdlBlock */ +export default function PrettyKind({ + block, + isCompact = false, +}: { + isCompact?: boolean + block: Exclude< + import("../../pdl_ast").PdlBlock, + null | string | number | boolean + > +}) { + const { kind } = block + if (!kind) { + return "Unknown" + } + + switch (kind) { + case "model": + return ( + <> + {!isCompact && + typeof block.input === "string" && + block.input.length > 0 && ( + <> + {block.input} + + )} + {hasScalarResult(block) && {block.result}} + + ) + case "function": + return ( + <> + Define{" "} + {block.def ? ( + + {" "} + + {block.def}( + {block.function && + Object.entries(block.function) + .map(([arg, type]) => `${arg}: ${type}`) + .join(", ")} + ) + + + ) : ( + <> + )} + + ) + case "call": + return ( + <> + Call{" "} + {typeof block.call !== "string" ? ( + "a function" + ) : ( + + + {block.call.replace(/^\$\{\s*([^\s}]+)\s*\}$/, "$1")} + + ( + {block.args && + Object.values(block.args) + .map((a) => `"${a}"`) + .join(", ")} + ) + + )} + + ) + case "error": + return `${firstLineOf(block.msg)}` + case "code": + return <>{hasScalarResult(block) && {block.result}} + case "read": + return ( + <> + {block.message ?? "Prompt user for input"} + {hasScalarResult(block) && {block.result}} + + ) + case "if": + return typeof block.if === "string" ? ( + <> + {block.if} is{" "} + {block.if_result === true ? "true" : "false"} + + ) : ( + <> + ) + case "data": + return "Formulate structure from prior outputs" + default: + return <> + } +} diff --git a/pdl-live-react/src/view/transcript/QAV.css b/pdl-live-react/src/view/transcript/QAV.css new file mode 100644 index 00000000..34f6b8df --- /dev/null +++ b/pdl-live-react/src/view/transcript/QAV.css @@ -0,0 +1,10 @@ +.pdl-qav { + display: flex; + align-items: center; +} + +.pdl-qav-label { + font-weight: bold; + font-size: 0.75em; + padding-right: 0.5em; +} diff --git a/pdl-live-react/src/view/transcript/QAV.tsx b/pdl-live-react/src/view/transcript/QAV.tsx new file mode 100644 index 00000000..e44aab2c --- /dev/null +++ b/pdl-live-react/src/view/transcript/QAV.tsx @@ -0,0 +1,34 @@ +import { isValidElement } from "react" +import { Tooltip, Truncate } from "@patternfly/react-core" + +import { firstLineOf } from "../../helpers" + +import "./QAV.css" + +type Props = { + q: "Q" | "A" | "V" + children: import("react").ReactNode +} + +/** Render the Q: A: V: UI */ +export default function QAV({ q, children }: Props) { + const tip = + q === "Q" + ? "Question posed" + : q === "A" + ? "The result" + : "Result is assigned to this variable" + + return ( +
    + + {q} + {" "} + {isValidElement(children) ? ( + children + ) : ( + + )} +
    + ) +} diff --git a/pdl-live-react/src/view/transcript/Query.tsx b/pdl-live-react/src/view/transcript/Query.tsx new file mode 100644 index 00000000..71875703 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Query.tsx @@ -0,0 +1,27 @@ +import { + DescriptionListTerm, + DescriptionListGroup, + DescriptionListDescription, +} from "@patternfly/react-core" + +import show_block from "./Block" +import type Context from "../../Context" +import { type PdlBlock } from "../../pdl_ast" + +type Props = { + q: PdlBlock + ctx: Context + prompt?: string + className?: string +} + +export default function query({ q, ctx, prompt = "Query", className }: Props) { + return ( + + {prompt} + + {show_block(q, ctx)} + + + ) +} diff --git a/pdl-live-react/src/view/transcript/Result.tsx b/pdl-live-react/src/view/transcript/Result.tsx new file mode 100644 index 00000000..18c9e205 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Result.tsx @@ -0,0 +1,43 @@ +import { + DescriptionListTerm, + DescriptionListGroup, + DescriptionListDescription, + Panel, + PanelMain, +} from "@patternfly/react-core" + +import Code from "../Code" +import Value from "./Value" + +import type Context from "../../Context" +import { type SupportedLanguage } from "../Preview" + +type Props = { + result: number | string | unknown + ctx: Context + lang?: SupportedLanguage + term?: string +} + +export default function Result({ result, ctx, lang, term = "Result" }: Props) { + const isCode = lang && result + + return ( + <> + + {term} + + + + {isCode ? ( + + ) : ( + {result} + )} + + + + + + ) +} diff --git a/pdl-live-react/src/view/transcript/ResultOrCode.tsx b/pdl-live-react/src/view/transcript/ResultOrCode.tsx new file mode 100644 index 00000000..5415e950 --- /dev/null +++ b/pdl-live-react/src/view/transcript/ResultOrCode.tsx @@ -0,0 +1,30 @@ +import { match, P } from "ts-pattern" + +import Code from "../Code" +import CodeGroup from "./CodeGroup" +import Result from "./Result" +import Value from "./Value" + +import type Context from "../../Context" +import { type PdlBlock } from "../../pdl_ast" + +type Props = { + block: PdlBlock + ctx: Context + term?: string +} + +export default function ResultOrCode({ block, ctx, term }: Props) { + return match(block) + .with(P.union(P.string, P.number), (data) => {data}) + .with({ lang: "python", code: P.string, result: P._ }, (data) => ( + <> + + + + )) + .with({ result: P._ }, (data) => ( + + )) + .otherwise((data) => ) +} diff --git a/pdl-live-react/src/view/transcript/Text.tsx b/pdl-live-react/src/view/transcript/Text.tsx new file mode 100644 index 00000000..a64b6c35 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Text.tsx @@ -0,0 +1,26 @@ +import show_block from "./Block" +import { withIter } from "../../Context" +import type Context from "../../Context" +import { type PdlBlock } from "../../pdl_ast" + +type Props = { + className?: string + blocks: PdlBlock[] | PdlBlock + ctx: Context + join_str?: string +} + +export default function Text({ className, blocks, ctx, join_str }: Props) { + if (Array.isArray(blocks)) { + return ( +
    + {blocks.flatMap((block, idx) => [ + join_str &&
    {join_str}
    , +
    {show_block(block, withIter(ctx, idx))}
    , + ])} +
    + ) + } else { + return show_block(blocks, ctx) + } +} diff --git a/pdl-live-react/src/view/transcript/Transcript.tsx b/pdl-live-react/src/view/transcript/Transcript.tsx new file mode 100644 index 00000000..c1e09960 --- /dev/null +++ b/pdl-live-react/src/view/transcript/Transcript.tsx @@ -0,0 +1,81 @@ +import { + isValidElement, + useContext, + useMemo, + useState, + type MouseEvent, +} from "react" + +import { Accordion, AccordionItem } from "@patternfly/react-core" + +import Context from "../../Context" +import DrawerContext from "../../DrawerContentContext" +import DarkModeContext from "../../DarkModeContext" + +import { hasResult } from "../../helpers" +import show_block_conjoin from "./BlocksConjoin" +import FinalResult from "./FinalResult" + +type Props = { + data: import("../../pdl_ast").PdlBlock +} + +export default function Transcript({ data }: Props) { + // DarkMode state + const darkMode = useContext(DarkModeContext) + + // Accordion state + const [expanded, setExpanded] = useState([]) + + // DrawerContent updater + const setDrawerContent = useContext(DrawerContext) + + const ctx = useMemo(() => { + return { + id: "root", + darkMode, + toggleAccordion: (evt: MouseEvent) => { + const id = evt.currentTarget.id + + const index = expanded.indexOf(id) + const newExpanded: string[] = + index >= 0 + ? [ + ...expanded.slice(0, index), + ...expanded.slice(index + 1, expanded.length), + ] + : [...expanded, id] + setExpanded(newExpanded) + }, + setDrawerContent, + parents: [], + } + }, [darkMode, expanded, setDrawerContent]) + + return ( + + {show_block_conjoin(data, ctx) + .flat() + .filter(Boolean) + .concat(hasResult(data) ? [] : []) + .map((block, idx) => + isValidElement(block) && "data-id" in block.props ? ( + + {block} + + ) : ( +
    + {block} +
    + ), + )} +
    + ) +} diff --git a/pdl-live-react/src/view/transcript/TranscriptItem.tsx b/pdl-live-react/src/view/transcript/TranscriptItem.tsx new file mode 100644 index 00000000..e10deb49 --- /dev/null +++ b/pdl-live-react/src/view/transcript/TranscriptItem.tsx @@ -0,0 +1,83 @@ +import { type PropsWithChildren } from "react" +import { + AccordionContent, + AccordionToggle, + DescriptionList, + Flex, + FlexItem, + Stack, + StackItem, +} from "@patternfly/react-core" + +import Defs from "./Defs" +import Icon from "./Icon" +import QAV from "./QAV" +import type Context from "../../Context" +import PrettyKind from "./PrettyKind" +import InfoPopover from "./InfoPopover" +import BreadcrumbBar from "./BreadcrumbBar" +import BreadcrumbBarItem from "./BreadcrumbBarItem" + +import { hasResult, type NonScalarPdlBlock } from "../../helpers" + +type Props = PropsWithChildren<{ + className?: string + ctx: Context + block: NonScalarPdlBlock +}> + +const flex_1 = { default: "flex_1" as const } +const alignCenter = { default: "alignItemsCenter" as const } + +function capitalizeAndUnSnakeCase(s: string) { + return s[0].toUpperCase() + s.slice(1).replace(/[-_]/, " ") +} + +/** One item in the Transcript UI */ +export default function TranscriptItem(props: Props) { + const icon = Icon({ kind: props.block.kind }) + + return ( +
    + + + {icon && {icon}} + + + + {[...props.ctx.parents, props.block.kind ?? "unknown"].map( + (parent, idx) => ( + + {capitalizeAndUnSnakeCase(parent)} + + ), + )} + + + + + + + + + {props.block.def && hasResult(props.block) && ( + + + + )} + + + + + + + + + {props.children} + +
    + ) +} diff --git a/pdl-live-react/src/view/transcript/Value.tsx b/pdl-live-react/src/view/transcript/Value.tsx new file mode 100644 index 00000000..2cdb0f9d --- /dev/null +++ b/pdl-live-react/src/view/transcript/Value.tsx @@ -0,0 +1,22 @@ +import Markdown from "../Markdown" +import { isMarkdownish } from "../../helpers" + +type Props = { children: number | string | unknown } + +export default function Value({ children: s }: Props) { + return ( + <> + {typeof s === "number" ? ( + s + ) : typeof s === "string" ? ( + isMarkdownish(s) ? ( + {s} + ) : ( +
    {s.trim()}
    + ) + ) : ( + JSON.stringify(s, undefined, 2) + )} + + ) +} diff --git a/pdl-live-react/src/vite-env.d.ts b/pdl-live-react/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/pdl-live-react/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/pdl-live-react/tests/basics.spec.test.ts b/pdl-live-react/tests/basics.spec.test.ts new file mode 100644 index 00000000..37c2a6fa --- /dev/null +++ b/pdl-live-react/tests/basics.spec.test.ts @@ -0,0 +1,8 @@ +import { test, expect } from "@playwright/test" + +test("has title", async ({ page }) => { + await page.goto("http://localhost:5173") + + // Expect a title "to contain" a substring. + await expect(page).toHaveTitle(/Viewer/) +}) diff --git a/pdl-live-react/tsconfig.app.json b/pdl-live-react/tsconfig.app.json new file mode 100644 index 00000000..358ca9ba --- /dev/null +++ b/pdl-live-react/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/pdl-live-react/tsconfig.json b/pdl-live-react/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/pdl-live-react/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/pdl-live-react/tsconfig.node.json b/pdl-live-react/tsconfig.node.json new file mode 100644 index 00000000..db0becc8 --- /dev/null +++ b/pdl-live-react/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/pdl-live-react/vite.config.ts b/pdl-live-react/vite.config.ts new file mode 100644 index 00000000..2d8e1e97 --- /dev/null +++ b/pdl-live-react/vite.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'vite' +import checker from "vite-plugin-checker" +import react from '@vitejs/plugin-react' +import svgr from "vite-plugin-svgr"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + react(), + svgr(), + checker({ + // e.g. use TypeScript check + typescript: true, + }), + ], +}) diff --git a/pdl-live-react/yarn.lock b/pdl-live-react/yarn.lock new file mode 100644 index 00000000..39e77155 --- /dev/null +++ b/pdl-live-react/yarn.lock @@ -0,0 +1,3053 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@apidevtools/json-schema-ref-parser@^11.5.5": + version "11.7.3" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.3.tgz#83ce7bd236fa5ea50f01a122054592df05890998" + integrity sha512-WApSdLdXEBb/1FUPca2lteASewEfpjEYJ8oXZP+0gExK5qSfsEKBKcA+WjY6Q4wvXwyv0+W6Kvc372pSceib9w== + dependencies: + "@jsdevtools/ono" "^7.1.3" + "@types/json-schema" "^7.0.15" + js-yaml "^4.1.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/compat-data@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" + integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== + +"@babel/core@^7.21.3", "@babel/core@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.26.0", "@babel/generator@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" + integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== + dependencies: + "@babel/parser" "^7.26.5" + "@babel/types" "^7.26.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.25.9": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== + dependencies: + "@babel/compat-data" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-plugin-utils@^7.25.9": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" + integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== + dependencies: + "@babel/types" "^7.26.5" + +"@babel/plugin-transform-react-jsx-self@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" + integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-react-jsx-source@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" + integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/runtime@^7.3.1": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" + integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.5" + "@babel/parser" "^7.26.5" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.5" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" + integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@esbuild/aix-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" + integrity sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== + +"@esbuild/android-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" + integrity sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== + +"@esbuild/android-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" + integrity sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== + +"@esbuild/android-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" + integrity sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== + +"@esbuild/darwin-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" + integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== + +"@esbuild/darwin-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" + integrity sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== + +"@esbuild/freebsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" + integrity sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== + +"@esbuild/freebsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" + integrity sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== + +"@esbuild/linux-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" + integrity sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== + +"@esbuild/linux-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" + integrity sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== + +"@esbuild/linux-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" + integrity sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== + +"@esbuild/linux-loong64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" + integrity sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== + +"@esbuild/linux-mips64el@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" + integrity sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== + +"@esbuild/linux-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" + integrity sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== + +"@esbuild/linux-riscv64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" + integrity sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== + +"@esbuild/linux-s390x@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" + integrity sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== + +"@esbuild/linux-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" + integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== + +"@esbuild/netbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz#65f19161432bafb3981f5f20a7ff45abb2e708e6" + integrity sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== + +"@esbuild/netbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" + integrity sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== + +"@esbuild/openbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" + integrity sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== + +"@esbuild/openbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" + integrity sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== + +"@esbuild/sunos-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" + integrity sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== + +"@esbuild/win32-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" + integrity sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== + +"@esbuild/win32-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" + integrity sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== + +"@esbuild/win32-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" + integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.19.0": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" + integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== + dependencies: + "@eslint/object-schema" "^2.1.5" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/core@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.10.0.tgz#23727063c21b335f752dbb3a16450f6f9cbc9091" + integrity sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" + integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.18.0", "@eslint/js@^9.17.0": + version "9.18.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.18.0.tgz#3356f85d18ed3627ab107790b53caf7e1e3d1e84" + integrity sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA== + +"@eslint/object-schema@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" + integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== + +"@eslint/plugin-kit@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz#ee07372035539e7847ef834e3f5e7b79f09e3a81" + integrity sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A== + dependencies: + "@eslint/core" "^0.10.0" + levn "^0.4.1" + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" + integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jsdevtools/ono@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" + integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@patternfly/react-core@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@patternfly/react-core/-/react-core-6.1.0.tgz#58d35b523c019a33f03b652b065d11cf60921734" + integrity sha512-zj0lJPZxQanXKD8ae2kYnweT0kpp1CzpHYAkaBjTrw2k6ZMfr/UPlp0/ugCjWEokBqh79RUADLkKJJPce/yoSQ== + dependencies: + "@patternfly/react-icons" "^6.1.0" + "@patternfly/react-styles" "^6.1.0" + "@patternfly/react-tokens" "^6.1.0" + focus-trap "7.6.2" + react-dropzone "^14.3.5" + tslib "^2.8.1" + +"@patternfly/react-icons@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@patternfly/react-icons/-/react-icons-6.1.0.tgz#4f982f2b8dc0b9366acca1170fcd52fa8c16b85f" + integrity sha512-V1w/j19YmOgvh72IRRf1p07k+u4M5+9P+o/IxunlF0fWzLDX4Hf+utBI11A8cRfUzpQN7eLw/vZIS3BLM8Ge3Q== + +"@patternfly/react-styles@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@patternfly/react-styles/-/react-styles-6.1.0.tgz#e8aa12c6b1417ba1a739ea435bc02f7f8d516132" + integrity sha512-JQ3zIl5SFiSB0YWVYibcUwgZdsp6Wn8hkfZ7KhtCjHFccSDdJexPOXVV1O9f2h4PfxTlY3YntZ81ZsguBx/Q7A== + +"@patternfly/react-tokens@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-6.1.0.tgz#c2a64e68568bde81e56f4b5a8f9ac3ad8cd06e8a" + integrity sha512-t1UcHbOa4txczTR5UlnG4XcAAdnDSfSlCaOddw/HTqRF59pn2ks2JUu9sfnFRZ8SiAAxKRiYdX5bT7Mf4R24+w== + +"@playwright/test@^1.49.1": + version "1.49.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.49.1.tgz#55fa360658b3187bfb6371e2f8a64f50ef80c827" + integrity sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g== + dependencies: + playwright "1.49.1" + +"@rollup/pluginutils@^5.1.3": + version "5.1.4" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" + integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^4.0.2" + +"@rollup/rollup-android-arm-eabi@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz#14c737dc19603a096568044eadaa60395eefb809" + integrity sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q== + +"@rollup/rollup-android-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz#9d81ea54fc5650eb4ebbc0a7d84cee331bfa30ad" + integrity sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w== + +"@rollup/rollup-darwin-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz#29448cb1370cf678b50743d2e392be18470abc23" + integrity sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q== + +"@rollup/rollup-darwin-x64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz#0ca99741c3ed096700557a43bb03359450c7857d" + integrity sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA== + +"@rollup/rollup-freebsd-arm64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz#233f8e4c2f54ad9b719cd9645887dcbd12b38003" + integrity sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ== + +"@rollup/rollup-freebsd-x64@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz#dfba762a023063dc901610722995286df4a48360" + integrity sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw== + +"@rollup/rollup-linux-arm-gnueabihf@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz#b9da54171726266c5ef4237f462a85b3c3cf6ac9" + integrity sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg== + +"@rollup/rollup-linux-arm-musleabihf@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz#b9db69b3f85f5529eb992936d8f411ee6d04297b" + integrity sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug== + +"@rollup/rollup-linux-arm64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz#2550cf9bb4d47d917fd1ab4af756d7bbc3ee1528" + integrity sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw== + +"@rollup/rollup-linux-arm64-musl@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz#9d06b26d286c7dded6336961a2f83e48330e0c80" + integrity sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA== + +"@rollup/rollup-linux-loongarch64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz#e957bb8fee0c8021329a34ca8dfa825826ee0e2e" + integrity sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz#e8585075ddfb389222c5aada39ea62d6d2511ccc" + integrity sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw== + +"@rollup/rollup-linux-riscv64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz#7d0d40cee7946ccaa5a4e19a35c6925444696a9e" + integrity sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw== + +"@rollup/rollup-linux-s390x-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz#c2dcd8a4b08b2f2778eceb7a5a5dfde6240ebdea" + integrity sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA== + +"@rollup/rollup-linux-x64-gnu@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz#183637d91456877cb83d0a0315eb4788573aa588" + integrity sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg== + +"@rollup/rollup-linux-x64-musl@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz#036a4c860662519f1f9453807547fd2a11d5bb01" + integrity sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow== + +"@rollup/rollup-win32-arm64-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz#51cad812456e616bfe4db5238fb9c7497e042a52" + integrity sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw== + +"@rollup/rollup-win32-ia32-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz#661c8b3e4cd60f51deaa39d153aac4566e748e5e" + integrity sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw== + +"@rollup/rollup-win32-x64-msvc@4.30.1": + version "4.30.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz#73bf1885ff052b82fbb0f82f8671f73c36e9137c" + integrity sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og== + +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" + integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== + +"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" + integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== + +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" + integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== + +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" + integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== + +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" + integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== + +"@svgr/babel-plugin-transform-svg-component@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" + integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== + +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" + "@svgr/babel-plugin-transform-svg-component" "8.0.0" + +"@svgr/core@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + camelcase "^6.2.0" + cosmiconfig "^8.1.3" + snake-case "^3.0.4" + +"@svgr/hast-util-to-babel-ast@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" + integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== + dependencies: + "@babel/types" "^7.21.3" + entities "^4.4.0" + +"@svgr/plugin-jsx@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + "@svgr/hast-util-to-babel-ast" "8.0.0" + svg-parser "^2.0.4" + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/hast@^2.0.0": + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== + dependencies: + "@types/unist" "^2" + +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/lodash@^4.17.7": + version "4.17.14" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.14.tgz#bafc053533f4cdc5fcc9635af46a963c1f3deaff" + integrity sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A== + +"@types/mdast@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== + dependencies: + "@types/unist" "*" + +"@types/ms@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + +"@types/node@22.10.5": + version "22.10.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" + integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== + dependencies: + undici-types "~6.20.0" + +"@types/prop-types@*": + version "15.7.14" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" + integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== + +"@types/react-dom@^18.3.5": + version "18.3.5" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.5.tgz#45f9f87398c5dcea085b715c58ddcf1faf65f716" + integrity sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q== + +"@types/react-syntax-highlighter@^15.5.13": + version "15.5.13" + resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz#c5baf62a3219b3bf28d39cfea55d0a49a263d1f2" + integrity sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.3.18": + version "18.3.18" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.18.tgz#9b382c4cd32e13e463f97df07c2ee3bbcd26904b" + integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/unist@^2", "@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + +"@typescript-eslint/eslint-plugin@8.20.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.20.0.tgz#b47a398e0e551cb008c60190b804394e6852c863" + integrity sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.20.0" + "@typescript-eslint/type-utils" "8.20.0" + "@typescript-eslint/utils" "8.20.0" + "@typescript-eslint/visitor-keys" "8.20.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^2.0.0" + +"@typescript-eslint/parser@8.20.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.20.0.tgz#5caf2230a37094dc0e671cf836b96dd39b587ced" + integrity sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g== + dependencies: + "@typescript-eslint/scope-manager" "8.20.0" + "@typescript-eslint/types" "8.20.0" + "@typescript-eslint/typescript-estree" "8.20.0" + "@typescript-eslint/visitor-keys" "8.20.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.20.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.20.0.tgz#aaf4198b509fb87a6527c02cfbfaf8901179e75c" + integrity sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw== + dependencies: + "@typescript-eslint/types" "8.20.0" + "@typescript-eslint/visitor-keys" "8.20.0" + +"@typescript-eslint/type-utils@8.20.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.20.0.tgz#958171d86b213a3f32b5b16b91db267968a4ef19" + integrity sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA== + dependencies: + "@typescript-eslint/typescript-estree" "8.20.0" + "@typescript-eslint/utils" "8.20.0" + debug "^4.3.4" + ts-api-utils "^2.0.0" + +"@typescript-eslint/types@8.20.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.20.0.tgz#487de5314b5415dee075e95568b87a75a3e730cf" + integrity sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA== + +"@typescript-eslint/typescript-estree@8.20.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.20.0.tgz#658cea07b7e5981f19bce5cf1662cb70ad59f26b" + integrity sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA== + dependencies: + "@typescript-eslint/types" "8.20.0" + "@typescript-eslint/visitor-keys" "8.20.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.0.0" + +"@typescript-eslint/utils@8.20.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.20.0.tgz#53127ecd314b3b08836b4498b71cdb86f4ef3aa2" + integrity sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.20.0" + "@typescript-eslint/types" "8.20.0" + "@typescript-eslint/typescript-estree" "8.20.0" + +"@typescript-eslint/visitor-keys@8.20.0": + version "8.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.20.0.tgz#2df6e24bc69084b81f06aaaa48d198b10d382bed" + integrity sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA== + dependencies: + "@typescript-eslint/types" "8.20.0" + eslint-visitor-keys "^4.2.0" + +"@ungap/structured-clone@^1.0.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" + integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== + +"@vitejs/plugin-react@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz#c64be10b54c4640135a5b28a2432330e88ad7c20" + integrity sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug== + dependencies: + "@babel/core" "^7.26.0" + "@babel/plugin-transform-react-jsx-self" "^7.25.9" + "@babel/plugin-transform-react-jsx-source" "^7.25.9" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.2" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +attr-accept@^2.2.4: + version "2.2.5" + resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.5.tgz#d7061d958e6d4f97bf8665c68b75851a0713ab5e" + integrity sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ== + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== + dependencies: + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001688: + version "1.0.30001692" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz#4585729d95e6b95be5b439da6ab55250cd125bf9" + integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@^4.0.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + +chokidar@^3.5.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concurrently@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.1.2.tgz#22d9109296961eaee773e12bfb1ce9a66bc9836c" + integrity sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ== + dependencies: + chalk "^4.1.2" + lodash "^4.17.21" + rxjs "^7.8.1" + shell-quote "^1.8.1" + supports-color "^8.1.1" + tree-kill "^1.2.2" + yargs "^17.7.2" + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + +cosmiconfig@^8.1.3: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +electron-to-chromium@^1.5.73: + version "1.5.83" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz#3f74078f0c83e24bf7e692eaa855a998d1bec34f" + integrity sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +esbuild@^0.24.2: + version "0.24.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" + integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.24.2" + "@esbuild/android-arm" "0.24.2" + "@esbuild/android-arm64" "0.24.2" + "@esbuild/android-x64" "0.24.2" + "@esbuild/darwin-arm64" "0.24.2" + "@esbuild/darwin-x64" "0.24.2" + "@esbuild/freebsd-arm64" "0.24.2" + "@esbuild/freebsd-x64" "0.24.2" + "@esbuild/linux-arm" "0.24.2" + "@esbuild/linux-arm64" "0.24.2" + "@esbuild/linux-ia32" "0.24.2" + "@esbuild/linux-loong64" "0.24.2" + "@esbuild/linux-mips64el" "0.24.2" + "@esbuild/linux-ppc64" "0.24.2" + "@esbuild/linux-riscv64" "0.24.2" + "@esbuild/linux-s390x" "0.24.2" + "@esbuild/linux-x64" "0.24.2" + "@esbuild/netbsd-arm64" "0.24.2" + "@esbuild/netbsd-x64" "0.24.2" + "@esbuild/openbsd-arm64" "0.24.2" + "@esbuild/openbsd-x64" "0.24.2" + "@esbuild/sunos-x64" "0.24.2" + "@esbuild/win32-arm64" "0.24.2" + "@esbuild/win32-ia32" "0.24.2" + "@esbuild/win32-x64" "0.24.2" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-react-hooks@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz#3d34e37d5770866c34b87d5b499f5f0b53bf0854" + integrity sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw== + +eslint-plugin-react-refresh@^0.4.16: + version "0.4.18" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.18.tgz#d2ae6dc8d48c87f7722f5304385b0cd8b3a32a54" + integrity sha512-IRGEoFn3OKalm3hjfolEWGqoF/jPqeEYFp+C8B0WMzwGwBMvlRDQd06kghDhF0C61uJ6WfSDhEZE/sAQjduKgw== + +eslint-scope@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" + integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^9.17.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.18.0.tgz#c95b24de1183e865de19f607fda6518b54827850" + integrity sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.0" + "@eslint/core" "^0.10.0" + "@eslint/eslintrc" "^3.2.0" + "@eslint/js" "9.18.0" + "@eslint/plugin-kit" "^0.2.5" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.1" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.2.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.7, fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" + integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== + dependencies: + reusify "^1.0.4" + +fault@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + +fdir@^6.4.2: + version "6.4.3" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +file-selector@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-2.1.2.tgz#fe7c7ee9e550952dfbc863d73b14dc740d7de8b4" + integrity sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig== + dependencies: + tslib "^2.7.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== + +focus-trap@7.6.2: + version "7.6.2" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.6.2.tgz#a501988821ca23d0150a7229eb7a20a3695bdf0e" + integrity sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w== + dependencies: + tabbable "^6.2.0" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +fs-extra@^11.1.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fsevents@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^15.14.0: + version "15.14.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.14.0.tgz#b8fd3a8941ff3b4d38f3319d433b61bbb482e73f" + integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig== + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz#6d11b027473e69adeaa00ca4cfb5bb68e3d282fa" + integrity sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +highlight.js@^10.4.1, highlight.js@~10.7.0: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +highlightjs-vue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz#fdfe97fbea6354e70ee44e3a955875e114db086d" + integrity sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA== + +html-url-attributes@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.1.tgz#83b052cd5e437071b756cd74ae70f708870c2d87" + integrity sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ== + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inline-style-parser@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz#f4af5fe72e612839fcd453d989a586566d695f22" + integrity sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-to-typescript@^15.0.3: + version "15.0.4" + resolved "https://registry.yarnpkg.com/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz#a530c7f17312503b262ae12233749732171840f3" + integrity sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ== + dependencies: + "@apidevtools/json-schema-ref-parser" "^11.5.5" + "@types/json-schema" "^7.0.15" + "@types/lodash" "^4.17.7" + is-glob "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + minimist "^1.2.8" + prettier "^3.2.5" + tinyglobby "^0.2.9" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowlight@^1.17.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" + integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== + dependencies: + fault "^1.0.0" + highlight.js "~10.7.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +mdast-util-from-markdown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" + integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + 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" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096" + integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz#fd04c67a2a7499efb905a8a5c578dddc9fdada0d" + integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" + integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +mdast-util-to-markdown@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b" + integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.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.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromark-core-commonmark@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz#6a45bbb139e126b3f8b361a10711ccc7c6e15e93" + integrity sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.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.0.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.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== + +micromark-util-html-tag-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz#70ffb99a454bd8c913c8b709c3dc97baefb65f96" + integrity sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg== + dependencies: + devlop "^1.0.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: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== + +micromark-util-types@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" + integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== + +micromark@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.1.tgz#294c2f12364759e5f9e925a767ae3dfde72223ff" + integrity sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + 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.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +minimatch@^3.0.4, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +monaco-editor@^0.52.2: + version "0.52.2" + resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.52.2.tgz#53c75a6fcc6802684e99fd1b2700299857002205" + integrity sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.8: + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-entities@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== + dependencies: + "@types/unist" "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +playwright-core@1.49.1: + version "1.49.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.49.1.tgz#32c62f046e950f586ff9e35ed490a424f2248015" + integrity sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg== + +playwright@1.49.1: + version "1.49.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.49.1.tgz#830266dbca3008022afa7b4783565db9944ded7c" + integrity sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA== + dependencies: + playwright-core "1.49.1" + optionalDependencies: + fsevents "2.3.2" + +postcss@^8.4.49: + version "8.5.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" + integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.2.5, prettier@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== + +prismjs@^1.27.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +prismjs@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" + integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +property-information@^6.0.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-dropzone@^14.3.5: + version "14.3.5" + resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-14.3.5.tgz#1a8bd312c8a353ec78ef402842ccb3589c225add" + integrity sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ== + dependencies: + attr-accept "^2.2.4" + file-selector "^2.1.0" + prop-types "^15.8.1" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-markdown@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-9.0.3.tgz#c12bf60dad05e9bf650b86bcc612d80636e8456e" + integrity sha512-Yk7Z94dbgYTOrdk41Z74GoKA7rThnsbbqBTRYuxoe08qvfQ9tJVhmAKw6BJS/ZORG7kTy/s1QvYzSuaoBA1qfw== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.0.0" + hast-util-to-jsx-runtime "^2.0.0" + html-url-attributes "^3.0.0" + mdast-util-to-hast "^13.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + +react-router-dom@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.1.2.tgz#ff6ddeb6b119b1bbea69a7f3a309c414f69693ad" + integrity sha512-kE7JdrDfeWO/2d6RPucLmqp2UL8Isv1VWtI5MQyYNA99KtncqxWDL6550+0rH4fboJKJbXRcyjRnIRT/gkxTcA== + dependencies: + react-router "7.1.2" + +react-router@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.1.2.tgz#61bf043b7fc839f2cfc80e64ed7ca9072526bfd2" + integrity sha512-KeallSO30KLpIe/ZZqfk6pCJ1c+5JhMxl3SCS3Zx1LgaGuQbgLDmjuNi6KZ5LnAV9sWjbmBWGRw8Um/Pw6BExg== + dependencies: + "@types/cookie" "^0.6.0" + cookie "^1.0.1" + set-cookie-parser "^2.6.0" + turbo-stream "2.4.0" + +react-syntax-highlighter@^15.6.1: + version "15.6.1" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz#fa567cb0a9f96be7bbccf2c13a3c4b5657d9543e" + integrity sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.4.1" + highlightjs-vue "^1.0.0" + lowlight "^1.17.0" + prismjs "^1.27.0" + refractor "^3.6.0" + +react@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +refractor@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" + integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== + dependencies: + hastscript "^6.0.0" + parse-entities "^2.0.0" + prismjs "~1.27.0" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.1.tgz#f864dd2947889a11997c0a2667cd6b38f685bca7" + integrity sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rollup@^4.23.0: + version "4.30.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.30.1.tgz#d5c3d066055259366cdc3eb6f1d051c5d6afaf74" + integrity sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.30.1" + "@rollup/rollup-android-arm64" "4.30.1" + "@rollup/rollup-darwin-arm64" "4.30.1" + "@rollup/rollup-darwin-x64" "4.30.1" + "@rollup/rollup-freebsd-arm64" "4.30.1" + "@rollup/rollup-freebsd-x64" "4.30.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.30.1" + "@rollup/rollup-linux-arm-musleabihf" "4.30.1" + "@rollup/rollup-linux-arm64-gnu" "4.30.1" + "@rollup/rollup-linux-arm64-musl" "4.30.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.30.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.30.1" + "@rollup/rollup-linux-riscv64-gnu" "4.30.1" + "@rollup/rollup-linux-s390x-gnu" "4.30.1" + "@rollup/rollup-linux-x64-gnu" "4.30.1" + "@rollup/rollup-linux-x64-musl" "4.30.1" + "@rollup/rollup-win32-arm64-msvc" "4.30.1" + "@rollup/rollup-win32-ia32-msvc" "4.30.1" + "@rollup/rollup-win32-x64-msvc" "4.30.1" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4, semver@^7.6.0: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +set-cookie-parser@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" + integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-to-object@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.8.tgz#67a29bca47eaa587db18118d68f9d95955e81292" + integrity sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g== + dependencies: + inline-style-parser "0.2.4" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +tabbable@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + +tiny-invariant@^1.1.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + +tinyglobby@^0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" + integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + dependencies: + fdir "^6.4.2" + picomatch "^4.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +ts-api-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900" + integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ== + +ts-pattern@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/ts-pattern/-/ts-pattern-5.6.0.tgz#831516bbb9041499c5525e8976d8fc6b68ac8bb9" + integrity sha512-SL8u60X5+LoEy9tmQHWCdPc2hhb2pKI6I1tU5Jue3v8+iRqZdcT3mWPwKKJy1fMfky6uha82c8ByHAE8PMhKHw== + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.7.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +turbo-stream@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/turbo-stream/-/turbo-stream-2.4.0.tgz#1e4fca6725e90fa14ac4adb782f2d3759a5695f0" + integrity sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typescript-eslint@^8.18.2: + version "8.20.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.20.0.tgz#76d4ea6a483fd49830a7e8baccaed10f76d1e57b" + integrity sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA== + dependencies: + "@typescript-eslint/eslint-plugin" "8.20.0" + "@typescript-eslint/parser" "8.20.0" + "@typescript-eslint/utils" "8.20.0" + +typescript@~5.6.2: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +unified@^11.0.0: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +update-browserslist-db@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== + dependencies: + "@types/unist" "^3.0.0" + vfile-message "^4.0.0" + +vite-plugin-checker@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.8.0.tgz#33419857a623b35c9483e4f603d4ca8b6984acde" + integrity sha512-UA5uzOGm97UvZRTdZHiQVYFnd86AVn8EVaD4L3PoVzxH+IZSfaAw14WGFwX9QS23UW3lV/5bVKZn6l0w+q9P0g== + dependencies: + "@babel/code-frame" "^7.12.13" + ansi-escapes "^4.3.0" + chalk "^4.1.1" + chokidar "^3.5.1" + commander "^8.0.0" + fast-glob "^3.2.7" + fs-extra "^11.1.0" + npm-run-path "^4.0.1" + strip-ansi "^6.0.0" + tiny-invariant "^1.1.0" + vscode-languageclient "^7.0.0" + vscode-languageserver "^7.0.0" + vscode-languageserver-textdocument "^1.0.1" + vscode-uri "^3.0.2" + +vite-plugin-svgr@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz#742f16f11375996306c696ec323e4d23f6005075" + integrity sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w== + dependencies: + "@rollup/pluginutils" "^5.1.3" + "@svgr/core" "^8.1.0" + "@svgr/plugin-jsx" "^8.1.0" + +vite@^6.0.5: + version "6.0.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.7.tgz#f0f8c120733b04af52b4a1e3e7cb54eb851a799b" + integrity sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ== + dependencies: + esbuild "^0.24.2" + postcss "^8.4.49" + rollup "^4.23.0" + optionalDependencies: + fsevents "~2.3.3" + +vscode-jsonrpc@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz#108bdb09b4400705176b957ceca9e0880e9b6d4e" + integrity sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg== + +vscode-languageclient@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz#b505c22c21ffcf96e167799757fca07a6bad0fb2" + integrity sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg== + dependencies: + minimatch "^3.0.4" + semver "^7.3.4" + vscode-languageserver-protocol "3.16.0" + +vscode-languageserver-protocol@3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz#34135b61a9091db972188a07d337406a3cdbe821" + integrity sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A== + dependencies: + vscode-jsonrpc "6.0.0" + vscode-languageserver-types "3.16.0" + +vscode-languageserver-textdocument@^1.0.1: + version "1.0.12" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" + integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== + +vscode-languageserver-types@3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247" + integrity sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA== + +vscode-languageserver@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz#49b068c87cfcca93a356969d20f5d9bdd501c6b0" + integrity sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw== + dependencies: + vscode-languageserver-protocol "3.16.0" + +vscode-uri@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==