diff --git a/.vscode/launch.json b/.vscode/launch.json index eafdeb3dea..5bb9457378 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "type": "node", "cwd": "${workspaceFolder}", "preLaunchTask": "npm: compile-cli", - "args": ["run", "packages/sample/genaisrc/summarize-import.genai.mjs", "packages/sample/src/questions.md"] + "args": ["run", "summarize", "packages/sample/src/rag/markdown.md", "--json"] }, { "name": "Run - sample", diff --git a/docs/src/content/docs/getting-started/testing-scripts.mdx b/docs/src/content/docs/getting-started/testing-scripts.mdx new file mode 100644 index 0000000000..11286c6bab --- /dev/null +++ b/docs/src/content/docs/getting-started/testing-scripts.mdx @@ -0,0 +1,51 @@ +--- +title: Testing scripts +sidebar: + order: 4.6 +--- +import providerSrc from "../../../../../packages/core/src/genaiscript-api-provider.mjs?raw" +import { Code } from '@astrojs/starlight/components'; + +It is possible to declare tests and assertions in the `script` function +to validate the output of the script. + +The tests are executed by [promptfoo](https://promptfoo.dev/). +[promptfoo](https://promptfoo.dev/) is tool for evaluating LLM output quality. + +## Declaring tests + +The tests are added as an array of objects in the `tests` key of the `script` function. + +```js title="proofreader.genai.js" +scripts({ + ..., + tests: [{ + files: "src/rag/testcode.ts", + rubrics: "is a report with a list of issues", + facts: ["The report says that the input string should be validated before use."] + }] +}) +``` + +## Running tests + +You can use the cli to run the tests for one or more scripts. + +```sh +npx genaiscript test proofreader +``` + +If `script` is not provided, all scripts with tests will be tested. + +## Viewing results + +The results of the tests can be explored through the [promptfoo web ui](https://promptfoo.dev/docs/usage/web-ui). + +```sh +npx promptfoo view +``` + +## Known limitations + +Currently, promptfoo treats the script source as the prompt text. Therefore, one cannot use assertions +that also rely on the input text, such as `answer_relevance`. diff --git a/docs/src/content/docs/guides/promptfoo.mdx b/docs/src/content/docs/guides/promptfoo.mdx deleted file mode 100644 index 650f50c1f4..0000000000 --- a/docs/src/content/docs/guides/promptfoo.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Testing with promptfoo -sidebar: - order: 20 ---- -import providerSrc from "../../../../../packages/cli/src/genaiscript-api-provider.mjs?raw" -import { Code } from '@astrojs/starlight/components'; - -[promptfoo](https://promptfoo.dev/) is a CLI and library for evaluating LLM output quality. -The guide below shows how to use genaiscript in your promptfoo configurations. - -## Configuring - -GenAIScript uses a [custom javascript](https://promptfoo.dev/docs/providers/custom-api/) -provider to integrate with promptfoo. It allows to import the GenAIScript script files (`.genai.js` files) -as prompts in the promptfoo configuration. - -- Install [promptfoo](https://www.promptfoo.dev/docs/installation) -- Save `genaiscript-api-provider.mjs` below in your project. -- Add the provider to your `genaiscript.config.yaml` file. - -```yaml -providers: - - id: ./genaiscript-api-provider.mjs - label: genaiscript:gpt35 - config: - model: gpt-3.5-turbo -``` - -- Add the script ids or file path to the `prompts` section - -```yaml -prompts: - - summarize # we have a script with id "summarize.genai.js" -``` - -### Limitations - -Currently, promptfoo treats the genaiscript javascript source as the prompt. Therefore, one cannot use assertions -that also rely on the input text, such as `answer_relevance`. - -## Configuration parameters - -The provider calls the [cli](/genaiscript/reference/cli) to run the prompt. -The configuration contains various parameters that are converted to command line arguments. - -| Parameter | Description | -|--------------------|------------------| -| `model` | The LLM model to use. | -| `temperature` | The temperature to use. | -| `top_p` | The `top p` to use. | -| `cache` | set to `false` to disable cache | -| `version` | The genaiscript version to use if you need to pin it. | - - -## Test vars - -The `var.files` can be used to pass the markdown file or files to -the genaiscript provider. It will populate the `env.files` variable in the script. - -```js -tests: - - vars: - files: ./mydocument.md -``` - -### GenAIScript provider - - - -- [GitHub source](https://github.com/microsoft/genaiscript/blob/main/packages/cli/src/genaiscript-api-provider.mjs) \ No newline at end of file diff --git a/docs/src/content/docs/reference/cli/commands.md b/docs/src/content/docs/reference/cli/commands.md index 01dd2fe2d0..80fa62aa8d 100644 --- a/docs/src/content/docs/reference/cli/commands.md +++ b/docs/src/content/docs/reference/cli/commands.md @@ -85,6 +85,29 @@ Options: -h, --help display help for command ``` +## `test` + +``` +Usage: genaiscript test [options] [script] + +Runs the tests for scripts + +Arguments: + script Script id. If not provided, all scripts are + tested + +Options: + --models [models...] models to test where mode is the key value + pair list of m (model), t (temperature), p + (top-p) + -o, --out output folder + -rmo, --remove-out remove output folder if it exists + --cli override path to the cli + -tp, --test-provider test provider + --view open test viewer once tests are executed + -h, --help display help for command +``` + ## `scripts` ``` diff --git a/packages/cli/package.json b/packages/cli/package.json index 9b70a299ca..75be124e7e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -23,10 +23,10 @@ "description": "A CLI for GenAIScript, a generative AI scripting framework.", "license": "MIT", "dependencies": { - "tree-sitter-wasms": "^0.1.11", - "web-tree-sitter": "^0.22.2", "pdfjs-dist": "4.0.379", - "typescript": "5.4.5" + "tree-sitter-wasms": "^0.1.11", + "typescript": "5.4.5", + "web-tree-sitter": "^0.22.2" }, "optionalDependencies": { "llamaindex": "0.1.21" @@ -35,6 +35,7 @@ "node": ">=20.0.0" }, "devDependencies": { + "promptfoo": "^0.55.0", "@llamaindex/env": "^0.0.5", "@types/fs-extra": "^11.0.4", "@types/node": "^20.12.7", @@ -62,7 +63,7 @@ "zx": "^8.0.2" }, "scripts": { - "compile": "esbuild src/main.ts --bundle --platform=node --target=node20 --outfile=built/genaiscript.cjs --external:pdfjs-dist --external:llamaindex --external:web-tree-sitter --external:tree-sitter-wasms && node ../../scripts/patch-cli.mjs", + "compile": "esbuild src/main.ts --bundle --platform=node --target=node20 --outfile=built/genaiscript.cjs --external:pdfjs-dist --external:llamaindex --external:web-tree-sitter --external:tree-sitter-wasms --external:promptfoo && node ../../scripts/patch-cli.mjs", "postcompile": "node built/genaiscript.cjs info help > ../../docs/src/content/docs/reference/cli/commands.md", "go": "yarn compile && node built/genaiscript.cjs", "test": "node --import tsx --test src/**.test.ts", diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 755b482234..564e1adaa1 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -34,6 +34,7 @@ import { import { compileScript, createScript, listScripts } from "./scripts" import { codeQuery } from "./codequery" import { modelInfo, systemInfo } from "./info" +import { scriptsTest } from "./test" export async function cli() { process.on("uncaughtException", (err) => { @@ -157,28 +158,51 @@ export async function cli() { ) .action(batchScript) + program + .command("test") + .description("Runs the tests for scripts") + .argument( + "[script]", + "Script id. If not provided, all scripts are tested" + ) + .action(scriptsTest) + .option( + "--models [models...]", + "models to test where mode is the key value pair list of m (model), t (temperature), p (top-p)" + ) + .option("-o, --out ", "output folder") + .option("-rmo, --remove-out", "remove output folder if it exists") + .option("--cli ", "override path to the cli") + .option("-tp, --test-provider ", "test provider") + .option("--view", "open test viewer once tests are executed") + const scripts = program - .command("scripts").alias("script") + .command("scripts") + .alias("script") .description("Utility tasks for scripts") - scripts.command("list", { isDefault: true }) + scripts + .command("list", { isDefault: true }) .description("List all available scripts in workspace") .action(listScripts) - scripts.command("create") + scripts + .command("create") .description("Create a new script") .argument("", "Name of the script") .action(createScript) - scripts.command("compile") + scripts + .command("compile") .description("Compile all script in workspace") .action(compileScript) - scripts.command("model") + scripts + .command("model") .description("Show model connection information for scripts") .argument("[script]", "Script id or file") .option("-t, --token", "show token") .action(modelInfo) - const retrieval = program - .command("retrieval").alias("retreival") + .command("retrieval") + .alias("retreival") .description("RAG support") retrieval .command("index") @@ -221,7 +245,8 @@ export async function cli() { .action(startServer) const parser = program - .command("parse").alias("parsers") + .command("parse") + .alias("parsers") .description("Parse various outputs") parser .command("fence ") @@ -259,9 +284,7 @@ export async function cli() { .argument("", "input JSONL files") .action(jsonl2json) - const info = program - .command("info") - .description("Utility tasks") + const info = program.command("info").description("Utility tasks") info.command("help") .description("Show help for all commands") .action(helpAll) diff --git a/packages/cli/src/genaiscript-api-provider.mjs b/packages/cli/src/genaiscript-api-provider.mjs deleted file mode 100644 index 89e4387d3e..0000000000 --- a/packages/cli/src/genaiscript-api-provider.mjs +++ /dev/null @@ -1,66 +0,0 @@ -import { execa } from "execa" - -// https://promptfoo.dev/docs/providers/custom-api -class GenAIScriptApiProvider { - constructor(options) { - this.config = options.config - this.providerId = - options.id || `genaiscript:${this.config.model || "default"}` - } - - id() { - return this.providerId - } - - /** - @returns interface ProviderResponse { - error?: string; - output?: string | object; - tokenUsage?: Partial<{ - total: number; - prompt: number; - completion: number; - cached?: number; - }>; - cached?: boolean; - cost?: number; // required for cost assertion - logProbs?: number[]; // required for perplexity assertion - } - */ - async callApi(prompt, context) { - const { model, temperature, top_p, cache, version } = this.config - const { vars } = context - let files = vars.files // string or string[] - if (files && !Array.isArray(files)) files = [files] // ensure array - - const command = "npx" - const package = version ? `genaiscript@${version}` : "genaiscript" - const args = ["--yes", package, "run", prompt] - if (files) args.push(...files) - if (model) args.push("--model", model) - if (temperature !== undefined) args.push("--temperature", temperature) - if (top_p !== undefined) args.push("--top_p", top_p) - if (vars.vars) args.push("--vars", vars.vars) - if (cache === false) args.push("--no-cache") - - const { stdout, exitCode, failed } = await execa(command, args, { - cleanup: true, - preferLocal: true, - stripFinalNewline: true, - }) - - // warning issued with pdfjs - const output = stdout?.replace( - "Warning: TT: undefined function: 32", - "" - ) - const error = failed ? `exit code ${exitCode}` : undefined - - return { - output, - error, - } - } -} - -export default GenAIScriptApiProvider diff --git a/packages/cli/src/run.ts b/packages/cli/src/run.ts index 52989fe1e6..8a6a106b6c 100644 --- a/packages/cli/src/run.ts +++ b/packages/cli/src/run.ts @@ -63,8 +63,8 @@ export async function runScript( } ) { const excludedFiles = options.excludedFiles - const stream = !options.json && !options.yaml && !options.out const out = options.out + const stream = !options.json && !options.yaml && !out const skipLLM = !!options.prompt const retry = parseInt(options.retry) || 8 const retryDelay = parseInt(options.retryDelay) || 15000 @@ -88,7 +88,9 @@ export async function runScript( const spinner = !stream && !isQuiet - ? createProgressSpinner("preparing tool and files") + ? createProgressSpinner( + `preparing tools in ${process.cwd()}` + ) : undefined const fail = (msg: string, exitCode: number) => { if (spinner) spinner.fail(msg) @@ -171,20 +173,20 @@ ${Array.from(files) parseVars(options.vars) ) - spinner?.start("Querying") - let tokens = 0 let res: FragmentTransformResponse try { res = await runTemplate(script, fragment, { infoCb: ({ text }) => { - if (spinner) spinner.start(text) - else logVerbose(text) + if (text) { + if (spinner) spinner.start(text) + else if (!isQuiet) logVerbose(text) + } }, partialCb: ({ responseChunk, tokensSoFar }) => { tokens = tokensSoFar - if (stream) process.stdout.write(responseChunk) - else if (spinner) spinner.report({ count: tokens }) + if (stream && responseChunk) process.stdout.write(responseChunk) + if (spinner) spinner.report({ count: tokens }) }, skipLLM, label, @@ -307,6 +309,4 @@ ${Array.from(files) logVerbose(`error annotations found, exiting with error code`) process.exit(ANNOTATION_ERROR_CODE) } - - if (!skipLLM) logVerbose(`genaiscript generated ${tokens} tokens`) } diff --git a/packages/cli/src/test.ts b/packages/cli/src/test.ts new file mode 100644 index 0000000000..3bc7184ea1 --- /dev/null +++ b/packages/cli/src/test.ts @@ -0,0 +1,90 @@ +import { generatePromptFooConfiguration } from "genaiscript-core/src/test" +import { buildProject } from "./build" +import { + GENAISCRIPT_FOLDER, + YAMLStringify, + logVerbose, + normalizeFloat, + parseKeyValuePairs, + promptFooDriver, +} from "genaiscript-core" +import { writeFile } from "fs/promises" +import { execa } from "execa" +import { join } from "node:path" +import { emptyDir, ensureDir } from "fs-extra" + +function parseModelSpec(m: string): ModelOptions { + const vals = parseKeyValuePairs(m) + if (Object.keys(vals).length) + return { + model: vals["m"], + temperature: normalizeFloat(vals["t"]), + topP: normalizeFloat(vals["p"]), + } + else return { model: m } +} + +export async function scriptsTest( + id: string, + options: { + out?: string + cli?: string + removeOut?: boolean + testProvider?: string + models?: string[] + view?: boolean + } +) { + const prj = await buildProject() + const scripts = prj.templates + .filter((t) => t.tests?.length) + .filter((t) => !id || t.id === id) + if (!scripts.length) throw new Error(`no script with tests found`) + + const cli = options.cli || __filename + const out = options.out || join(GENAISCRIPT_FOLDER, "tests") + const provider = join(out, "provider.mjs") + const testProvider = options?.testProvider + const models = options?.models + logVerbose(`writing tests to ${out}`) + + if (options?.removeOut) await emptyDir(out) + await ensureDir(out) + await writeFile(provider, promptFooDriver) + for (const script of scripts) { + const fn = out + ? join(out, `${script.id}.promptfoo.yaml`) + : script.filename.replace(/\.genai\.js$/, ".promptfoo.yaml") + logVerbose(` ${fn}`) + const config = generatePromptFooConfiguration(script, { + out, + cli, + models: models?.map(parseModelSpec), + provider: "provider.mjs", + testProvider, + }) + await writeFile(fn, YAMLStringify(config)) + } + + logVerbose(`running tests with promptfoo`) + const cmd = "npx" + const args = [ + "--yes", + `promptfoo@latest`, + "eval", + "--config", + `${out}/*.promptfoo.yaml`, + "--verbose", + ] + const exec = execa(cmd, args, { + preferLocal: true, + cleanup: true, + stripFinalNewline: true, + }) + exec.pipeStdout(process.stdout) + exec.pipeStderr(process.stdout) + const res = await exec + + if (options.view) await execa("npx", ["--yes", "promptfoo@latest", "view", "-y"]) + else process.exit(res.exitCode) +} diff --git a/packages/cli/src/version.ts b/packages/cli/src/version.ts index 7c7569a9ad..52508dee01 100644 --- a/packages/cli/src/version.ts +++ b/packages/cli/src/version.ts @@ -2,4 +2,5 @@ import packageJson from "../package.json" export const NODE_MIN_VERSION = packageJson.engines.node export const LLAMAINDEX_VERSION = packageJson.optionalDependencies.llamaindex +export const PROMPTFOO_VERSION = packageJson.devDependencies.promptfoo export const TYPESCRIPT_VERSION = packageJson.dependencies.typescript diff --git a/packages/core/bundleprompts.mjs b/packages/core/bundleprompts.mjs index bcef47ff01..6f90fdcdac 100644 --- a/packages/core/bundleprompts.mjs +++ b/packages/core/bundleprompts.mjs @@ -15,6 +15,10 @@ for (const prompt of prompts) { if (prompt.endsWith(".genai.js")) promptMap[prompt.replace(/\.genai\.js$/i, "")] = text } +const promptFooDriver = readFileSync( + "./src/genaiscript-api-provider.mjs", + "utf-8" +) const promptDefs = { ".gitattributes": "genaiscript.d.ts -diff merge=ours linguist-generated", "jsconfig.json": JSON.stringify( @@ -64,6 +68,8 @@ export const promptDefinitions = Object.freeze>(${JSON.st )}); export const treeSitterWasms: string[] = ${JSON.stringify(wasms)}; + +export const promptFooDriver = ${JSON.stringify(promptFooDriver)} \n` writeFileSync(fp, text, "utf-8") diff --git a/packages/core/src/clihelp.ts b/packages/core/src/clihelp.ts index 525365bba8..a54459f015 100644 --- a/packages/core/src/clihelp.ts +++ b/packages/core/src/clihelp.ts @@ -1,6 +1,7 @@ -import { CORE_VERSION, RunTemplateOptions } from "." +import { CORE_VERSION, RunTemplateOptions, YAMLStringify } from "." import { Fragment } from "./ast" import { NPM_CLI_PACKAGE } from "./constants" +import { generatePromptFooConfiguration } from "./test" import { MarkdownTrace } from "./trace" export function generateCliArguments( @@ -47,4 +48,23 @@ ${generateCliArguments(template, fragment, options, "run")} - The CLI uses the same secrets in the \`.env\` file. ` ) + + if (template.tests?.length) { + trace.details( + "🧪 testing", + ` +- [promptfoo](https://www.promptfoo.dev/) configuration + +\`\`\`yaml +${YAMLStringify(generatePromptFooConfiguration(template, { models: [options] }))} +\`\`\` + +- run the test command + +\`\`\`sh +npx --yes genaiscript test ${template.id} +\`\`\` +` + ) + } } diff --git a/packages/core/src/genaiscript-api-provider.mjs b/packages/core/src/genaiscript-api-provider.mjs new file mode 100644 index 0000000000..61e1282e64 --- /dev/null +++ b/packages/core/src/genaiscript-api-provider.mjs @@ -0,0 +1,69 @@ +import { promisify } from "node:util" +import { exec } from "node:child_process" + +const execAsync = promisify(exec) + +// https://promptfoo.dev/docs/providers/custom-api +class GenAIScriptApiProvider { + constructor(options) { + this.config = options.config + this.providerId = + options.id || `genaiscript:${this.config.model || "default"}` + } + + id() { + return this.providerId + } + + async callApi(prompt, context) { + const { model, temperature, top_p, cache, version, cli, quiet } = + this.config + const { vars } = context + let files = vars.files // string or string[] + if (files && !Array.isArray(files)) files = [files] // ensure array + + const args = [] + if (cli) args.push(`node`, cli) + else + args.push( + `npx`, + `--yes`, + version ? `genaiscript@${version}` : "genaiscript" + ) + + args.push("run", prompt) + if (files) args.push(...files) + args.push("--json") + if (quiet) args.push("--quiet") + if (model) args.push("--model", model) + if (temperature !== undefined) args.push("--temperature", temperature) + if (top_p !== undefined) args.push("--top_p", top_p) + if (vars.vars) args.push("--vars", vars.vars) + if (cache === false) args.push("--no-cache") + + const cmd = args + .map((a) => + typeof a === "string" && a.includes(" ") ? JSON.stringify(a) : a + ) + .join(" ") + const { stdout, error } = await execAsync(cmd) + + const outputText = stdout.slice(Math.max(0, stdout.indexOf("{"))) + let output + try { + output = JSON.parse(outputText) + } catch (e) { + output = { + text: outputText, + error: e, + } + } + + return { + output, + error, + } + } +} + +export default GenAIScriptApiProvider diff --git a/packages/core/src/promptrunner.ts b/packages/core/src/promptrunner.ts index dfc2b62e11..19dab42bed 100644 --- a/packages/core/src/promptrunner.ts +++ b/packages/core/src/promptrunner.ts @@ -716,6 +716,11 @@ ${repair} frames, genVars, } - options?.infoCb?.(res) + options?.infoCb?.({ + label: res.label, + vars: res.vars, + summary: res.summary, + text: template.id, + }) return res } diff --git a/packages/core/src/template.ts b/packages/core/src/template.ts index d23bfa3a6a..7cfb95b1bf 100644 --- a/packages/core/src/template.ts +++ b/packages/core/src/template.ts @@ -445,6 +445,7 @@ export async function parsePromptTemplate( c.checkRecord("parameters") c.checkBool("lineNumbers") + c.checkObjectArray("tests") }) const r = c.template diff --git a/packages/core/src/test.ts b/packages/core/src/test.ts new file mode 100644 index 0000000000..8f97a0fd18 --- /dev/null +++ b/packages/core/src/test.ts @@ -0,0 +1,83 @@ +import { DEFAULT_MODEL } from "./constants" +import { arrayify } from "./util" + +export function generatePromptFooConfiguration( + script: PromptScript, + options?: { + provider?: string + testProvider?: string + out?: string + cli?: string + models?: ModelOptions[] + } +) { + const { provider = "provider.mjs", testProvider } = options || {} + const { description, title, tests = [], id } = script + const models = options?.models || [] + if (!models.length) models.push(script) + const cli = options?.cli + + const res = { + description: [title, description].filter((s) => s).join("\n"), + prompts: [id], + providers: models.map(({ model, temperature, topP }) => ({ + id: provider, + label: [ + model || DEFAULT_MODEL, + temperature !== undefined ? `t=${temperature}` : undefined, + topP !== undefined ? `p=${topP}` : undefined, + ] + .filter((v) => v !== undefined) + .join(":"), + config: { + model: model || DEFAULT_MODEL, + temperature, + top_p: topP, + cli, + }, + })), + defaultTest: { + options: { + provider: testProvider + ? { + text: { + id: "azureopenai:chat:gpt-4", + config: { + apiHost: "tnrllmproxy.azurewebsites.net", + }, + }, + embedding: { + id: "azureopenai:embeddings:text-embedding-ada-002", + config: { + apiHost: "tnrllmproxy.azurewebsites.net", + }, + }, + } + : undefined, + }, + }, + tests: tests.map( + ({ description, files = [], rubrics, facts, asserts = [] }) => ({ + description, + vars: { + files, + }, + assert: [ + ...arrayify(rubrics).map((value) => ({ + type: "llm-rubric", + value, + })), + ...arrayify(facts).map((value) => ({ + type: "factuality", + value, + })), + ...arrayify(asserts).map((assert) => ({ + ...assert, + })), + ], + }) + ), + } + + return res +} diff --git a/packages/core/src/types/prompt_template.d.ts b/packages/core/src/types/prompt_template.d.ts index 6e06232b05..fe20ccd3e0 100644 --- a/packages/core/src/types/prompt_template.d.ts +++ b/packages/core/src/types/prompt_template.d.ts @@ -190,10 +190,46 @@ type PromptParameterType = type PromptParametersSchema = Record type PromptParameters = Record -interface PromptScript - extends PromptLike, - ModelOptions, - ScriptRuntimeOptions { +type PromptAssertion = + | { + /** + * output contains substring, case insensitive + **/ + type: "icontains" + value: string + } + | { + /** + * Perplexity is below a threshold + */ + type: "perplexity" + threshold: number + } + +interface PromptTest { + /** + * Description of the test. + */ + description?: string + /** + * List of files to apply the test to. + */ + files: string | string[] + /** + * LLM output matches a given rubric, using a Language Model to grade output. + */ + rubrics?: string | string[] + /** + * LLM output adheres to the given facts, using Factuality method from OpenAI evaluation. + */ + facts?: string | string[] + /** + * Additional deterministic assertions. + */ + asserts?: PromptAssertion | PromptAssertion[] +} + +interface PromptScript extends PromptLike, ModelOptions, ScriptRuntimeOptions { /** * Groups template in UI */ @@ -204,6 +240,11 @@ interface PromptScript */ parameters?: PromptParametersSchema + /** + * Tests to validate this script. + */ + tests?: PromptTest[] + /** * Don't show it to the user in lists. Template `system.*` are automatically unlisted. */ @@ -404,7 +445,7 @@ type PromptArgs = Omit type PromptSystemArgs = Omit< PromptArgs, - "model" | "temperature" | "topP" | "maxTokens" | "seed" + "model" | "temperature" | "topP" | "maxTokens" | "seed" | "tests" > type StringLike = string | LinkedFile | LinkedFile[] diff --git a/packages/core/src/util.ts b/packages/core/src/util.ts index 05433eaaad..3f083cd53e 100644 --- a/packages/core/src/util.ts +++ b/packages/core/src/util.ts @@ -17,6 +17,12 @@ export function strcmp(a: string, b: string) { else return 1 } +export function arrayify(a: T | T[]): T[] { + if (a === undefined) return [] + if (Array.isArray(a)) return a + return [a] +} + export function toArray(a: ArrayLike): T[] { if (!a) return undefined const r: T[] = new Array(a.length) diff --git a/packages/sample/genaisrc/genaiscript.d.ts b/packages/sample/genaisrc/genaiscript.d.ts index 5b3a97ec28..23edf63357 100644 --- a/packages/sample/genaisrc/genaiscript.d.ts +++ b/packages/sample/genaisrc/genaiscript.d.ts @@ -190,10 +190,42 @@ type PromptParameterType = type PromptParametersSchema = Record type PromptParameters = Record -interface PromptScript - extends PromptLike, - ModelOptions, - ScriptRuntimeOptions { +type PromptAssertion = + | { + /** + * output contains substring, case insensitive + **/ + type: "icontains" + value: string + } + | { + /** + * Perplexity is below a threshold + */ + type: "perplexity" + threshold: number + } + +interface PromptTest { + /** + * List of files to apply the test to. + */ + files: string | string[] + /** + * LLM output matches a given rubric, using a Language Model to grade output. + */ + rubrics?: string | string[] + /** + * LLM output adheres to the given facts, using Factuality method from OpenAI evaluation. + */ + facts?: string | string[] + /** + * Additional deterministic assertions. + */ + asserts?: PromptAssertion | PromptAssertion[] +} + +interface PromptScript extends PromptLike, ModelOptions, ScriptRuntimeOptions { /** * Groups template in UI */ @@ -204,6 +236,11 @@ interface PromptScript */ parameters?: PromptParametersSchema + /** + * Tests to validate this script. + */ + tests?: PromptTest[] + /** * Don't show it to the user in lists. Template `system.*` are automatically unlisted. */ @@ -404,7 +441,7 @@ type PromptArgs = Omit type PromptSystemArgs = Omit< PromptArgs, - "model" | "temperature" | "topP" | "maxTokens" | "seed" + "model" | "temperature" | "topP" | "maxTokens" | "seed" | "tests" > type StringLike = string | LinkedFile | LinkedFile[] diff --git a/packages/sample/genaisrc/node/genaiscript.d.ts b/packages/sample/genaisrc/node/genaiscript.d.ts index 5b3a97ec28..23edf63357 100644 --- a/packages/sample/genaisrc/node/genaiscript.d.ts +++ b/packages/sample/genaisrc/node/genaiscript.d.ts @@ -190,10 +190,42 @@ type PromptParameterType = type PromptParametersSchema = Record type PromptParameters = Record -interface PromptScript - extends PromptLike, - ModelOptions, - ScriptRuntimeOptions { +type PromptAssertion = + | { + /** + * output contains substring, case insensitive + **/ + type: "icontains" + value: string + } + | { + /** + * Perplexity is below a threshold + */ + type: "perplexity" + threshold: number + } + +interface PromptTest { + /** + * List of files to apply the test to. + */ + files: string | string[] + /** + * LLM output matches a given rubric, using a Language Model to grade output. + */ + rubrics?: string | string[] + /** + * LLM output adheres to the given facts, using Factuality method from OpenAI evaluation. + */ + facts?: string | string[] + /** + * Additional deterministic assertions. + */ + asserts?: PromptAssertion | PromptAssertion[] +} + +interface PromptScript extends PromptLike, ModelOptions, ScriptRuntimeOptions { /** * Groups template in UI */ @@ -204,6 +236,11 @@ interface PromptScript */ parameters?: PromptParametersSchema + /** + * Tests to validate this script. + */ + tests?: PromptTest[] + /** * Don't show it to the user in lists. Template `system.*` are automatically unlisted. */ @@ -404,7 +441,7 @@ type PromptArgs = Omit type PromptSystemArgs = Omit< PromptArgs, - "model" | "temperature" | "topP" | "maxTokens" | "seed" + "model" | "temperature" | "topP" | "maxTokens" | "seed" | "tests" > type StringLike = string | LinkedFile | LinkedFile[] diff --git a/packages/sample/genaisrc/python/genaiscript.d.ts b/packages/sample/genaisrc/python/genaiscript.d.ts index 5b3a97ec28..23edf63357 100644 --- a/packages/sample/genaisrc/python/genaiscript.d.ts +++ b/packages/sample/genaisrc/python/genaiscript.d.ts @@ -190,10 +190,42 @@ type PromptParameterType = type PromptParametersSchema = Record type PromptParameters = Record -interface PromptScript - extends PromptLike, - ModelOptions, - ScriptRuntimeOptions { +type PromptAssertion = + | { + /** + * output contains substring, case insensitive + **/ + type: "icontains" + value: string + } + | { + /** + * Perplexity is below a threshold + */ + type: "perplexity" + threshold: number + } + +interface PromptTest { + /** + * List of files to apply the test to. + */ + files: string | string[] + /** + * LLM output matches a given rubric, using a Language Model to grade output. + */ + rubrics?: string | string[] + /** + * LLM output adheres to the given facts, using Factuality method from OpenAI evaluation. + */ + facts?: string | string[] + /** + * Additional deterministic assertions. + */ + asserts?: PromptAssertion | PromptAssertion[] +} + +interface PromptScript extends PromptLike, ModelOptions, ScriptRuntimeOptions { /** * Groups template in UI */ @@ -204,6 +236,11 @@ interface PromptScript */ parameters?: PromptParametersSchema + /** + * Tests to validate this script. + */ + tests?: PromptTest[] + /** * Don't show it to the user in lists. Template `system.*` are automatically unlisted. */ @@ -404,7 +441,7 @@ type PromptArgs = Omit type PromptSystemArgs = Omit< PromptArgs, - "model" | "temperature" | "topP" | "maxTokens" | "seed" + "model" | "temperature" | "topP" | "maxTokens" | "seed" | "tests" > type StringLike = string | LinkedFile | LinkedFile[] diff --git a/packages/sample/genaisrc/style/genaiscript.d.ts b/packages/sample/genaisrc/style/genaiscript.d.ts index 5b3a97ec28..23edf63357 100644 --- a/packages/sample/genaisrc/style/genaiscript.d.ts +++ b/packages/sample/genaisrc/style/genaiscript.d.ts @@ -190,10 +190,42 @@ type PromptParameterType = type PromptParametersSchema = Record type PromptParameters = Record -interface PromptScript - extends PromptLike, - ModelOptions, - ScriptRuntimeOptions { +type PromptAssertion = + | { + /** + * output contains substring, case insensitive + **/ + type: "icontains" + value: string + } + | { + /** + * Perplexity is below a threshold + */ + type: "perplexity" + threshold: number + } + +interface PromptTest { + /** + * List of files to apply the test to. + */ + files: string | string[] + /** + * LLM output matches a given rubric, using a Language Model to grade output. + */ + rubrics?: string | string[] + /** + * LLM output adheres to the given facts, using Factuality method from OpenAI evaluation. + */ + facts?: string | string[] + /** + * Additional deterministic assertions. + */ + asserts?: PromptAssertion | PromptAssertion[] +} + +interface PromptScript extends PromptLike, ModelOptions, ScriptRuntimeOptions { /** * Groups template in UI */ @@ -204,6 +236,11 @@ interface PromptScript */ parameters?: PromptParametersSchema + /** + * Tests to validate this script. + */ + tests?: PromptTest[] + /** * Don't show it to the user in lists. Template `system.*` are automatically unlisted. */ @@ -404,7 +441,7 @@ type PromptArgs = Omit type PromptSystemArgs = Omit< PromptArgs, - "model" | "temperature" | "topP" | "maxTokens" | "seed" + "model" | "temperature" | "topP" | "maxTokens" | "seed" | "tests" > type StringLike = string | LinkedFile | LinkedFile[] diff --git a/packages/sample/genaisrc/summarize.genai.js b/packages/sample/genaisrc/summarize.genai.js index 7346d0d410..3fb2aab853 100644 --- a/packages/sample/genaisrc/summarize.genai.js +++ b/packages/sample/genaisrc/summarize.genai.js @@ -1,6 +1,15 @@ script({ title:"summarize all files", - system: [] + system: [], + tests: [{ + files: "src/rag/markdown.md", + rubrics: "is a summary", + facts: "Markdown is a text-based syntax to generate documents", + asserts: { + type: "icontains", + value: "Markdown" + } + }] }) def("FILE", env.files) diff --git a/packages/sample/package.json b/packages/sample/package.json index f0a5d07ee8..86a657d4bb 100644 --- a/packages/sample/package.json +++ b/packages/sample/package.json @@ -9,7 +9,7 @@ "typecheck": "tsc -p src", "test": "node --import tsx --test src/**.test.ts", "test:watch": "node --import tsx --watch --test-name-pattern=run --test src/**.test.ts", - "promptfoo:eval": "npx --yes promptfoo@latest eval -c src/*.promptfoo.yaml --no-cache -j 1 --verbose", + "test:scripts": "node ../cli/built/genaiscript.cjs test -rmo -tp tnrllmproxy.azurewebsites.net", "promptfoo:view": "npx --yes promptfoo@latest view -y" } } diff --git a/packages/sample/src/aici/genaiscript.d.ts b/packages/sample/src/aici/genaiscript.d.ts index 5b3a97ec28..23edf63357 100644 --- a/packages/sample/src/aici/genaiscript.d.ts +++ b/packages/sample/src/aici/genaiscript.d.ts @@ -190,10 +190,42 @@ type PromptParameterType = type PromptParametersSchema = Record type PromptParameters = Record -interface PromptScript - extends PromptLike, - ModelOptions, - ScriptRuntimeOptions { +type PromptAssertion = + | { + /** + * output contains substring, case insensitive + **/ + type: "icontains" + value: string + } + | { + /** + * Perplexity is below a threshold + */ + type: "perplexity" + threshold: number + } + +interface PromptTest { + /** + * List of files to apply the test to. + */ + files: string | string[] + /** + * LLM output matches a given rubric, using a Language Model to grade output. + */ + rubrics?: string | string[] + /** + * LLM output adheres to the given facts, using Factuality method from OpenAI evaluation. + */ + facts?: string | string[] + /** + * Additional deterministic assertions. + */ + asserts?: PromptAssertion | PromptAssertion[] +} + +interface PromptScript extends PromptLike, ModelOptions, ScriptRuntimeOptions { /** * Groups template in UI */ @@ -204,6 +236,11 @@ interface PromptScript */ parameters?: PromptParametersSchema + /** + * Tests to validate this script. + */ + tests?: PromptTest[] + /** * Don't show it to the user in lists. Template `system.*` are automatically unlisted. */ @@ -404,7 +441,7 @@ type PromptArgs = Omit type PromptSystemArgs = Omit< PromptArgs, - "model" | "temperature" | "topP" | "maxTokens" | "seed" + "model" | "temperature" | "topP" | "maxTokens" | "seed" | "tests" > type StringLike = string | LinkedFile | LinkedFile[] diff --git a/packages/sample/src/makecode/genaiscript.d.ts b/packages/sample/src/makecode/genaiscript.d.ts index 5b3a97ec28..23edf63357 100644 --- a/packages/sample/src/makecode/genaiscript.d.ts +++ b/packages/sample/src/makecode/genaiscript.d.ts @@ -190,10 +190,42 @@ type PromptParameterType = type PromptParametersSchema = Record type PromptParameters = Record -interface PromptScript - extends PromptLike, - ModelOptions, - ScriptRuntimeOptions { +type PromptAssertion = + | { + /** + * output contains substring, case insensitive + **/ + type: "icontains" + value: string + } + | { + /** + * Perplexity is below a threshold + */ + type: "perplexity" + threshold: number + } + +interface PromptTest { + /** + * List of files to apply the test to. + */ + files: string | string[] + /** + * LLM output matches a given rubric, using a Language Model to grade output. + */ + rubrics?: string | string[] + /** + * LLM output adheres to the given facts, using Factuality method from OpenAI evaluation. + */ + facts?: string | string[] + /** + * Additional deterministic assertions. + */ + asserts?: PromptAssertion | PromptAssertion[] +} + +interface PromptScript extends PromptLike, ModelOptions, ScriptRuntimeOptions { /** * Groups template in UI */ @@ -204,6 +236,11 @@ interface PromptScript */ parameters?: PromptParametersSchema + /** + * Tests to validate this script. + */ + tests?: PromptTest[] + /** * Don't show it to the user in lists. Template `system.*` are automatically unlisted. */ @@ -404,7 +441,7 @@ type PromptArgs = Omit type PromptSystemArgs = Omit< PromptArgs, - "model" | "temperature" | "topP" | "maxTokens" | "seed" + "model" | "temperature" | "topP" | "maxTokens" | "seed" | "tests" > type StringLike = string | LinkedFile | LinkedFile[] diff --git a/packages/sample/src/promptfoo-api-provider.mjs b/packages/sample/src/promptfoo-api-provider.mjs deleted file mode 100644 index a1c76b69f4..0000000000 --- a/packages/sample/src/promptfoo-api-provider.mjs +++ /dev/null @@ -1,40 +0,0 @@ -import { execa } from "execa" - -// https://promptfoo.dev/docs/providers/custom-api -class GenAIScriptApiProvider { - constructor(options) { - this.providerId = options.id || "genaiscript" - this.config = options.config - } - - id() { - return this.providerId - } - - async callApi(prompt, context) { - const { model, temperature, topK, cache } = this.config - const { vars } = context - const { files } = vars - - const command = "node" - const args = ["../cli/built/genaiscript.cjs", "run", prompt, files] - if (model) args.push("--model", model) - if (temperature !== undefined) args.push("--temperature", temperature) - if (topK !== undefined) args.push("--top_k", topK) - if (vars.vars) args.push("--vars", vars.vars) - if (cache === false) args.push("--no-cache") - const { stdout, exitCode, failed } = await execa(command, args, { - cleanup: true, - preferLocal: true, - stripFinalNewline: true, - }) - const output = stdout?.replace("Warning: TT: undefined function: 32", "") - const error = failed ? `exit code ${exitCode}` : undefined - return { - output, - error, - } - } -} - -export default GenAIScriptApiProvider diff --git a/packages/sample/src/summarize.promptfoo.yaml b/packages/sample/src/summarize.promptfoo.yaml deleted file mode 100644 index 73c10ab90c..0000000000 --- a/packages/sample/src/summarize.promptfoo.yaml +++ /dev/null @@ -1,54 +0,0 @@ -description: "Summarize eval" - -prompts: - - "summarize" - -providers: - - id: ./promptfoo-api-provider.mjs - label: gpt4 - config: - model: gpt-4 - - id: ./promptfoo-api-provider.mjs - label: gpt3.5 - config: - model: gpt-3.5-turbo - - id: ./promptfoo-api-provider.mjs - label: phi3 - config: - model: ollama:phi3 - -defaultTest: - options: - provider: - text: - id: azureopenai:chat:gpt-4 - config: - apiHost: "tnrllmproxy.azurewebsites.net" - embedding: - id: azureopenai:embeddings:text-embedding-ada-002 - config: - apiHost: "tnrllmproxy.azurewebsites.net" - assert: - - type: not-starts-with - value: Sure - - type: not-contains - value: AI language model - - type: icontains - value: "{{keyword}}" - - type: llm-rubric - value: is a summary - - type: factuality - value: "{{fact}}" -tests: - - vars: - files: src/rag/markdown.md - keyword: Markdown - fact: Markdown is a text-based syntax to describe documents. - - vars: - files: src/rag/loremipsum.pdf - keyword: Lorem - fact: '"Lorem ipsum" is a type of placeholder text used in the publishing and design industry.' - - vars: - files: src/rag/Document.docx - keyword: Microsoft - fact: "Microsoft Word is a word processing software developed by Microsoft." diff --git a/packages/sample/src/tla/genaiscript.d.ts b/packages/sample/src/tla/genaiscript.d.ts index 5b3a97ec28..23edf63357 100644 --- a/packages/sample/src/tla/genaiscript.d.ts +++ b/packages/sample/src/tla/genaiscript.d.ts @@ -190,10 +190,42 @@ type PromptParameterType = type PromptParametersSchema = Record type PromptParameters = Record -interface PromptScript - extends PromptLike, - ModelOptions, - ScriptRuntimeOptions { +type PromptAssertion = + | { + /** + * output contains substring, case insensitive + **/ + type: "icontains" + value: string + } + | { + /** + * Perplexity is below a threshold + */ + type: "perplexity" + threshold: number + } + +interface PromptTest { + /** + * List of files to apply the test to. + */ + files: string | string[] + /** + * LLM output matches a given rubric, using a Language Model to grade output. + */ + rubrics?: string | string[] + /** + * LLM output adheres to the given facts, using Factuality method from OpenAI evaluation. + */ + facts?: string | string[] + /** + * Additional deterministic assertions. + */ + asserts?: PromptAssertion | PromptAssertion[] +} + +interface PromptScript extends PromptLike, ModelOptions, ScriptRuntimeOptions { /** * Groups template in UI */ @@ -204,6 +236,11 @@ interface PromptScript */ parameters?: PromptParametersSchema + /** + * Tests to validate this script. + */ + tests?: PromptTest[] + /** * Don't show it to the user in lists. Template `system.*` are automatically unlisted. */ @@ -404,7 +441,7 @@ type PromptArgs = Omit type PromptSystemArgs = Omit< PromptArgs, - "model" | "temperature" | "topP" | "maxTokens" | "seed" + "model" | "temperature" | "topP" | "maxTokens" | "seed" | "tests" > type StringLike = string | LinkedFile | LinkedFile[] diff --git a/packages/sample/src/vision/genaiscript.d.ts b/packages/sample/src/vision/genaiscript.d.ts index 5b3a97ec28..23edf63357 100644 --- a/packages/sample/src/vision/genaiscript.d.ts +++ b/packages/sample/src/vision/genaiscript.d.ts @@ -190,10 +190,42 @@ type PromptParameterType = type PromptParametersSchema = Record type PromptParameters = Record -interface PromptScript - extends PromptLike, - ModelOptions, - ScriptRuntimeOptions { +type PromptAssertion = + | { + /** + * output contains substring, case insensitive + **/ + type: "icontains" + value: string + } + | { + /** + * Perplexity is below a threshold + */ + type: "perplexity" + threshold: number + } + +interface PromptTest { + /** + * List of files to apply the test to. + */ + files: string | string[] + /** + * LLM output matches a given rubric, using a Language Model to grade output. + */ + rubrics?: string | string[] + /** + * LLM output adheres to the given facts, using Factuality method from OpenAI evaluation. + */ + facts?: string | string[] + /** + * Additional deterministic assertions. + */ + asserts?: PromptAssertion | PromptAssertion[] +} + +interface PromptScript extends PromptLike, ModelOptions, ScriptRuntimeOptions { /** * Groups template in UI */ @@ -204,6 +236,11 @@ interface PromptScript */ parameters?: PromptParametersSchema + /** + * Tests to validate this script. + */ + tests?: PromptTest[] + /** * Don't show it to the user in lists. Template `system.*` are automatically unlisted. */ @@ -404,7 +441,7 @@ type PromptArgs = Omit type PromptSystemArgs = Omit< PromptArgs, - "model" | "temperature" | "topP" | "maxTokens" | "seed" + "model" | "temperature" | "topP" | "maxTokens" | "seed" | "tests" > type StringLike = string | LinkedFile | LinkedFile[] diff --git a/yarn.lock b/yarn.lock index 4c0019a736..9dc4a96322 100644 --- a/yarn.lock +++ b/yarn.lock @@ -63,6 +63,31 @@ node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +"@anthropic-ai/sdk@^0.20.1": + version "0.20.7" + resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.20.7.tgz#b19b0e66ba070f928bbf583c06d76e6efdd93d5e" + integrity sha512-uyc+3WGLpe8ur6mSIKSab7P9JdBerTdmqb7popc/yROYLLCW/Ykyw4ZfjmN/cLmxjnAKnv5YUngzbPM0BJuGjg== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + web-streams-polyfill "^3.2.1" + +"@apidevtools/json-schema-ref-parser@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-10.1.0.tgz#bf54494039a56fa7f77fed17dc6f01dfde50f64c" + integrity sha512-3e+viyMuXdrcK8v5pvP+SDoAQ77FH6OyRmuK48SZKmdHJRFm87RsSs8qm6kP39a/pOPURByJw+OXzQIqcfmKtA== + dependencies: + "@jsdevtools/ono" "^7.1.3" + "@types/json-schema" "^7.0.11" + "@types/lodash.clonedeep" "^4.5.7" + js-yaml "^4.1.0" + lodash.clonedeep "^4.5.0" + "@astrojs/check@^0.5.9": version "0.5.9" resolved "https://registry.yarnpkg.com/@astrojs/check/-/check-0.5.9.tgz#dcbbe0241ca5da8b05865a715ec85f905ea3048b" @@ -583,6 +608,13 @@ "@babel/plugin-transform-modules-commonjs" "^7.24.1" "@babel/plugin-transform-typescript" "^7.24.1" +"@babel/runtime@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/standalone@^7.23.8": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.24.4.tgz#9461220fd641a92fff4be19b34fdb9d18e80d37d" @@ -661,6 +693,11 @@ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@colors/colors@1.6.0", "@colors/colors@^1.6.0": version "1.6.0" resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" @@ -1286,6 +1323,11 @@ "@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== + "@koa/cors@^5.0.0": version "5.0.0" resolved "https://registry.npmjs.org/@koa/cors/-/cors-5.0.0.tgz" @@ -2076,6 +2118,11 @@ "@smithy/util-buffer-from" "^2.1.1" tslib "^2.5.0" +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== + "@szmarczak/http-timer@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" @@ -2088,6 +2135,11 @@ resolved "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz" integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + "@types/acorn@^4.0.0": version "4.0.6" resolved "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz" @@ -2128,6 +2180,18 @@ dependencies: "@babel/types" "^7.20.7" +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + "@types/d3-scale-chromatic@^3.0.0": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644" @@ -2201,7 +2265,7 @@ resolved "https://registry.yarnpkg.com/@types/ini/-/ini-4.1.0.tgz#20e7327b3133627f84304210670d6406cceaba25" integrity sha512-mTehMtc+xtnWBBvqizcqYCktKDBH2WChvx1GU3Sfe4PysFDXiNe+1YwtpVX1MDtCa4NQrSPw2+3HmvXHY3gt1w== -"@types/json-schema@^7.0.15": +"@types/json-schema@^7.0.11", "@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== @@ -2225,6 +2289,13 @@ dependencies: "@types/lodash" "*" +"@types/lodash.clonedeep@^4.5.7": + version "4.5.9" + resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.9.tgz#ea48276c7cc18d080e00bb56cf965bcceb3f0fc1" + integrity sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q== + dependencies: + "@types/lodash" "*" + "@types/lodash@*", "@types/lodash@^4.14.202": version "4.14.202" resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz" @@ -2317,7 +2388,7 @@ dependencies: undici-types "~5.26.4" -"@types/node@>=20.12.5", "@types/node@^20.12.7": +"@types/node@>=10.0.0", "@types/node@>=20.12.5", "@types/node@^20.12.7": version "20.12.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== @@ -3225,7 +3296,7 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@^1.3.5: +accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -3262,6 +3333,13 @@ agent-base@^7.0.2, agent-base@^7.1.0: dependencies: debug "^4.3.4" +agent-base@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + agentkeepalive@^4.2.1, agentkeepalive@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz" @@ -3277,6 +3355,13 @@ aggregate-error@^4.0.1: clean-stack "^4.0.0" indent-string "^5.0.0" +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -3287,7 +3372,7 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.12.0: +ajv@^8.0.0, ajv@^8.12.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -3393,6 +3478,11 @@ aria-query@^5.3.0: dependencies: dequal "^2.0.3" +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-iterate@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz" @@ -3436,6 +3526,13 @@ assertion-error@^1.1.0: resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + astring@^1.8.0: version "1.8.6" resolved "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz" @@ -3519,7 +3616,12 @@ astro@^4.5.3: optionalDependencies: sharp "^0.32.6" -async@^3.2.3: +async@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + +async@^3.2.3, async@^3.2.4: version "3.2.5" resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz" integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== @@ -3624,6 +3726,11 @@ base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + basic-auth@~2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" @@ -3631,6 +3738,11 @@ basic-auth@~2.0.1: dependencies: safe-buffer "5.1.2" +basic-ftp@^5.0.2: + version "5.0.5" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" + integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== + bcp-47-match@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz" @@ -3645,11 +3757,26 @@ bcp-47@^2.1.0: is-alphanumerical "^2.0.0" is-decimal "^2.0.0" +better-sqlite3@^9.3.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-9.6.0.tgz#b01e58ba7c48abcdc0383b8301206ee2ab81d271" + integrity sha512-yR5HATnqeYNVnkaUTf4bOP2dJSnyhP4puJN/QPRyx4YkBEEUxib422n2XzPqDEHjQQqazoYoADdAm5vE15+dAQ== + dependencies: + bindings "^1.5.0" + prebuild-install "^7.1.1" + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bl@^4.0.3: version "4.1.0" resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" @@ -3678,6 +3805,24 @@ blueimp-md5@^2.19.0: resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== +body-parser@1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + boolbase@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" @@ -3791,6 +3936,16 @@ bundle-name@^4.1.0: dependencies: run-applescript "^7.0.0" +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + c12@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/c12/-/c12-1.10.0.tgz#e1936baa26fd03a9427875554aa6aeb86077b7fb" @@ -3822,6 +3977,22 @@ cache-content-type@^1.0.0: mime-types "^2.1.18" ylru "^1.2.0" +cache-manager-fs-hash@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cache-manager-fs-hash/-/cache-manager-fs-hash-1.1.0.tgz#045ed9278977d776a2e4851b2d87440b6d77bd79" + integrity sha512-5D4Y2cnioxiy830a7QrWtRmsrfZCW1z3BOIZ0jessuFHIj/8e8mI4MsDYTaEz6aPn0EC4YAWWtQGJVsqccXW/w== + dependencies: + lockfile "^1.0.4" + +cache-manager@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cache-manager/-/cache-manager-4.1.0.tgz#aa986421f1c975a862d6de88edb9ab1d30f4bd39" + integrity sha512-ZGM6dLxrP65bfOZmcviWMadUOCICqpLs92+P/S5tj8onz+k+tB7Gr+SAgOUHCQtfm2gYEQDHiKeul4+tYPOJ8A== + dependencies: + async "3.2.3" + lodash.clonedeep "^4.5.0" + lru-cache "^7.10.1" + cacheable-lookup@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" @@ -3940,7 +4111,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -4106,6 +4277,15 @@ cli-spinners@^2.9.0, cli-spinners@^2.9.2: resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== +cli-table3@^0.6.3: + version "0.6.4" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.4.tgz#d1c536b8a3f2e7bec58f67ac9e5769b1b30088b0" + integrity sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" @@ -4255,6 +4435,11 @@ commander@7, commander@^7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^12.0.0: version "12.0.0" resolved "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz" @@ -4280,6 +4465,31 @@ common-ancestor-path@^1.0.1: resolved "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz" integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== +complex.js@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.1.1.tgz#0675dac8e464ec431fb2ab7d30f41d889fb25c31" + integrity sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + computeds@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/computeds/-/computeds-0.0.1.tgz#215b08a4ba3e08a11ff6eee5d6d8d7166a97ce2e" @@ -4315,14 +4525,14 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -content-disposition@~0.5.2: +content-disposition@0.5.4, content-disposition@~0.5.2: version "0.5.4" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" -content-type@^1.0.4: +content-type@^1.0.4, content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== @@ -4332,11 +4542,21 @@ convert-source-map@^2.0.0: resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cookie@^0.6.0: +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.6.0, cookie@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + cookies@~0.9.0: version "0.9.1" resolved "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz" @@ -4350,6 +4570,14 @@ core-util-is@~1.0.0: resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cors@^2.8.5, cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + cose-base@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" @@ -4434,11 +4662,16 @@ csstype@^3.1.2, csstype@^3.1.3: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -csv-parse@^5.5.5: +csv-parse@^5.3.8, csv-parse@^5.5.5: version "5.5.5" resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.5.tgz#68a271a9092877b830541805e14c8a80e6a22517" integrity sha512-erCk7tyU3yLWAhk6wvKxnyPtftuy/6Ak622gOO7BCJ05+TYffnPCJF905wmOQm+BpkX54OdAl8pveJwUdpnCXQ== +csv-stringify@^6.3.2: + version "6.4.6" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-6.4.6.tgz#9ccf87cb8b017c96673a9fa061768c8ba83e8b98" + integrity sha512-h2V2XZ3uOTLilF5dPIptgUfN/o2ia/80Ie0Lly18LAnw5s8Eb7kt8rfxSUy24AztJZas9f6DPZpVlzDUtFt/ag== + cubic2quad@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/cubic2quad/-/cubic2quad-1.2.1.tgz#2442260b72c02ee4b6a2fe998fcc1c4073622286" @@ -4746,6 +4979,11 @@ dagre-d3-es@7.0.10: d3 "^7.8.2" lodash-es "^4.17.21" +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + dayjs@^1.11.7: version "1.11.10" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" @@ -4756,6 +4994,11 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -4763,7 +5006,7 @@ debug@2.6.9, debug@^2.2.0: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4795,6 +5038,11 @@ decamelize@^4.0.0: resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + decode-named-character-reference@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz" @@ -4889,6 +5137,15 @@ defu@^6.1.4: resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + delaunator@5: version "5.0.1" resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278" @@ -4926,7 +5183,7 @@ destr@^2.0.3: resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449" integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== -destroy@^1.0.4: +destroy@1.2.0, destroy@^1.0.4: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== @@ -5066,6 +5323,11 @@ drauu@^0.4.0: dependencies: "@drauu/core" "0.4.0" +drizzle-orm@^0.29.3: + version "0.29.5" + resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.29.5.tgz#b82bb6d67101fff9438dacd4b09e9cd23109f49c" + integrity sha512-jS3+uyzTz4P0Y2CICx8FmRQ1eplURPaIMWDn/yq6k4ShRFj9V7vlJk67lSf2kyYPzQ60GkkNGXcJcwrxZ6QCRw== + dset@^3.1.2, dset@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz" @@ -5160,6 +5422,27 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== + +engine.io@~6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" + integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + enhanced-resolve@^5.0.0: version "5.15.0" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" @@ -5331,6 +5614,11 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-latex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1" + integrity sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw== + escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" @@ -5346,6 +5634,17 @@ escape-string-regexp@^1.0.5: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-scope@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.1.tgz#a9601e4b81a0b9171657c343fb13111688963cfc" @@ -5423,7 +5722,7 @@ espree@^10.0.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.0.0" -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -5503,6 +5802,11 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + event-emitter@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" @@ -5561,6 +5865,43 @@ expand-template@^2.0.3: resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +express@^4.18.2: + version "4.19.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" + integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.2" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.6.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + expressive-code@^0.33.4: version "0.33.4" resolved "https://registry.npmjs.org/expressive-code/-/expressive-code-0.33.4.tgz" @@ -5628,6 +5969,11 @@ fast-xml-parser@^4.3.6: dependencies: strnum "^1.0.5" +fastest-levenshtein@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" @@ -5682,6 +6028,11 @@ file-type@^19.0.0: strtok3 "^7.0.0" token-types "^5.0.1" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" @@ -5702,6 +6053,19 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" @@ -5819,6 +6183,16 @@ formdata-node@^4.3.2: node-domexception "1.0.0" web-streams-polyfill "4.0.0-beta.3" +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.4.tgz#b2bac8249a610c3396106da97c5a71da75b94b1c" + integrity sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q== + framesync@6.1.2, framesync@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.1.2.tgz#755eff2fb5b8f3b4d2b266dd18121b300aefea27" @@ -5826,7 +6200,7 @@ framesync@6.1.2, framesync@^6.1.2: dependencies: tslib "2.4.0" -fresh@~0.5.2: +fresh@0.5.2, fresh@~0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== @@ -5973,6 +6347,16 @@ get-tsconfig@^4.7.2: dependencies: resolve-pkg-maps "^1.0.0" +get-uri@^6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a" + integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" + fs-extra "^11.2.0" + giget@^1.2.1: version "1.2.3" resolved "https://registry.yarnpkg.com/giget/-/giget-1.2.3.tgz#ef6845d1140e89adad595f7f3bb60aa31c672cb6" @@ -6022,7 +6406,7 @@ glob@8.1.0: minimatch "^5.0.1" once "^1.3.0" -glob@^10.3.12: +glob@^10.2.6, glob@^10.3.12: version "10.3.12" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== @@ -6602,6 +6986,17 @@ http-cache-semantics@^4.1.1: resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== +http-errors@2.0.0, http-errors@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: version "1.8.1" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" @@ -6613,17 +7008,6 @@ http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" -http-errors@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - http-errors@~1.6.2: version "1.6.3" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" @@ -6634,7 +7018,7 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" -http-proxy-agent@^7.0.2: +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1, http-proxy-agent@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== @@ -6658,7 +7042,7 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^7.0.4: +https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.3, https-proxy-agent@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== @@ -6683,6 +7067,13 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + iconv-lite@0.6, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" @@ -6794,11 +7185,24 @@ internmap@^1.0.0: resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + ip-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-5.0.0.tgz#cd313b2ae9c80c07bd3851e12bf4fa4dc5480632" integrity sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw== +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-alphabetical@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz" @@ -7066,6 +7470,11 @@ jackspeak@^2.3.6: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +javascript-natural-sort@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== + jiti@^1.21.0: version "1.21.0" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" @@ -7113,6 +7522,11 @@ js-yaml@^3.13.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -7464,11 +7878,28 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lockfile@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" + integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== + dependencies: + signal-exit "^3.0.2" + lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== +lodash-node@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash-node/-/lodash-node-2.4.1.tgz#ea82f7b100c733d1a42af76801e506105e2a80ec" + integrity sha512-egEt8eNQp2kZWRmngahiqMoDCDCENv3uM188S7Ed5t4k3v6RrLELXC+FqLNMUnhCo7gvQX3G1V8opK/Lcslahg== + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" @@ -7565,6 +7996,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.10.1, lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" @@ -7683,6 +8119,21 @@ markdown-table@^3.0.0, markdown-table@^3.0.3: resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz" integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== +mathjs@^12.4.1: + version "12.4.2" + resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-12.4.2.tgz#27fe9ac2a534b40c25c272585dfc358a90597bb1" + integrity sha512-lW14EzwAFgbNN7AZikxplmhs7wiXDhMphBOGCA3KS6T29ECEkHJsBtbEW5cnCz7sXtl4nDyvTdR+DqVsZyiiEw== + dependencies: + "@babel/runtime" "^7.24.4" + complex.js "^2.1.1" + decimal.js "^10.4.3" + escape-latex "^1.2.0" + fraction.js "4.3.4" + javascript-natural-sort "^0.7.1" + seedrandom "^3.0.5" + tiny-emitter "^2.1.0" + typed-function "^4.1.1" + md-utils-ts@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/md-utils-ts/-/md-utils-ts-2.0.0.tgz" @@ -7979,6 +8430,11 @@ meow@^9.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" @@ -8015,7 +8471,7 @@ mermaid@^10.9.0: uuid "^9.0.0" web-worker "^1.2.0" -methods@^1.1.2: +methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== @@ -8607,7 +9063,7 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0: +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -8619,7 +9075,7 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.35, mime-types@~2.1.24, dependencies: mime-db "1.52.0" -mime@^1.3.4: +mime@1.6.0, mime@^1.3.4: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -8903,6 +9359,11 @@ negotiator@0.6.3: resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + next-tick@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" @@ -9053,7 +9514,7 @@ nth-check@^2.0.0, nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -nunjucks@^3.2.3: +nunjucks@^3.2.3, nunjucks@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/nunjucks/-/nunjucks-3.2.4.tgz#f0878eef528ce7b0aa35d67cc6898635fd74649e" integrity sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ== @@ -9073,7 +9534,7 @@ nypm@^0.3.8: pathe "^1.1.2" ufo "^1.4.0" -object-assign@^4.0.1, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -9125,7 +9586,7 @@ ohash@^1.1.3: resolved "https://registry.yarnpkg.com/ohash/-/ohash-1.1.3.tgz#f12c3c50bfe7271ce3fd1097d42568122ccdcf07" integrity sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw== -on-finished@^2.3.0: +on-finished@2.4.1, on-finished@^2.3.0: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -9218,6 +9679,20 @@ open@^10.0.3, open@^10.1.0: is-inside-container "^1.0.0" is-wsl "^3.1.0" +openai@^4.19.0: + version "4.38.5" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.38.5.tgz#87de78eed9f7e63331fb6b1307d8c9dd986b39d0" + integrity sha512-Ym5GJL98ZhLJJ7enBx53jjG3vwN/fsB+Ozh46nnRZZS9W1NiYqbwkJ+sXd3dkCIiWIgcyyOPL2Zr8SQAzbpj3g== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + web-streams-polyfill "^3.2.1" + openai@^4.26.1: version "4.28.0" resolved "https://registry.npmjs.org/openai/-/openai-4.28.0.tgz" @@ -9247,6 +9722,11 @@ openai@^4.33.1: node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + option@~0.2.1: version "0.2.4" resolved "https://registry.npmjs.org/option/-/option-0.2.4.tgz" @@ -9352,6 +9832,28 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pac-proxy-agent@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" + integrity sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.0.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.2" + pac-resolver "^7.0.0" + socks-proxy-agent "^8.0.2" + +pac-resolver@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + packet-reader@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz" @@ -9514,6 +10016,11 @@ path-scurry@^1.10.2: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + path-to-regexp@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" @@ -9934,6 +10441,50 @@ process@^0.11.10: resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +promptfoo@^0.55.0: + version "0.55.0" + resolved "https://registry.yarnpkg.com/promptfoo/-/promptfoo-0.55.0.tgz#f2f80cc54310914969ada621c7419b45043368e7" + integrity sha512-wb1drxoHa9jpAz7UJW4QDK0X72zHxX/RAyyhw7I2N5Lvs1smnJ7yF0F6EZKiKSUgYfydeWvqzGr9oTqeZLzBNg== + dependencies: + "@anthropic-ai/sdk" "^0.20.1" + "@apidevtools/json-schema-ref-parser" "^10.1.0" + ajv "^8.12.0" + ajv-formats "^2.1.1" + async "^3.2.4" + better-sqlite3 "^9.3.0" + cache-manager "^4.1.0" + cache-manager-fs-hash "^1.0.0" + chalk "^4.1.2" + chokidar "^3.5.3" + cli-progress "^3.12.0" + cli-table3 "^0.6.3" + commander "^10.0.1" + compression "^1.7.4" + cors "^2.8.5" + csv-parse "^5.3.8" + csv-stringify "^6.3.2" + debounce "^1.2.1" + dotenv "^16.4.5" + drizzle-orm "^0.29.3" + express "^4.18.2" + fastest-levenshtein "^1.0.16" + glob "^10.2.6" + js-yaml "^4.1.0" + mathjs "^12.4.1" + node-fetch "^2.6.7" + nunjucks "^3.2.4" + openai "^4.19.0" + opener "^1.5.2" + proxy-agent "^6.3.1" + python-shell "^5.0.0" + replicate "^0.27.1" + rouge "^1.0.3" + semver "^7.5.3" + socket.io "^4.6.1" + tiny-invariant "^1.3.1" + uuid "^9.0.0" + winston "^3.8.2" + prompts@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" @@ -9966,6 +10517,28 @@ protobufjs@^6.8.8: "@types/node" ">=13.7.0" long "^4.0.0" +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-agent@^6.3.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d" + integrity sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ== + dependencies: + agent-base "^7.0.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.3" + lru-cache "^7.14.1" + pac-proxy-agent "^7.0.1" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.2" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" @@ -10016,6 +10589,18 @@ punycode@^2.1.0, punycode@^2.3.0: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +python-shell@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/python-shell/-/python-shell-5.0.0.tgz#26fc9a0e477cb30fc98ef2d9d5f53ab38a060eac" + integrity sha512-RUOOOjHLhgR1MIQrCtnEqz/HJ1RMZBIN+REnpSUrfft2bXqXy69fwJASVziWExfFXsR1bCY0TznnHooNsCo0/w== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + qs@6.11.2, qs@^6.9.1: version "6.11.2" resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" @@ -10065,6 +10650,11 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + ranges-apply@^7.0.15: version "7.0.15" resolved "https://registry.npmjs.org/ranges-apply/-/ranges-apply-7.0.15.tgz" @@ -10096,6 +10686,16 @@ ranges-sort@^6.0.11: resolved "https://registry.npmjs.org/ranges-sort/-/ranges-sort-6.0.11.tgz" integrity sha512-fhNEG0vGi7bESitNNqNBAfYPdl2efB+1paFlI8BQDCNkruERKuuhG8LkQClDIVqUJLkrmKuOSPQ3xZHqVnVo3Q== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + rc9@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/rc9/-/rc9-2.1.2.tgz#6282ff638a50caa0a91a31d76af4a0b9cbd1080d" @@ -10215,6 +10815,11 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.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== + rehype-parse@^9.0.0: version "9.0.0" resolved "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz" @@ -10342,6 +10947,13 @@ replicate@^0.25.2: optionalDependencies: readable-stream ">=4.0.0" +replicate@^0.27.1: + version "0.27.1" + resolved "https://registry.yarnpkg.com/replicate/-/replicate-0.27.1.tgz#5ddd8057ec25b3499cac80b9b02f228fe468522f" + integrity sha512-oCPVE3cRWlim9wvNtsRyfZCfHblVArc5wAt8rbwrUQ7guHcz2cNiha9/rES/kkb5x3RNAy1JyD6BY900FMTydA== + optionalDependencies: + readable-stream ">=4.0.0" + request-light@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz" @@ -10533,6 +11145,13 @@ rollup@^4.2.0: "@rollup/rollup-win32-x64-msvc" "4.10.0" fsevents "~2.3.2" +rouge@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/rouge/-/rouge-1.0.3.tgz#27225b57f60d1f71272d9cb0a150179d0806baa3" + integrity sha512-YCt74Dxsi99E8/uh943FTa80EmGboaOu1ij4q8WD4EAGyvyWYaH7MRHorrDbGgLY7iFUwDwyW/g9KJZx7D5fUQ== + dependencies: + lodash-node "^2.4.1" + roughjs@^4.6.6: version "4.6.6" resolved "https://registry.yarnpkg.com/roughjs/-/roughjs-4.6.6.tgz#1059f49a5e0c80dee541a005b20cc322b222158b" @@ -10582,7 +11201,7 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== -"safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -10605,6 +11224,11 @@ section-matter@^1.0.0: extend-shallow "^2.0.1" kind-of "^6.0.0" +seedrandom@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== + selderee@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" @@ -10622,13 +11246,32 @@ semver@^6.0.0, semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.8, semver@^7.5.2, semver@^7.5.4, semver@^7.6.0: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + serialize-error@^11.0.3: version "11.0.3" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-11.0.3.tgz#b54f439e15da5b4961340fbbd376b6b04aa52e92" @@ -10643,6 +11286,16 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" @@ -10834,6 +11487,57 @@ slash@^5.1.0: resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socket.io-adapter@~2.5.2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz#4fdb1358667f6d68f25343353bd99bd11ee41006" + integrity sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg== + dependencies: + debug "~4.3.4" + ws "~8.11.0" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.6.1: + version "4.7.5" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.5.tgz#56eb2d976aef9d1445f373a62d781a41c7add8f8" + integrity sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + +socks-proxy-agent@^8.0.2: + version "8.0.3" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz#6b2da3d77364fde6292e810b496cb70440b9b89d" + integrity sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A== + dependencies: + agent-base "^7.1.1" + debug "^4.3.4" + socks "^2.7.1" + +socks@^2.7.1: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + source-map-js@^1.0.1, source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" @@ -10849,6 +11553,11 @@ source-map@^0.7.0, source-map@^0.7.4: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" @@ -10892,6 +11601,11 @@ split2@^4.1.0: resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" @@ -11318,6 +12032,11 @@ through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" +tiny-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + tiny-invariant@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" @@ -11453,7 +12172,7 @@ tslib@^1.11.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.5.0, tslib@^2.6.2: +tslib@^2.0.1, tslib@^2.5.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -11561,7 +12280,7 @@ type-fest@^2.12.2, type-fest@^2.13.0: resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== -type-is@^1.6.16: +type-is@^1.6.16, type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -11574,6 +12293,11 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typed-function@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-4.1.1.tgz#38ce3cae31f4f513bcb263563fdad27b2afa73e8" + integrity sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ== + typed-rest-client@^1.8.4: version "1.8.11" resolved "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz" @@ -11883,7 +12607,7 @@ unocss@^0.59.0: "@unocss/transformer-variant-group" "0.59.1" "@unocss/vite" "0.59.1" -unpipe@~1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -12045,7 +12769,7 @@ varstream@^0.3.2: dependencies: readable-stream "^1.0.33" -vary@^1.1.2: +vary@^1, vary@^1.1.2, vary@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== @@ -12553,7 +13277,7 @@ wink-nlp@^1.14.3: resolved "https://registry.npmjs.org/wink-nlp/-/wink-nlp-1.14.3.tgz" integrity sha512-lvY5iCs3T8I34F8WKS70+2P0U9dWLn3vdPf/Z+m2VK14N7OmqnPzmHfh3moHdusajoQ37Em39z0IZB9K4x/96A== -winston-transport@^4.5.0: +winston-transport@^4.5.0, winston-transport@^4.7.0: version "4.7.0" resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz" integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== @@ -12579,6 +13303,23 @@ winston@^3.7.2: triple-beam "^1.3.0" winston-transport "^4.5.0" +winston@^3.8.2: + version "3.13.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" + integrity sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + workerpool@6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" @@ -12621,6 +13362,11 @@ ws@^8.13.0: resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz" integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + xml2js@^0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"