diff --git a/server/controllers/OpeyIIController.ts b/server/controllers/OpeyIIController.ts
new file mode 100644
index 0000000..96d7519
--- /dev/null
+++ b/server/controllers/OpeyIIController.ts
@@ -0,0 +1,133 @@
+import { streamText } from 'ai'
+import axios from 'axios'
+import { Controller, Session, Req, Res, Post } from 'routing-controllers'
+import { Request, Response } from 'express'
+import { Service } from 'typedi'
+import OBPClientService from '../services/OBPClientService'
+import OpeyClientService from '../services/OpeyClientService'
+import { v6 as uuid6 } from 'uuid';
+import { UserInput } from '../schema/OpeySchema'
+
+@Service()
+@Controller('/opey')
+
+export class OpeyController {
+ constructor(
+ private obpClientService: OBPClientService,
+ private opeyClientService: OpeyClientService,
+ ) {}
+
+ @Post('/consent')
+ /**
+ * Retrieves a consent from OBP for the current user
+ */
+ async getConsent(
+ @Session() session: any,
+ @Req() request: Request,
+ @Res() response: Response
+ ): Response {
+ try {
+ console.log("Getting consent from OBP")
+ // Check if consent is already in session
+ if (session['obpConsent']) {
+ console.log("Consent found in session, returning cached consent ID")
+ const obpConsent = session['obpConsent']
+ // NOTE: Arguably we should not return the consent to the frontend as it could be hijacked,
+ // we can keep everything in the backend and only return the JWT token
+ return response.status(200).json({consent_id: obpConsent.consent_id});
+ }
+
+ const oauthConfig = session['clientConfig']
+ const version = this.obpClientService.getOBPVersion()
+ // Obbiously this should not be hard-coded, especially the consumer_id, but for now it is
+ const consentRequestBody = {
+ "everything": false,
+ "views": [],
+ "entitlements": [],
+ "consumer_id": "33e0a1bd-9f1d-4128-911b-8936110f802f"
+ }
+
+ // Get current user, only proceed if user is logged in
+ const currentUser = await this.obpClientService.get(`/obp/${version}/users/current`, oauthConfig)
+ const currentResponseKeys = Object.keys(currentUser)
+ if (!currentResponseKeys.includes('user_id')) {
+ return response.status(400).json({ message: 'User not logged in, Authentication required' });
+ }
+
+ // url needs to be changed once we get the 'bankless' consent endpoint
+ // this creates a consent for the current logged in user, and starts SCA flow i.e. sends SMS or email OTP to user
+ const consent = await this.obpClientService.create(`/obp/${version}/banks/gh.29.uk/my/consents/IMPLICIT`, consentRequestBody, oauthConfig)
+ console.log("Consent: ", consent)
+
+ // store consent in session, return consent 200 OK
+ session['obpConsent'] = consent
+ return response.status(200).json({consent_id: consent.consent_id});
+ } catch (error) {
+ console.error("Error in consent endpoint: ", error);
+ return response.status(500).json({ error: 'Internal Server Error '});
+ }
+ }
+
+
+ @Post('/consent/answer-challenge')
+ /**
+ * Endpoint to answer the consent challenge with code i.e. SMS or email OTP for SCA
+ * If successful, returns a Consent-JWT for use by Opey to access endpoints/ roles that the consenting user has
+ * This completes (i.e. is the final step in) the consent flow
+ */
+ async answerConsentChallenge(
+ @Session() session: any,
+ @Req() request: Request,
+ @Res() response: Response
+ ): Response {
+ try {
+ const oauthConfig = session['clientConfig']
+ const version = this.obpClientService.getOBPVersion()
+
+ const obpConsent = session['obpConsent']
+ if (!obpConsent) {
+ return response.status(400).json({ message: 'Consent not found in session' });
+ } else if (obpConsent.status === 'ACCEPTED') {
+ return response.status(400).json({ message: 'Consent already accepted' });
+ }
+ const answerBody = request.body
+
+ const consentJWT = await this.obpClientService.create(`/obp/${version}/banks/gh.29.uk/consents/${obpConsent.consent_id}/challenge`, answerBody, oauthConfig)
+ console.log("Consent JWT: ", consentJWT)
+ // store consent JWT in session, return consent JWT 200 OK
+ session['obpConsentJWT'] = consentJWT
+ return response.status(200).json(true);
+
+ } catch (error) {
+ console.error("Error in consent/answer-challenge endpoint: ", error);
+ return response.status(500).json({ error: 'Internal Server Error' });
+ }
+
+ }
+
+ @Post('/stream')
+
+ async streamOpey(
+ @Session() session: any,
+ @Req() request: Request,
+ @Res() response: Response
+ ) {
+ const messages = await request.json()
+
+ console.log(messages)
+
+ const user_input: UserInput = {
+ "message": messages[-1],
+ "thread_id": uuid6(),
+ "is_tool_call_approval": false
+ }
+
+ const stream = await this.opeyClientService.stream(user_input)
+
+ stream.on('data', (chunk)=>{
+ console.log(chunk)
+ })
+
+
+ }
+}
\ No newline at end of file
diff --git a/server/schema/OpeySchema.ts b/server/schema/OpeySchema.ts
new file mode 100644
index 0000000..0f020d4
--- /dev/null
+++ b/server/schema/OpeySchema.ts
@@ -0,0 +1,6 @@
+
+export class UserInput {
+ message: string;
+ thread_id?: string | null;
+ is_tool_call_approval: boolean;
+}
\ No newline at end of file
diff --git a/server/services/OpeyClientService.ts b/server/services/OpeyClientService.ts
new file mode 100644
index 0000000..4f70acd
--- /dev/null
+++ b/server/services/OpeyClientService.ts
@@ -0,0 +1,54 @@
+import { Service } from 'typedi'
+import axios from 'axios'
+import { UserInput } from '../schema/OpeySchema'
+
+@Service()
+export default class OpeyClientService {
+ private AuthConfig: {
+ consentId: string,
+ opeyJWT: string,
+ }
+ private opeyConfig: {
+ baseUri: string,
+ authConfig: any,
+ paths: {
+ stream: string,
+ invoke: string,
+ approve_tool: string,
+ feedback: string,
+ }
+ }
+ constuctor() {
+ this.AuthConfig = {
+ consentId: '',
+ opeyJWT: ''
+ }
+ this.opeyConfig = {
+ baseUri: process.env.VITE_CHATBOT_URL,
+ authConfig: this.AuthConfig,
+ paths: {
+ stream: '/stream',
+ invoke: '/invoke',
+ approve_tool: '/approve_tool/{thead_id}',
+ feedback: '/feedback',
+ }
+ }
+
+ }
+ async stream(user_input: UserInput) {
+ await axios.post(this.opeyConfig.paths.stream, user_input, {
+
+ headers: {
+ "Authorization": `Bearer ${this.opeyConfig.authConfig.opeyJWT}`
+ },
+ responseType: 'stream'
+
+ }).catch((error) => {
+ console.error(error)
+
+ }).then((response) => {
+ const stream = response.data
+ return stream
+ })
+ }
+}
\ No newline at end of file
diff --git a/src/components/ChatWidget.vue b/src/components/ChatWidget.vue
index fb075e9..e1639f4 100644
--- a/src/components/ChatWidget.vue
+++ b/src/components/ChatWidget.vue
@@ -73,13 +73,14 @@
const { isConnected } = storeToRefs(connectionStore);
- return {isStreaming, chatMessages, lastError, currentMessageSnapshot, chatStore, connectionStore, isConnected}
+ return {isStreaming, chatMessages, lastError, currentMessageSnapshot, chatStore, connectionStore}
},
data() {
return {
isOpen: false,
userInput: '',
sessionId: uuidv4(),
+ isConnected: false,
awaitingConnection: !this.isConnected,
awaitingConsentChallengeAnswer: false,
consentChallengeAnswer: '',
@@ -121,6 +122,9 @@
async establishWebSocketConnection() {
// Get the Opey JWT token
// try to get a consent token
+
+ // Check if the user already has a token in the cookies
+
try {
const consentResponse = await getOpeyConsent()
console.log('Consent response: ', consentResponse)
@@ -175,6 +179,12 @@
if (response.status === 200) {
console.log('Consent challenge answered successfully, Consent approved')
this.awaitingConsentChallengeAnswer = false
+ if (response.data.success) {
+ console.log('Consent approved')
+ this.isConnected = true
+ } else {
+ console.log('Consent denied')
+ }
}
} catch (error) {
diff --git a/src/components/ChatWidgetII.vue b/src/components/ChatWidgetII.vue
index d86feda..3766a33 100644
--- a/src/components/ChatWidgetII.vue
+++ b/src/components/ChatWidgetII.vue
@@ -1,3 +1,13 @@
\ No newline at end of file
+-->
+
+
+
+
+
\ No newline at end of file
diff --git a/src/obp/common-functions.ts b/src/obp/common-functions.ts
index d9b8f7a..2c82ef9 100644
--- a/src/obp/common-functions.ts
+++ b/src/obp/common-functions.ts
@@ -86,14 +86,16 @@ export async function getOpeyJWT() {
}
export async function getOpeyConsent() {
- const response = await axios.post('/api/opey/consent').catch((error) => {
+ await axios.post('/api/opey/consent').catch((error) => {
if (error.response) {
throw new Error(`getOpeyConsent returned an error: ${error.toJSON()}`);
} else {
throw new Error(`getOpeyConsent returned an error: ${error.message}`);
}
+ }).then((response) => {
+ console.log(response)
+ return response
});
- return response
}
export async function answerOpeyConsentChallenge(answerBody: any) {
diff --git a/test/opey.test.ts b/test/opey.test.ts
new file mode 100644
index 0000000..f490bd3
--- /dev/null
+++ b/test/opey.test.ts
@@ -0,0 +1,41 @@
+
+import { beforeAll, describe, afterAll, it, expect, expectTypeOf, test } from 'vitest';
+import { OpeyController } from "../server/controllers/OpeyController";
+import app from '../server/app';
+import { UserInput } from '../server/schema/OpeySchema';
+import { v6 as uuid6 } from 'uuid';
+
+const BEFORE_ALL_TIMEOUT = 30000; // 30 sec
+
+
+let server;
+
+beforeAll(() => {
+ // Start the Express app on a test port
+ server = app.listen(3000);
+});
+
+afterAll(() => {
+ // Close the server after tests
+ server.close();
+});
+
+
+describe('POST /api/opey/stream', () => {
+ let response: Response;
+
+ it('Should return 200', async () => {
+ let userInput: UserInput = {
+ message: "Hello Opey",
+ is_tool_call_approval: false
+ }
+ const response = await fetch("http://localhost:3000/api/opey/stream", {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(userInput)
+ });
+ expect(response.status).toBe(200);
+ });
+});
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 5aa99f6..43e591a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,51 @@
# yarn lockfile v1
+"@ai-sdk/provider-utils@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.5.tgz"
+ integrity sha512-PcNR7E4ovZGV/J47gUqaFlvzorgca6uUfN5WzfXJSFWeOeLunN+oxRVwgUOwj0zbmO0yGQTHQD+FHVw8s3Rz8w==
+ dependencies:
+ "@ai-sdk/provider" "1.0.6"
+ eventsource-parser "^3.0.0"
+ nanoid "^3.3.8"
+ secure-json-parse "^2.7.0"
+
+"@ai-sdk/provider@1.0.6":
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.6.tgz"
+ integrity sha512-hwj/gFNxpDgEfTaYzCYoslmw01IY9kWLKl/wf8xuPvHtQIzlfXWmmUwc8PnCwxyt8cKzIuV0dfUghCf68HQ0SA==
+ dependencies:
+ json-schema "^0.4.0"
+
+"@ai-sdk/react@1.1.6":
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-1.1.6.tgz"
+ integrity sha512-kP5pimLyNWldw8+0j3ym+AACFEXcQHdELNtk45wDJA3HoH486x/zffdn7yLc3c1DOu5apew+COl8CNL4A+2E4g==
+ dependencies:
+ "@ai-sdk/provider-utils" "2.1.5"
+ "@ai-sdk/ui-utils" "1.1.6"
+ swr "^2.2.5"
+ throttleit "2.1.0"
+
+"@ai-sdk/ui-utils@1.1.6":
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.1.6.tgz"
+ integrity sha512-YAwZhFwpIcvWERIjkET2o2MAwMFfJG18WdtcIjtxxMW7hA0bt5cliOV78DVcwRrxqJ2IKBlxaFmwUjW6M4SdOQ==
+ dependencies:
+ "@ai-sdk/provider" "1.0.6"
+ "@ai-sdk/provider-utils" "2.1.5"
+ zod-to-json-schema "^3.24.1"
+
+"@ai-sdk/vue@^1.1.6":
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/@ai-sdk/vue/-/vue-1.1.6.tgz"
+ integrity sha512-lo9WslJn/E52qHrmQj2PM74LBpzctqjHg94gQOz4YdlQLsCDG5BmD4o3dnRm1yKfYQZkB31XYTfOComo9gki2Q==
+ dependencies:
+ "@ai-sdk/provider-utils" "2.1.5"
+ "@ai-sdk/ui-utils" "1.1.6"
+ swrv "^1.0.4"
+
"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0":
version "2.3.0"
resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz"
@@ -698,6 +743,11 @@
resolved "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz"
integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==
+"@opentelemetry/api@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz"
+ integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==
+
"@pkgjs/parseargs@^0.11.0":
version "0.11.0"
resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz"
@@ -834,6 +884,11 @@
dependencies:
"@types/node" "*"
+"@types/diff-match-patch@^1.0.36":
+ version "1.0.36"
+ resolved "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz"
+ integrity sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==
+
"@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6":
version "1.0.6"
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz"
@@ -1306,6 +1361,18 @@ agent-base@^7.1.0, agent-base@^7.1.2:
resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz"
integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==
+ai@^4.1.9:
+ version "4.1.9"
+ resolved "https://registry.npmjs.org/ai/-/ai-4.1.9.tgz"
+ integrity sha512-EUc21jyV/2Fv0hEd4toLxQMxjTXBWjKnw16tpto12Vrg/EvkmfVSEvtwXDa+J70iPDmASxL10VKmJk/wnb6bZA==
+ dependencies:
+ "@ai-sdk/provider" "1.0.6"
+ "@ai-sdk/provider-utils" "2.1.5"
+ "@ai-sdk/react" "1.1.6"
+ "@ai-sdk/ui-utils" "1.1.6"
+ "@opentelemetry/api" "1.9.0"
+ jsondiffpatch "0.6.0"
+
ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
@@ -1331,6 +1398,11 @@ alien-signals@^0.4.9:
resolved "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz"
integrity sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==
+ansi-colors@^4.1.3:
+ version "4.1.3"
+ resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz"
+ integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
+
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
@@ -1572,6 +1644,11 @@ browser-resolve@^2.0.0:
dependencies:
resolve "^1.17.0"
+browser-stdout@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
browserify-aes@^1.0.0, browserify-aes@^1.0.4:
version "1.2.0"
resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz"
@@ -1733,6 +1810,11 @@ callsites@^3.0.0:
resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+camelcase@^6.0.0:
+ version "6.3.0"
+ resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
caniuse-lite@^1.0.30001669:
version "1.0.30001683"
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz"
@@ -1751,7 +1833,7 @@ chai@^4.3.10:
pathval "^1.1.1"
type-detect "^4.1.0"
-chalk@^4.0.0:
+chalk@^4.0.0, chalk@^4.1.0:
version "4.1.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -1759,6 +1841,11 @@ chalk@^4.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+chalk@^5.3.0:
+ version "5.4.1"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz"
+ integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==
+
check-error@^1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz"
@@ -1795,7 +1882,7 @@ cheerio@^1.0.0:
undici "^6.19.5"
whatwg-mimetype "^4.0.0"
-chokidar@^3.6.0:
+chokidar@^3.5.3, chokidar@^3.6.0:
version "3.6.0"
resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"
integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
@@ -1832,6 +1919,15 @@ class-validator@^0.14.0:
libphonenumber-js "^1.10.14"
validator "^13.7.0"
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
clsx@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz"
@@ -2148,6 +2244,13 @@ debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3
dependencies:
ms "2.1.2"
+debug@^4.3.5:
+ version "4.4.0"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz"
+ integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
+ dependencies:
+ ms "^2.1.3"
+
debug@^4.3.7:
version "4.4.0"
resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz"
@@ -2169,6 +2272,11 @@ debug@2.6.9:
dependencies:
ms "2.0.0"
+decamelize@^4.0.0:
+ version "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.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz"
@@ -2219,6 +2327,11 @@ depd@~1.1.2:
resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
+dequal@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz"
+ integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
+
des.js@^1.0.0:
version "1.1.0"
resolved "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz"
@@ -2240,6 +2353,11 @@ dezalgo@^1.0.4:
asap "^2.0.0"
wrappy "1"
+diff-match-patch@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz"
+ integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==
+
diff-sequences@^29.4.3, diff-sequences@^29.6.3:
version "29.6.3"
resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz"
@@ -2250,6 +2368,11 @@ diff@^4.0.1:
resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+diff@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz"
+ integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==
+
diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz"
@@ -2532,7 +2655,7 @@ esbuild@^0.18.10:
"@esbuild/win32-ia32" "0.18.20"
"@esbuild/win32-x64" "0.18.20"
-escalade@^3.2.0:
+escalade@^3.1.1, escalade@^3.2.0:
version "3.2.0"
resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"
integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
@@ -2721,6 +2844,11 @@ events@^3.0.0:
resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+eventsource-parser@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz"
+ integrity sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==
+
evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz"
@@ -2880,6 +3008,11 @@ flat-cache@^4.0.0:
flatted "^3.2.9"
keyv "^4.5.4"
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
flatted@^3.2.9:
version "3.3.2"
resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz"
@@ -2958,6 +3091,11 @@ gensync@^1.0.0-beta.2:
resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
get-func-name@^2.0.0, get-func-name@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz"
@@ -3008,7 +3146,7 @@ glob-parent@~5.1.2:
dependencies:
is-glob "^4.0.1"
-glob@^10.2.2, glob@^10.3.3:
+glob@^10.2.2, glob@^10.3.3, glob@^10.4.5:
version "10.4.5"
resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz"
integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
@@ -3359,6 +3497,11 @@ is-number@^7.0.0:
resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
is-potential-custom-element-name@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz"
@@ -3382,6 +3525,11 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3:
gopd "^1.0.1"
has-tostringtag "^1.0.0"
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
@@ -3519,6 +3667,11 @@ json-schema-traverse@^1.0.0:
resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz"
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+json-schema@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz"
+ integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
+
json-source-map@^0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz"
@@ -3534,6 +3687,15 @@ json5@^2.2.3:
resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+jsondiffpatch@0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz"
+ integrity sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==
+ dependencies:
+ "@types/diff-match-patch" "^1.0.36"
+ chalk "^5.3.0"
+ diff-match-patch "^1.0.5"
+
"jsonpath-plus@^9.0.0 || ^10.2.0":
version "10.2.0"
resolved "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.2.0.tgz"
@@ -3745,6 +3907,14 @@ lodash@*, lodash@^4.17.21:
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+log-symbols@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz"
+ integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+ dependencies:
+ chalk "^4.1.0"
+ is-unicode-supported "^0.1.0"
+
loupe@^2.3.6:
version "2.3.6"
resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz"
@@ -3918,6 +4088,13 @@ minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
+minimatch@^5.1.6:
+ version "5.1.6"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
minimatch@^9.0.0, minimatch@^9.0.3, minimatch@^9.0.4, minimatch@^9.0.5:
version "9.0.5"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"
@@ -3959,6 +4136,32 @@ mlly@^1.4.0, mlly@^1.7.2, mlly@^1.7.3:
pkg-types "^1.2.1"
ufo "^1.5.4"
+mocha@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz"
+ integrity sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==
+ dependencies:
+ ansi-colors "^4.1.3"
+ browser-stdout "^1.3.1"
+ chokidar "^3.5.3"
+ debug "^4.3.5"
+ diff "^5.2.0"
+ escape-string-regexp "^4.0.0"
+ find-up "^5.0.0"
+ glob "^10.4.5"
+ he "^1.2.0"
+ js-yaml "^4.1.0"
+ log-symbols "^4.1.0"
+ minimatch "^5.1.6"
+ ms "^2.1.3"
+ serialize-javascript "^6.0.2"
+ strip-json-comments "^3.1.1"
+ supports-color "^8.1.1"
+ workerpool "^6.5.1"
+ yargs "^17.7.2"
+ yargs-parser "^21.1.1"
+ yargs-unparser "^2.0.0"
+
ms@^2.1.1, ms@2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
@@ -3997,10 +4200,10 @@ multer@*, multer@^1.4.5-lts.1:
type-is "^1.6.4"
xtend "^4.0.0"
-nanoid@^3.3.7:
- version "3.3.7"
- resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz"
- integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+nanoid@^3.3.7, nanoid@^3.3.8:
+ version "3.3.8"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz"
+ integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
natural-compare-lite@^1.4.0:
version "1.4.0"
@@ -4511,7 +4714,7 @@ random-bytes@~1.0.0:
resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz"
integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
@@ -4546,6 +4749,11 @@ react-is@^18.0.0:
resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz"
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
+"react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19 || ^19.0.0-rc":
+ version "19.0.0"
+ resolved "https://registry.npmjs.org/react/-/react-19.0.0.tgz"
+ integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==
+
read-package-json-fast@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz"
@@ -4609,6 +4817,11 @@ reflect-metadata@^0.1.13:
resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz"
integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
require-from-string@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
@@ -4716,6 +4929,11 @@ scule@^1.3.0:
resolved "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz"
integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==
+secure-json-parse@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz"
+ integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==
+
semver@^6.3.1:
version "6.3.1"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
@@ -4774,6 +4992,13 @@ send@0.19.0:
range-parser "~1.2.1"
statuses "2.0.1"
+serialize-javascript@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz"
+ integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==
+ dependencies:
+ randombytes "^2.1.0"
+
serve-static@1.16.2:
version "1.16.2"
resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz"
@@ -4998,7 +5223,16 @@ string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
-string-width@^4.1.0:
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -5077,7 +5311,7 @@ superagent@^8.0.9:
qs "^6.11.0"
semver "^7.3.8"
-superagent@^9.0.0:
+superagent@^9.0.0, superagent@^9.0.1:
version "9.0.2"
resolved "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz"
integrity sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==
@@ -5092,6 +5326,14 @@ superagent@^9.0.0:
mime "2.6.0"
qs "^6.11.0"
+supertest@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz"
+ integrity sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==
+ dependencies:
+ methods "^1.1.2"
+ superagent "^9.0.1"
+
supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
@@ -5099,6 +5341,13 @@ supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
+supports-color@^8.1.1:
+ version "8.1.1"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
@@ -5129,6 +5378,19 @@ svg-tags@^1.0.0:
resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz"
integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==
+swr@^2.2.5:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/swr/-/swr-2.3.0.tgz"
+ integrity sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==
+ dependencies:
+ dequal "^2.0.3"
+ use-sync-external-store "^1.4.0"
+
+swrv@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/swrv/-/swrv-1.0.4.tgz"
+ integrity sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==
+
symbol-tree@^3.2.4:
version "3.2.4"
resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz"
@@ -5147,6 +5409,11 @@ template-url@^1.0.0:
resolved "https://registry.npmjs.org/template-url/-/template-url-1.0.0.tgz"
integrity sha512-QUjZNE7yTdIzB91sITTSYcSX5GRF5FulKvIYCqV5350NfSNfiuuCYQIJZ5PIN7k/uJ+kpurEEv9hFqRRc+JilA==
+throttleit@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz"
+ integrity sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==
+
timers-browserify@^2.0.4:
version "2.0.12"
resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz"
@@ -5422,6 +5689,11 @@ url@^0.11.0:
punycode "1.3.2"
querystring "0.2.0"
+use-sync-external-store@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz"
+ integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==
+
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
@@ -5641,7 +5913,7 @@ vue-tsc@^2.0.0:
"@volar/typescript" "~2.4.11"
"@vue/language-core" "2.2.0"
-"vue@^2.6.14 || ^3.5.11", vue@^3, vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.5.1, "vue@2 || 3", vue@2||3, vue@3.5.13:
+"vue@^2.6.14 || ^3.5.11", vue@^3, vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.3.4, vue@^3.5.1, "vue@>=3.2.26 < 4", "vue@2 || 3", vue@2||3, vue@3.5.13:
version "3.5.13"
resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz"
integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==
@@ -5733,6 +6005,11 @@ word-wrap@^1.2.5:
resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+workerpool@^6.5.1:
+ version "6.5.1"
+ resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz"
+ integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==
+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
@@ -5742,6 +6019,15 @@ word-wrap@^1.2.5:
string-width "^4.1.0"
strip-ansi "^6.0.0"
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz"
@@ -5801,6 +6087,11 @@ xtend@^4.0.0, xtend@^4.0.2:
resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
yallist@^3.0.2:
version "3.1.1"
resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
@@ -5816,6 +6107,34 @@ yallist@4.0.0:
resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs-unparser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz"
+ integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+ dependencies:
+ camelcase "^6.0.0"
+ decamelize "^4.0.0"
+ flat "^5.0.2"
+ is-plain-obj "^2.1.0"
+
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
yeast@0.1.2:
version "0.1.2"
resolved "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz"
@@ -5845,3 +6164,13 @@ zimmerframe@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz"
integrity sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==
+
+zod-to-json-schema@^3.24.1:
+ version "3.24.1"
+ resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz"
+ integrity sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==
+
+zod@^3.0.0, zod@^3.24.1:
+ version "3.24.1"
+ resolved "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz"
+ integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==