diff --git a/.eslintrc.json b/.eslintrc.json index df38364f..29ac80c9 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,9 @@ { - "extends": ["next/core-web-vitals", "next/typescript"], - "rules": { - "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }] - } + "extends": ["next/core-web-vitals", "next/typescript"], + "rules": { + "@typescript-eslint/no-unused-vars": [ + "error", + { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" } + ] + } } diff --git a/agent-docs/biome.json b/agent-docs/biome.json index 41488d5b..d29f387a 100644 --- a/agent-docs/biome.json +++ b/agent-docs/biome.json @@ -1,27 +1,7 @@ { - "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json", - "organizeImports": { - "enabled": true - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true - } - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 2 - }, - "javascript": { - "formatter": { - "quoteStyle": "single", - "trailingCommas": "es5", - "semicolons": "always" - } - }, - "files": { - "ignore": [".agentuity/**"] - } + "extends": "//", + "root": false, + "files": { + "includes": ["**", "!**/.agentuity/**", "!**/.next/**"] + } } diff --git a/agent-docs/config.ts b/agent-docs/config.ts index 030d49d0..a84d0b76 100644 --- a/agent-docs/config.ts +++ b/agent-docs/config.ts @@ -1,2 +1,2 @@ export const VECTOR_STORE_NAME = process.env.VECTOR_STORE_NAME || 'docs'; -export const vectorSearchNumber = 10; \ No newline at end of file +export const vectorSearchNumber = 10; diff --git a/agent-docs/index.ts b/agent-docs/index.ts index 8522d302..4a38c2b4 100644 --- a/agent-docs/index.ts +++ b/agent-docs/index.ts @@ -1,52 +1,52 @@ import { runner } from '@agentuity/sdk'; declare global { - namespace NodeJS { - interface Process { - isBun: boolean; - } - } + namespace NodeJS { + interface Process { + isBun: boolean; + } + } } if (!process.env.AGENTUITY_API_KEY && !process.env.AGENTUITY_SDK_KEY) { - console.error( - '\x1b[31m[ERROR] AGENTUITY_API_KEY or AGENTUITY_SDK_KEY is not set. This should have been set automatically by the Agentuity CLI or picked up from the .env file.\x1b[0m' - ); + console.error( + '\x1b[31m[ERROR] AGENTUITY_API_KEY or AGENTUITY_SDK_KEY is not set. This should have been set automatically by the Agentuity CLI or picked up from the .env file.\x1b[0m' + ); - const cmd = process.env._ || ''; + const cmd = process.env._ || ''; - if (cmd.endsWith('node')) { - console.error( - '\x1b[31m[ERROR] Re-run the command with `node --env-file .env index.ts`\x1b[0m' - ); - } + if (cmd.endsWith('node')) { + console.error( + '\x1b[31m[ERROR] Re-run the command with `node --env-file .env index.ts`\x1b[0m' + ); + } - process.exit(1); + process.exit(1); } if (!process.env.AGENTUITY_URL) { - console.warn( - '\x1b[31m[WARN] You are running this agent outside of the Agentuity environment. Any automatic Agentuity features will be disabled.\x1b[0m' - ); - - if (process.isBun) { - console.warn( - '\x1b[31m[WARN] Recommend running `agentuity dev` to run your project locally instead of `bun run start`.\x1b[0m' - ); - } else { - console.warn( - '\x1b[31m[WARN] Recommend running `agentuity dev` to run your project locally instead of `npm start`.\x1b[0m' - ); - } + console.warn( + '\x1b[31m[WARN] You are running this agent outside of the Agentuity environment. Any automatic Agentuity features will be disabled.\x1b[0m' + ); + + if (process.isBun) { + console.warn( + '\x1b[31m[WARN] Recommend running `agentuity dev` to run your project locally instead of `bun run start`.\x1b[0m' + ); + } else { + console.warn( + '\x1b[31m[WARN] Recommend running `agentuity dev` to run your project locally instead of `npm start`.\x1b[0m' + ); + } } runner(true, import.meta.dirname).catch((err) => { - if (err instanceof Error) { - console.error(err.message); - console.error(err.stack); - } else { - console.error(err); - } - - process.exit(1); + if (err instanceof Error) { + console.error(err.message); + console.error(err.stack); + } else { + console.error(err); + } + + process.exit(1); }); diff --git a/agent-docs/package-lock.json b/agent-docs/package-lock.json new file mode 100644 index 00000000..09648abf --- /dev/null +++ b/agent-docs/package-lock.json @@ -0,0 +1,5046 @@ +{ + "name": "agent-docs", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "agent-docs", + "version": "0.0.1", + "dependencies": { + "@agentuity/sdk": "^0.0.124", + "@ai-sdk/openai": "^1.3.22", + "ai": "^4.3.16", + "gray-matter": "^4.0.3", + "langchain": "^0.3.28", + "vitest": "^3.2.3" + }, + "devDependencies": { + "@biomejs/biome": "2.1.2", + "@types/bun": "^1.2.16" + }, + "peerDependencies": { + "typescript": "^5" + } + }, + "node_modules/@agentuity/sdk": { + "version": "0.0.124", + "resolved": "https://registry.npmjs.org/@agentuity/sdk/-/sdk-0.0.124.tgz", + "integrity": "sha512-bikpoDWzulygUuifPtMzBBZtyGs2stcyD4KjwWmbt8Oi/HSEuXEOPLVH1OxuPLmNccePqPVpkWWkdrEdU2bxwA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.57.2", + "@opentelemetry/auto-instrumentations-node": "^0.56.1", + "@opentelemetry/core": "^1.21.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.57.2", + "@opentelemetry/exporter-metrics-otlp-http": "^0.57.2", + "@opentelemetry/exporter-trace-otlp-http": "^0.57.2", + "@opentelemetry/host-metrics": "^0.35.5", + "@opentelemetry/resources": "^1.30.1", + "@opentelemetry/sdk-logs": "^0.57.2", + "@opentelemetry/sdk-metrics": "^1.30.1", + "@opentelemetry/sdk-node": "^0.57.2", + "@opentelemetry/semantic-conventions": "^1.30.0", + "js-yaml": "^4.1.0", + "mailparser": "^3.7.3", + "nodemailer": "^7.0.3" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "typescript": "^5" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "1.3.24", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.3.24.tgz", + "integrity": "sha512-GYXnGJTHRTZc4gJMSmFRgEQudjqd4PUN0ZjQhPwOAYH1yOAvQoG/Ikqs+HyISRbLPCrhbZnPKCNHuRU4OfpW0Q==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", + "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", + "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", + "integrity": "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "2.2.8", + "@ai-sdk/ui-utils": "1.2.11", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/ui-utils": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", + "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@biomejs/biome": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.1.2.tgz", + "integrity": "sha512-yq8ZZuKuBVDgAS76LWCfFKHSYIAgqkxVB3mGVVpOe2vSkUTs7xG46zXZeNPRNVjiJuw0SZ3+J2rXiYx0RUpfGg==", + "dev": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.1.2", + "@biomejs/cli-darwin-x64": "2.1.2", + "@biomejs/cli-linux-arm64": "2.1.2", + "@biomejs/cli-linux-arm64-musl": "2.1.2", + "@biomejs/cli-linux-x64": "2.1.2", + "@biomejs/cli-linux-x64-musl": "2.1.2", + "@biomejs/cli-win32-arm64": "2.1.2", + "@biomejs/cli-win32-x64": "2.1.2" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.1.2.tgz", + "integrity": "sha512-leFAks64PEIjc7MY/cLjE8u5OcfBKkcDB0szxsWUB4aDfemBep1WVKt0qrEyqZBOW8LPHzrFMyDl3FhuuA0E7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.1.2.tgz", + "integrity": "sha512-Nmmv7wRX5Nj7lGmz0FjnWdflJg4zii8Ivruas6PBKzw5SJX/q+Zh2RfnO+bBnuKLXpj8kiI2x2X12otpH6a32A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.1.2.tgz", + "integrity": "sha512-NWNy2Diocav61HZiv2enTQykbPP/KrA/baS7JsLSojC7Xxh2nl9IczuvE5UID7+ksRy2e7yH7klm/WkA72G1dw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.1.2.tgz", + "integrity": "sha512-qgHvafhjH7Oca114FdOScmIKf1DlXT1LqbOrrbR30kQDLFPEOpBG0uzx6MhmsrmhGiCFCr2obDamu+czk+X0HQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.1.2.tgz", + "integrity": "sha512-Km/UYeVowygTjpX6sGBzlizjakLoMQkxWbruVZSNE6osuSI63i4uCeIL+6q2AJlD3dxoiBJX70dn1enjQnQqwA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.1.2.tgz", + "integrity": "sha512-xlB3mU14ZUa3wzLtXfmk2IMOGL+S0aHFhSix/nssWS/2XlD27q+S6f0dlQ8WOCbYoXcuz8BCM7rCn2lxdTrlQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.1.2.tgz", + "integrity": "sha512-G8KWZli5ASOXA3yUQgx+M4pZRv3ND16h77UsdunUL17uYpcL/UC7RkWTdkfvMQvogVsAuz5JUcBDjgZHXxlKoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.1.2.tgz", + "integrity": "sha512-9zajnk59PMpjBkty3bK2IrjUsUHvqe9HWwyAWQBjGLE7MIBjbX2vwv1XPEhmO2RRuGoTkVx3WCanHrjAytICLA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@cfworker/json-schema": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz", + "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", + "license": "MIT", + "peer": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz", + "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@langchain/core": { + "version": "0.3.72", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.72.tgz", + "integrity": "sha512-WsGWVZYnlKffj2eEfDocPNiaTRoxyYiLSQdQ7oxZvxGZBqo/90vpjbC33UGK1uPNBM4kT+pkdaol/MnvKUh8TQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@cfworker/json-schema": "^4.0.2", + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": "^0.3.46", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^10.0.0", + "zod": "^3.25.32", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/openai": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.6.9.tgz", + "integrity": "sha512-Dl+YVBTFia7WE4/jFemQEVchPbsahy/dD97jo6A9gLnYfTkWa/jh8Q78UjHQ3lobif84j2ebjHPcDHG1L0NUWg==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12", + "openai": "5.12.2", + "zod": "^3.25.32" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.3.68 <0.4.0" + } + }, + "node_modules/@langchain/textsplitters": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.1.0.tgz", + "integrity": "sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.21 <0.4.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.56.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.56.1.tgz", + "integrity": "sha512-4cK0+unfkXRRbQQg2r9K3ki8JlE0j9Iw8+4DZEkChShAnmviiE+/JMgHGvK+VVcLrSlgV6BBHv4+ZTLukQwhkA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/instrumentation-amqplib": "^0.46.1", + "@opentelemetry/instrumentation-aws-lambda": "^0.50.3", + "@opentelemetry/instrumentation-aws-sdk": "^0.49.1", + "@opentelemetry/instrumentation-bunyan": "^0.45.1", + "@opentelemetry/instrumentation-cassandra-driver": "^0.45.1", + "@opentelemetry/instrumentation-connect": "^0.43.1", + "@opentelemetry/instrumentation-cucumber": "^0.14.1", + "@opentelemetry/instrumentation-dataloader": "^0.16.1", + "@opentelemetry/instrumentation-dns": "^0.43.1", + "@opentelemetry/instrumentation-express": "^0.47.1", + "@opentelemetry/instrumentation-fastify": "^0.44.2", + "@opentelemetry/instrumentation-fs": "^0.19.1", + "@opentelemetry/instrumentation-generic-pool": "^0.43.1", + "@opentelemetry/instrumentation-graphql": "^0.47.1", + "@opentelemetry/instrumentation-grpc": "^0.57.1", + "@opentelemetry/instrumentation-hapi": "^0.45.2", + "@opentelemetry/instrumentation-http": "^0.57.1", + "@opentelemetry/instrumentation-ioredis": "^0.47.1", + "@opentelemetry/instrumentation-kafkajs": "^0.7.1", + "@opentelemetry/instrumentation-knex": "^0.44.1", + "@opentelemetry/instrumentation-koa": "^0.47.1", + "@opentelemetry/instrumentation-lru-memoizer": "^0.44.1", + "@opentelemetry/instrumentation-memcached": "^0.43.1", + "@opentelemetry/instrumentation-mongodb": "^0.52.0", + "@opentelemetry/instrumentation-mongoose": "^0.46.1", + "@opentelemetry/instrumentation-mysql": "^0.45.1", + "@opentelemetry/instrumentation-mysql2": "^0.45.2", + "@opentelemetry/instrumentation-nestjs-core": "^0.44.1", + "@opentelemetry/instrumentation-net": "^0.43.1", + "@opentelemetry/instrumentation-pg": "^0.51.1", + "@opentelemetry/instrumentation-pino": "^0.46.1", + "@opentelemetry/instrumentation-redis": "^0.46.1", + "@opentelemetry/instrumentation-redis-4": "^0.46.1", + "@opentelemetry/instrumentation-restify": "^0.45.1", + "@opentelemetry/instrumentation-router": "^0.44.1", + "@opentelemetry/instrumentation-socket.io": "^0.46.1", + "@opentelemetry/instrumentation-tedious": "^0.18.1", + "@opentelemetry/instrumentation-undici": "^0.10.1", + "@opentelemetry/instrumentation-winston": "^0.44.1", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.30.1", + "@opentelemetry/resource-detector-aws": "^1.12.0", + "@opentelemetry/resource-detector-azure": "^0.6.1", + "@opentelemetry/resource-detector-container": "^0.6.1", + "@opentelemetry/resource-detector-gcp": "^0.33.1", + "@opentelemetry/resources": "^1.24.0", + "@opentelemetry/sdk-node": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz", + "integrity": "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.57.2.tgz", + "integrity": "sha512-eovEy10n3umjKJl2Ey6TLzikPE+W4cUQ4gCwgGP1RqzTGtgDra0WjIqdy29ohiUKfvmbiL3MndZww58xfIvyFw==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-grpc-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2", + "@opentelemetry/sdk-logs": "0.57.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.57.2.tgz", + "integrity": "sha512-0rygmvLcehBRp56NQVLSleJ5ITTduq/QfU7obOkyWgPpFHulwpw2LYTqNIz5TczKZuy5YY+5D3SDnXZL1tXImg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2", + "@opentelemetry/sdk-logs": "0.57.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.57.2.tgz", + "integrity": "sha512-ta0ithCin0F8lu9eOf4lEz9YAScecezCHkMMyDkvd9S7AnZNX5ikUmC5EQOQADU+oCcgo/qkQIaKcZvQ0TYKDw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-logs": "0.57.2", + "@opentelemetry/sdk-trace-base": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.57.2.tgz", + "integrity": "sha512-r70B8yKR41F0EC443b5CGB4rUaOMm99I5N75QQt6sHKxYDzSEc6gm48Diz1CI1biwa5tDPznpylTrywO/pT7qw==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.57.2", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-grpc-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-metrics": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.57.2.tgz", + "integrity": "sha512-ttb9+4iKw04IMubjm3t0EZsYRNWr3kg44uUuzfo9CaccYlOh8cDooe4QObDUkvx9d5qQUrbEckhrWKfJnKhemA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-metrics": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.57.2.tgz", + "integrity": "sha512-HX068Q2eNs38uf7RIkNN9Hl4Ynl+3lP0++KELkXMCpsCbFO03+0XNNZ1SkwxPlP9jrhQahsMPMkzNXpq3fKsnw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.57.2", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-metrics": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.57.2.tgz", + "integrity": "sha512-VqIqXnuxWMWE/1NatAGtB1PvsQipwxDcdG4RwA/umdBcW3/iOHp0uejvFHTRN2O78ZPged87ErJajyUBPUhlDQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-metrics": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.57.2.tgz", + "integrity": "sha512-gHU1vA3JnHbNxEXg5iysqCWxN9j83d7/epTYBZflqQnTyCC4N7yZXn/dMM+bEmyhQPGjhCkNZLx4vZuChH1PYw==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-grpc-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.57.2.tgz", + "integrity": "sha512-sB/gkSYFu+0w2dVQ0PWY9fAMl172PKMZ/JrHkkW8dmjCL0CYkmXeE+ssqIL/yBUTPOvpLIpenX5T9RwXRBW/3g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.57.2.tgz", + "integrity": "sha512-awDdNRMIwDvUtoRYxRhja5QYH6+McBLtoz1q9BeEsskhZcrGmH/V1fWpGx8n+Rc+542e8pJA6y+aullbIzQmlw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.30.1.tgz", + "integrity": "sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/host-metrics": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@opentelemetry/host-metrics/-/host-metrics-0.35.5.tgz", + "integrity": "sha512-Zf9Cjl7H6JalspnK5KD1+LLKSVecSinouVctNmUxRy+WP+20KwHq+qg4hADllkEmJ99MZByLLmEmzrr7s92V6g==", + "license": "Apache-2.0", + "dependencies": { + "systeminformation": "5.23.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.46.1.tgz", + "integrity": "sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.50.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.50.3.tgz", + "integrity": "sha512-kotm/mRvSWUauudxcylc5YCDei+G/r+jnOH6q5S99aPLQ/Ms8D2yonMIxEJUILIPlthEmwLYxkw3ualWzMjm/A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/aws-lambda": "8.10.147" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.49.1.tgz", + "integrity": "sha512-Vbj4BYeV/1K4Pbbfk+gQ8gwYL0w+tBeUwG88cOxnF7CLPO1XnskGV8Q3Gzut2Ah/6Dg17dBtlzEqL3UiFP2Z6A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/propagation-utils": "^0.30.16", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.45.1.tgz", + "integrity": "sha512-T9POV9ccS41UjpsjLrJ4i0m8LfplBiN3dMeH9XZ2btiDrjoaWtDrst6tNb1avetBjkeshOuBp1EWKP22EVSr0g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.57.1", + "@opentelemetry/instrumentation": "^0.57.1", + "@types/bunyan": "1.8.11" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.45.1.tgz", + "integrity": "sha512-RqnP0rK2hcKK1AKcmYvedLiL6G5TvFGiSUt2vI9wN0cCBdTt9Y9+wxxY19KoGxq7e9T/aHow6P5SUhCVI1sHvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.43.1.tgz", + "integrity": "sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.38" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.14.1.tgz", + "integrity": "sha512-ybO+tmH85pDO0ywTskmrMtZcccKyQr7Eb7wHy1keR2HFfx46SzZbjHo1AuGAX//Hook3gjM7+w211gJ2bwKe1Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.16.1.tgz", + "integrity": "sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.43.1.tgz", + "integrity": "sha512-e/tMZYU1nc+k+J3259CQtqVZIPsPRSLNoAQbGEmSKrjLEY/KJSbpBZ17lu4dFVBzqoF1cZYIZxn9WPQxy4V9ng==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.47.1.tgz", + "integrity": "sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.44.2.tgz", + "integrity": "sha512-arSp97Y4D2NWogoXRb8CzFK3W2ooVdvqRRtQDljFt9uC3zI6OuShgey6CVFC0JxT1iGjkAr1r4PDz23mWrFULQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.19.1.tgz", + "integrity": "sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.43.1.tgz", + "integrity": "sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.47.1.tgz", + "integrity": "sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.57.2.tgz", + "integrity": "sha512-TR6YQA67cLSZzdxbf2SrbADJy2Y8eBW1+9mF15P0VK2MYcpdoUSmQTF1oMkBwa3B9NwqDFA2fq7wYTTutFQqaQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "0.57.2", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.45.2.tgz", + "integrity": "sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.57.2.tgz", + "integrity": "sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/instrumentation": "0.57.2", + "@opentelemetry/semantic-conventions": "1.28.0", + "forwarded-parse": "2.1.2", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.47.1.tgz", + "integrity": "sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.7.1.tgz", + "integrity": "sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.44.1.tgz", + "integrity": "sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.47.1.tgz", + "integrity": "sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.44.1.tgz", + "integrity": "sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.43.1.tgz", + "integrity": "sha512-rK5YWC22gmsLp2aEbaPk5F+9r6BFFZuc9GTnW/ErrWpz2XNHUgeFInoPDg4t+Trs8OttIfn8XwkfFkSKqhxanw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.52.0.tgz", + "integrity": "sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.46.1.tgz", + "integrity": "sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.45.1.tgz", + "integrity": "sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/mysql": "2.15.26" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.45.2.tgz", + "integrity": "sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.44.1.tgz", + "integrity": "sha512-4TXaqJK27QXoMqrt4+hcQ6rKFd8B6V4JfrTJKnqBmWR1cbaqd/uwyl9yxhNH1JEkyo8GaBfdpBC4ZE4FuUhPmg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.43.1.tgz", + "integrity": "sha512-TaMqP6tVx9/SxlY81dHlSyP5bWJIKq+K7vKfk4naB/LX4LBePPY3++1s0edpzH+RfwN+tEGVW9zTb9ci0up/lQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.51.1.tgz", + "integrity": "sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.46.1.tgz", + "integrity": "sha512-HB8gD/9CNAKlTV+mdZehnFC4tLUtQ7e+729oGq88e4WipxzZxmMYuRwZ2vzOA9/APtq+MRkERJ9PcoDqSIjZ+g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.57.1", + "@opentelemetry/core": "^1.25.0", + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.46.1.tgz", + "integrity": "sha512-AN7OvlGlXmlvsgbLHs6dS1bggp6Fcki+GxgYZdSrb/DB692TyfjR7sVILaCe0crnP66aJuXsg9cge3hptHs9UA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.46.1.tgz", + "integrity": "sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.45.1.tgz", + "integrity": "sha512-Zd6Go9iEa+0zcoA2vDka9r/plYKaT3BhD3ESIy4JNIzFWXeQBGbH3zZxQIsz0jbNTMEtonlymU7eTLeaGWiApA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.44.1.tgz", + "integrity": "sha512-l4T/S7ByjpY5TCUPeDe1GPns02/5BpR0jroSMexyH3ZnXJt9PtYqx1IKAlOjaFEGEOQF2tGDsMi4PY5l+fSniQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.46.1.tgz", + "integrity": "sha512-9AsCVUAHOqvfe2RM/2I0DsDnx2ihw1d5jIN4+Bly1YPFTJIbk4+bXjAkr9+X6PUfhiV5urQHZkiYYPU1Q4yzPA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.18.1.tgz", + "integrity": "sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.10.1.tgz", + "integrity": "sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.44.1.tgz", + "integrity": "sha512-iexblTsT3fP0hHUz/M1mWr+Ylg3bsYN2En/jvKXZtboW3Qkvt17HrQJYTF9leVIkXAfN97QxAcTE99YGbQW7vQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.57.1", + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.57.2.tgz", + "integrity": "sha512-XdxEzL23Urhidyebg5E6jZoaiW5ygP/mRjxLHixogbqwDy2Faduzb5N0o/Oi+XTIJu+iyxXdVORjXax+Qgfxag==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-transformer": "0.57.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.57.2.tgz", + "integrity": "sha512-USn173KTWy0saqqRB5yU9xUZ2xdgb1Rdu5IosJnm9aV4hMTuFFRTUsQxbgc24QxpCHeoKzzCSnS/JzdV0oM2iQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/otlp-exporter-base": "0.57.2", + "@opentelemetry/otlp-transformer": "0.57.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.57.2.tgz", + "integrity": "sha512-48IIRj49gbQVK52jYsw70+Jv+JbahT8BqT2Th7C4H7RCM9d0gZ5sgNPoMpWldmfjvIsSgiGJtjfk9MeZvjhoig==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-logs": "0.57.2", + "@opentelemetry/sdk-metrics": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/propagation-utils": { + "version": "0.30.16", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.16.tgz", + "integrity": "sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.30.1.tgz", + "integrity": "sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.30.1.tgz", + "integrity": "sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.30.1.tgz", + "integrity": "sha512-9l0FVP3F4+Z6ax27vMzkmhZdNtxAbDqEfy7rduzya3xFLaRiJSvOpw6cru6Edl5LwO+WvgNui+VzHa9ViE8wCg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.12.0.tgz", + "integrity": "sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-azure": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.6.1.tgz", + "integrity": "sha512-Djr31QCExVfWViaf9cGJnH+bUInD72p0GEfgDGgjCAztyvyji6WJvKjs6qmkpPN+Ig6KLk0ho2VgzT5Kdl4L2Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/resources": "^1.10.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.6.1.tgz", + "integrity": "sha512-o4sLzx149DQXDmVa8pgjBDEEKOj9SuQnkSLbjUVOpQNnn10v0WNR6wLwh30mFsK26xOJ6SpqZBGKZiT7i5MjlA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.33.1.tgz", + "integrity": "sha512-/aZJXI1rU6Eus04ih2vU0hxXAibXXMzH1WlDZ8bXcTJmhwmTY8cP392+6l7cWeMnTQOibBUz8UKV3nhcCBAefw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.57.2.tgz", + "integrity": "sha512-TXFHJ5c+BKggWbdEQ/inpgIzEmS2BGQowLE9UhsMd7YYlUfBQJ4uax0VF/B5NYigdM/75OoJGhAV3upEhK+3gg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.30.1.tgz", + "integrity": "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.57.2.tgz", + "integrity": "sha512-8BaeqZyN5sTuPBtAoY+UtKwXBdqyuRKmekN5bFzAO40CgbGzAxfTpiL3PBerT7rhZ7p2nBdq7FaMv/tBQgHE4A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/exporter-logs-otlp-grpc": "0.57.2", + "@opentelemetry/exporter-logs-otlp-http": "0.57.2", + "@opentelemetry/exporter-logs-otlp-proto": "0.57.2", + "@opentelemetry/exporter-metrics-otlp-grpc": "0.57.2", + "@opentelemetry/exporter-metrics-otlp-http": "0.57.2", + "@opentelemetry/exporter-metrics-otlp-proto": "0.57.2", + "@opentelemetry/exporter-prometheus": "0.57.2", + "@opentelemetry/exporter-trace-otlp-grpc": "0.57.2", + "@opentelemetry/exporter-trace-otlp-http": "0.57.2", + "@opentelemetry/exporter-trace-otlp-proto": "0.57.2", + "@opentelemetry/exporter-zipkin": "1.30.1", + "@opentelemetry/instrumentation": "0.57.2", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-logs": "0.57.2", + "@opentelemetry/sdk-metrics": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", + "@opentelemetry/sdk-trace-node": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", + "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.30.1.tgz", + "integrity": "sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.30.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/propagator-b3": "1.30.1", + "@opentelemetry/propagator-jaeger": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.36.0.tgz", + "integrity": "sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.48.1.tgz", + "integrity": "sha512-rGmb8qoG/zdmKoYELCBwu7vt+9HxZ7Koos3pD0+sH5fR3u3Wb/jGcpnqxcnWsPEKDUyzeLSqksN8LJtgXjqBYw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.48.1.tgz", + "integrity": "sha512-4e9WtTxrk3gu1DFE+imNJr4WsL13nWbD/Y6wQcyku5qadlKHY3OQ3LJ/INrrjngv2BJIHnIzbqMk1GTAC2P8yQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.48.1.tgz", + "integrity": "sha512-+XjmyChHfc4TSs6WUQGmVf7Hkg8ferMAE2aNYYWjiLzAS/T62uOsdfnqv+GHRjq7rKRnYh4mwWb4Hz7h/alp8A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.48.1.tgz", + "integrity": "sha512-upGEY7Ftw8M6BAJyGwnwMw91rSqXTcOKZnnveKrVWsMTF8/k5mleKSuh7D4v4IV1pLxKAk3Tbs0Lo9qYmii5mQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.48.1.tgz", + "integrity": "sha512-P9ViWakdoynYFUOZhqq97vBrhuvRLAbN/p2tAVJvhLb8SvN7rbBnJQcBu8e/rQts42pXGLVhfsAP0k9KXWa3nQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.48.1.tgz", + "integrity": "sha512-VLKIwIpnBya5/saccM8JshpbxfyJt0Dsli0PjXozHwbSVaHTvWXJH1bbCwPXxnMzU4zVEfgD1HpW3VQHomi2AQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.48.1.tgz", + "integrity": "sha512-3zEuZsXfKaw8n/yF7t8N6NNdhyFw3s8xJTqjbTDXlipwrEHo4GtIKcMJr5Ed29leLpB9AugtAQpAHW0jvtKKaQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.48.1.tgz", + "integrity": "sha512-leo9tOIlKrcBmmEypzunV/2w946JeLbTdDlwEZ7OnnsUyelZ72NMnT4B2vsikSgwQifjnJUbdXzuW4ToN1wV+Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.48.1.tgz", + "integrity": "sha512-Vy/WS4z4jEyvnJm+CnPfExIv5sSKqZrUr98h03hpAMbE2aI0aD2wvK6GiSe8Gx2wGp3eD81cYDpLLBqNb2ydwQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.48.1.tgz", + "integrity": "sha512-x5Kzn7XTwIssU9UYqWDB9VpLpfHYuXw5c6bJr4Mzv9kIv242vmJHbI5PJJEnmBYitUIfoMCODDhR7KoZLot2VQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.48.1.tgz", + "integrity": "sha512-yzCaBbwkkWt/EcgJOKDUdUpMHjhiZT/eDktOPWvSRpqrVE04p0Nd6EGV4/g7MARXXeOqstflqsKuXVM3H9wOIQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.48.1.tgz", + "integrity": "sha512-UK0WzWUjMAJccHIeOpPhPcKBqax7QFg47hwZTp6kiMhQHeOYJeaMwzeRZe1q5IiTKsaLnHu9s6toSYVUlZ2QtQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.48.1.tgz", + "integrity": "sha512-3NADEIlt+aCdCbWVZ7D3tBjBX1lHpXxcvrLt/kdXTiBrOds8APTdtk2yRL2GgmnSVeX4YS1JIf0imFujg78vpw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.48.1.tgz", + "integrity": "sha512-euuwm/QTXAMOcyiFCcrx0/S2jGvFlKJ2Iro8rsmYL53dlblp3LkUQVFzEidHhvIPPvcIsxDhl2wkBE+I6YVGzA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.48.1.tgz", + "integrity": "sha512-w8mULUjmPdWLJgmTYJx/W6Qhln1a+yqvgwmGXcQl2vFBkWsKGUBRbtLRuKJUln8Uaimf07zgJNxOhHOvjSQmBQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.48.1.tgz", + "integrity": "sha512-90taWXCWxTbClWuMZD0DKYohY1EovA+W5iytpE89oUPmT5O1HFdf8cuuVIylE6vCbrGdIGv85lVRzTcpTRZ+kA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.48.1.tgz", + "integrity": "sha512-2Gu29SkFh1FfTRuN1GR1afMuND2GKzlORQUP3mNMJbqdndOg7gNsa81JnORctazHRokiDzQ5+MLE5XYmZW5VWg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.48.1.tgz", + "integrity": "sha512-6kQFR1WuAO50bxkIlAVeIYsz3RUx+xymwhTo9j94dJ+kmHe9ly7muH23sdfWduD0BA8pD9/yhonUvAjxGh34jQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.48.1.tgz", + "integrity": "sha512-RUyZZ/mga88lMI3RlXFs4WQ7n3VyU07sPXmMG7/C1NOi8qisUg57Y7LRarqoGoAiopmGmChUhSwfpvQ3H5iGSQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.48.1.tgz", + "integrity": "sha512-8a/caCUN4vkTChxkaIJcMtwIVcBhi4X2PQRoT+yCK3qRYaZ7cURrmJFL5Ux9H9RaMIXj9RuihckdmkBX3zZsgg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.147", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.147.tgz", + "integrity": "sha512-nD0Z9fNIZcxYX5Mai2CTmFD7wX7UldCkW2ezCF8D1T5hdiLsnTWDGRpfRYntU6VjTdLQjOvyszru7I1c1oCQew==", + "license": "MIT" + }, + "node_modules/@types/bun": { + "version": "1.2.20", + "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.2.20.tgz", + "integrity": "sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bun-types": "1.2.20" + } + }, + "node_modules/@types/bunyan": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", + "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "license": "MIT" + }, + "node_modules/@types/diff-match-patch": { + "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==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mysql": { + "version": "2.15.26", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", + "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", + "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/react": { + "version": "19.1.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz", + "integrity": "sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", + "license": "MIT" + }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ai": { + "version": "4.3.19", + "resolved": "https://registry.npmjs.org/ai/-/ai-4.3.19.tgz", + "integrity": "sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8", + "@ai-sdk/react": "1.2.12", + "@ai-sdk/ui-utils": "1.2.11", + "@opentelemetry/api": "1.9.0", + "jsondiffpatch": "0.6.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bun-types": { + "version": "1.2.20", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.2.20.tgz", + "integrity": "sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + }, + "peerDependencies": { + "@types/react": "^19" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", + "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "node_modules/cliui": { + "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==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/console-table-printer": { + "version": "2.14.6", + "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.14.6.tgz", + "integrity": "sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw==", + "license": "MIT", + "dependencies": { + "simple-wcswidth": "^1.0.1" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "license": "Apache-2.0" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encoding-japanese": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-2.2.0.tgz", + "integrity": "sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==", + "license": "MIT", + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "license": "MIT", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-in-the-middle": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.2.tgz", + "integrity": "sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-tiktoken": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz", + "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1" + } + }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/jsondiffpatch": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz", + "integrity": "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==", + "license": "MIT", + "dependencies": { + "@types/diff-match-patch": "^1.0.36", + "chalk": "^5.3.0", + "diff-match-patch": "^1.0.5" + }, + "bin": { + "jsondiffpatch": "bin/jsondiffpatch.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/langchain": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.3.31.tgz", + "integrity": "sha512-C7n7WGa44RytsuxEtGcArVcXidRqzjl6UWQxaG3NdIw4gIqErWoOlNC1qADAa04H5JAOARxuE6S99+WNXB/rzA==", + "license": "MIT", + "dependencies": { + "@langchain/openai": ">=0.1.0 <0.7.0", + "@langchain/textsplitters": ">=0.0.0 <0.2.0", + "js-tiktoken": "^1.0.12", + "js-yaml": "^4.1.0", + "jsonpointer": "^5.0.1", + "langsmith": "^0.3.46", + "openapi-types": "^12.1.3", + "p-retry": "4", + "uuid": "^10.0.0", + "yaml": "^2.2.1", + "zod": "^3.25.32" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/anthropic": "*", + "@langchain/aws": "*", + "@langchain/cerebras": "*", + "@langchain/cohere": "*", + "@langchain/core": ">=0.3.58 <0.4.0", + "@langchain/deepseek": "*", + "@langchain/google-genai": "*", + "@langchain/google-vertexai": "*", + "@langchain/google-vertexai-web": "*", + "@langchain/groq": "*", + "@langchain/mistralai": "*", + "@langchain/ollama": "*", + "@langchain/xai": "*", + "axios": "*", + "cheerio": "*", + "handlebars": "^4.7.8", + "peggy": "^3.0.2", + "typeorm": "*" + }, + "peerDependenciesMeta": { + "@langchain/anthropic": { + "optional": true + }, + "@langchain/aws": { + "optional": true + }, + "@langchain/cerebras": { + "optional": true + }, + "@langchain/cohere": { + "optional": true + }, + "@langchain/deepseek": { + "optional": true + }, + "@langchain/google-genai": { + "optional": true + }, + "@langchain/google-vertexai": { + "optional": true + }, + "@langchain/google-vertexai-web": { + "optional": true + }, + "@langchain/groq": { + "optional": true + }, + "@langchain/mistralai": { + "optional": true + }, + "@langchain/ollama": { + "optional": true + }, + "@langchain/xai": { + "optional": true + }, + "axios": { + "optional": true + }, + "cheerio": { + "optional": true + }, + "handlebars": { + "optional": true + }, + "peggy": { + "optional": true + }, + "typeorm": { + "optional": true + } + } + }, + "node_modules/langsmith": { + "version": "0.3.63", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.3.63.tgz", + "integrity": "sha512-GrioB7LOUksKIYsdYbBUwyD3ezy+OAQ5eu5vebytMsX3wT0xfW4rbM+vHqCY7RgZwUYLR/RlpuC18pdO+NqugA==", + "license": "MIT", + "dependencies": { + "@types/uuid": "^10.0.0", + "chalk": "^4.1.2", + "console-table-printer": "^2.12.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "*", + "@opentelemetry/exporter-trace-otlp-proto": "*", + "@opentelemetry/sdk-trace-base": "*", + "openai": "*" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@opentelemetry/exporter-trace-otlp-proto": { + "optional": true + }, + "@opentelemetry/sdk-trace-base": { + "optional": true + }, + "openai": { + "optional": true + } + } + }, + "node_modules/langsmith/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/langsmith/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/libbase64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.3.0.tgz", + "integrity": "sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg==", + "license": "MIT" + }, + "node_modules/libmime": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.3.7.tgz", + "integrity": "sha512-FlDb3Wtha8P01kTL3P9M+ZDNDWPKPmKHWaU/cG/lg5pfuAwdflVpZE+wm9m7pKmC5ww6s+zTxBKS1p6yl3KpSw==", + "license": "MIT", + "dependencies": { + "encoding-japanese": "2.2.0", + "iconv-lite": "0.6.3", + "libbase64": "1.3.0", + "libqp": "2.1.1" + } + }, + "node_modules/libqp": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-2.1.1.tgz", + "integrity": "sha512-0Wd+GPz1O134cP62YU2GTOPNA7Qgl09XwCqM5zpBv87ERCXdfDtyKXvV7c9U22yWJh44QZqBocFnXN11K96qow==", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mailparser": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-3.7.4.tgz", + "integrity": "sha512-Beh4yyR4jLq3CZZ32asajByrXnW8dLyKCAQD3WvtTiBnMtFWhxO+wa93F6sJNjDmfjxXs4NRNjw3XAGLqZR3Vg==", + "license": "MIT", + "dependencies": { + "encoding-japanese": "2.2.0", + "he": "1.2.0", + "html-to-text": "9.0.5", + "iconv-lite": "0.6.3", + "libmime": "5.3.7", + "linkify-it": "5.0.0", + "mailsplit": "5.4.5", + "nodemailer": "7.0.4", + "punycode.js": "2.3.1", + "tlds": "1.259.0" + } + }, + "node_modules/mailparser/node_modules/nodemailer": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.4.tgz", + "integrity": "sha512-9O00Vh89/Ld2EcVCqJ/etd7u20UhME0f/NToPfArwPEe1Don1zy4mAIz6ariRr7mJ2RDxtaDzN0WJVdVXPtZaw==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/mailsplit": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-5.4.5.tgz", + "integrity": "sha512-oMfhmvclR689IIaQmIcR5nODnZRRVwAKtqFT407TIvmhX2OLUBnshUTcxzQBt3+96sZVDud9NfSe1NxAkUNXEQ==", + "license": "(MIT OR EUPL-1.1+)", + "dependencies": { + "libbase64": "1.3.0", + "libmime": "5.3.7", + "libqp": "2.1.1" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "peer": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemailer": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.5.tgz", + "integrity": "sha512-nsrh2lO3j4GkLLXoeEksAMgAOqxOv6QumNRVQTJwKH4nuiww6iC2y7GyANs9kRAxCexg3+lTWM3PZ91iLlVjfg==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/openai": { + "version": "5.12.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.12.2.tgz", + "integrity": "sha512-xqzHHQch5Tws5PcKR2xsZGX9xtch+JQFz5zb14dGqlshmmDAFBFEWmeIpf7wVqWV+w7Emj7jRgkNJakyKE0tYQ==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT" + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "license": "MIT", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rollup": { + "version": "4.48.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.48.1.tgz", + "integrity": "sha512-jVG20NvbhTYDkGAty2/Yh7HK6/q3DGSRH4o8ALKGArmMuaauM9kLfoMZ+WliPwA5+JHr2lTn3g557FxBV87ifg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.48.1", + "@rollup/rollup-android-arm64": "4.48.1", + "@rollup/rollup-darwin-arm64": "4.48.1", + "@rollup/rollup-darwin-x64": "4.48.1", + "@rollup/rollup-freebsd-arm64": "4.48.1", + "@rollup/rollup-freebsd-x64": "4.48.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.48.1", + "@rollup/rollup-linux-arm-musleabihf": "4.48.1", + "@rollup/rollup-linux-arm64-gnu": "4.48.1", + "@rollup/rollup-linux-arm64-musl": "4.48.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.48.1", + "@rollup/rollup-linux-ppc64-gnu": "4.48.1", + "@rollup/rollup-linux-riscv64-gnu": "4.48.1", + "@rollup/rollup-linux-riscv64-musl": "4.48.1", + "@rollup/rollup-linux-s390x-gnu": "4.48.1", + "@rollup/rollup-linux-x64-gnu": "4.48.1", + "@rollup/rollup-linux-x64-musl": "4.48.1", + "@rollup/rollup-win32-arm64-msvc": "4.48.1", + "@rollup/rollup-win32-ia32-msvc": "4.48.1", + "@rollup/rollup-win32-x64-msvc": "4.48.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" + }, + "node_modules/selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "license": "MIT", + "dependencies": { + "parseley": "^0.12.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "license": "BSD-2-Clause" + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "license": "ISC" + }, + "node_modules/simple-wcswidth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz", + "integrity": "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swr": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", + "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/systeminformation": { + "version": "5.23.8", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.23.8.tgz", + "integrity": "sha512-Osd24mNKe6jr/YoXLLK3k8TMdzaxDffhpCxgkfgBHcapykIkd50HXThM3TCEuHO2pPuCsSx2ms/SunqhU5MmsQ==", + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tlds": { + "version": "1.259.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.259.0.tgz", + "integrity": "sha512-AldGGlDP0PNgwppe2quAvuBl18UcjuNtOnDuUkqhd6ipPqrYYBt3aTxK1QTsBVknk97lS2JcafWMghjGWFtunw==", + "license": "MIT", + "bin": { + "tlds": "bin.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "license": "MIT" + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vite": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz", + "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + } + } +} diff --git a/agent-docs/package.json b/agent-docs/package.json index 5fb7d333..b1e59c26 100644 --- a/agent-docs/package.json +++ b/agent-docs/package.json @@ -1,43 +1,43 @@ { - "name": "agent-docs", - "version": "0.0.1", - "main": "index.js", - "type": "module", - "scripts": { - "build": "agentuity build", - "dev": "agentuity dev", - "format": "biome format --write .", - "lint": "biome lint .", - "prestart": "agentuity bundle", - "start": "bun run .agentuity/index.js" - }, - "keywords": [ - "agentuity", - "agent", - "ai", - "ai agent", - "bun" - ], - "private": true, - "devDependencies": { - "@biomejs/biome": "^1.9.4", - "@types/bun": "^1.2.16" - }, - "peerDependencies": { - "typescript": "^5" - }, - "dependencies": { - "@agentuity/sdk": "^0.0.124", - "@ai-sdk/openai": "^1.3.22", - "ai": "^4.3.16", - "gray-matter": "^4.0.3", - "langchain": "^0.3.28", - "vitest": "^3.2.3" - }, - "overrides": { - "gray-matter": { - "js-yaml": "^3.14.1" - } - }, - "module": "index.ts" + "name": "agent-docs", + "version": "0.0.1", + "main": "index.js", + "type": "module", + "scripts": { + "build": "agentuity build", + "dev": "agentuity dev", + "format": "biome format --write .", + "lint": "biome lint .", + "prestart": "agentuity bundle", + "start": "bun run .agentuity/index.js" + }, + "keywords": [ + "agentuity", + "agent", + "ai", + "ai agent", + "bun" + ], + "private": true, + "devDependencies": { + "@biomejs/biome": "2.1.2", + "@types/bun": "^1.2.16" + }, + "peerDependencies": { + "typescript": "^5" + }, + "dependencies": { + "@agentuity/sdk": "^0.0.124", + "@ai-sdk/openai": "^1.3.22", + "ai": "^4.3.16", + "gray-matter": "^4.0.3", + "langchain": "^0.3.28", + "vitest": "^3.2.3" + }, + "overrides": { + "gray-matter": { + "js-yaml": "^3.14.1" + } + }, + "module": "index.ts" } diff --git a/agent-docs/src/agents/doc-processing/chunk-mdx.ts b/agent-docs/src/agents/doc-processing/chunk-mdx.ts index 5d727e05..9554d874 100644 --- a/agent-docs/src/agents/doc-processing/chunk-mdx.ts +++ b/agent-docs/src/agents/doc-processing/chunk-mdx.ts @@ -1,127 +1,130 @@ -import { RecursiveCharacterTextSplitter } from "langchain/text_splitter"; -import { DirectoryLoader } from "langchain/document_loaders/fs/directory"; -import { Document } from "langchain/document"; -import { TextLoader } from "langchain/document_loaders/fs/text"; import matter from 'gray-matter'; +import type { Document } from 'langchain/document'; +import { DirectoryLoader } from 'langchain/document_loaders/fs/directory'; +import { TextLoader } from 'langchain/document_loaders/fs/text'; +import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; /** * Type for a single enriched documentation chunk. * Includes all standard metadata and allows for additional frontmatter fields. */ export type Chunk = { - id: string; - chunkIndex: number; - totalChunks: number; - contentType: string; - heading: string; - text: string; - title: string; - description: string; - createdAt: string; + id: string; + chunkIndex: number; + totalChunks: number; + contentType: string; + heading: string; + text: string; + title: string; + description: string; + createdAt: string; }; export function detectContentType(textChunk: string): string { - if (/^---\n.*?---/s.test(textChunk.trim())) { - return "frontmatter"; - } - // Code blocks - if (/```[\w]*\n.*?```/s.test(textChunk)) { - return "code_block"; - } - // Headers with substantial content - if (/^#{1,6}\s+/.test(textChunk.trim()) && textChunk.length > 100) { - return "header_section"; - } - // Just headers (short) - if (/^#{1,6}\s+/.test(textChunk.trim())) { - return "header"; - } - // Tables (markdown tables) - if (/\|.*\|.*\|/.test(textChunk) && (textChunk.match(/\|/g) || []).length >= 4) { - return "table"; - } - // Lists (multiple list items) - const lines = textChunk.split("\n"); - const listLines = lines.filter(line => /^[-*+]\s+|^\d+\.\s+/.test(line.trim())); - if (listLines.length >= 2) { - return "list"; - } - return "text"; + if (/^---\n.*?---/s.test(textChunk.trim())) { + return 'frontmatter'; + } + // Code blocks + if (/```[\w]*\n.*?```/s.test(textChunk)) { + return 'code_block'; + } + // Headers with substantial content + if (/^#{1,6}\s+/.test(textChunk.trim()) && textChunk.length > 100) { + return 'header_section'; + } + // Just headers (short) + if (/^#{1,6}\s+/.test(textChunk.trim())) { + return 'header'; + } + // Tables (markdown tables) + if ( + /\|.*\|.*\|/.test(textChunk) && + (textChunk.match(/\|/g) || []).length >= 4 + ) { + return 'table'; + } + // Lists (multiple list items) + const lines = textChunk.split('\n'); + const listLines = lines.filter((line) => + /^[-*+]\s+|^\d+\.\s+/.test(line.trim()) + ); + if (listLines.length >= 2) { + return 'list'; + } + return 'text'; } export function createContentAwareSplitter(contentType: string) { - if (contentType === "frontmatter") { - return new RecursiveCharacterTextSplitter({ - chunkSize: 2000, - chunkOverlap: 0, - separators: ["\n---\n"], - }); - } else if (contentType === "code_block") { - return new RecursiveCharacterTextSplitter({ - chunkSize: 800, - chunkOverlap: 100, - separators: ["\n```\n", "\n\n", "\n"], - }); - } else if (contentType === "header_section") { - return new RecursiveCharacterTextSplitter({ - chunkSize: 1200, - chunkOverlap: 150, - separators: ["\n## ", "\n### ", "\n#### ", "\n\n", "\n"], - }); - } else if (contentType === "table") { - return new RecursiveCharacterTextSplitter({ - chunkSize: 1500, - chunkOverlap: 0, - separators: ["\n\n"], - }); - } else if (contentType === "list") { - return new RecursiveCharacterTextSplitter({ - chunkSize: 800, - chunkOverlap: 100, - separators: ["\n\n", "\n- ", "\n* ", "\n+ "], - }); - } else { - return new RecursiveCharacterTextSplitter({ - chunkSize: 1000, - chunkOverlap: 200, - separators: ["\n\n", "\n", " "], - }); - } + if (contentType === 'frontmatter') { + return new RecursiveCharacterTextSplitter({ + chunkSize: 2000, + chunkOverlap: 0, + separators: ['\n---\n'], + }); + }if (contentType === 'code_block') { + return new RecursiveCharacterTextSplitter({ + chunkSize: 800, + chunkOverlap: 100, + separators: ['\n```\n', '\n\n', '\n'], + }); + }if (contentType === 'header_section') { + return new RecursiveCharacterTextSplitter({ + chunkSize: 1200, + chunkOverlap: 150, + separators: ['\n## ', '\n### ', '\n#### ', '\n\n', '\n'], + }); + }if (contentType === 'table') { + return new RecursiveCharacterTextSplitter({ + chunkSize: 1500, + chunkOverlap: 0, + separators: ['\n\n'], + }); + }if (contentType === 'list') { + return new RecursiveCharacterTextSplitter({ + chunkSize: 800, + chunkOverlap: 100, + separators: ['\n\n', '\n- ', '\n* ', '\n+ '], + }); + } + return new RecursiveCharacterTextSplitter({ + chunkSize: 1000, + chunkOverlap: 200, + separators: ['\n\n', '\n', ' '], + }); } export async function hybridChunkDocument(doc: Document) { - const initialSplitter = new RecursiveCharacterTextSplitter({ - chunkSize: 2000, - chunkOverlap: 100, - separators: ["\n## ", "\n### ", "\n\n", "\n"], - }); - const initialChunks = await initialSplitter.splitDocuments([doc]); - const finalChunks: any[] = []; - for (const chunk of initialChunks) { - const contentType = detectContentType(chunk.pageContent); - const contentSplitter = createContentAwareSplitter(contentType); - const refinedChunks = await contentSplitter.splitDocuments([chunk]); - for (const refinedChunk of refinedChunks) { - refinedChunk.metadata = refinedChunk.metadata || {}; - refinedChunk.metadata.contentType = contentType; - } - finalChunks.push(...refinedChunks); - } - return finalChunks; + const initialSplitter = new RecursiveCharacterTextSplitter({ + chunkSize: 2000, + chunkOverlap: 100, + separators: ['\n## ', '\n### ', '\n\n', '\n'], + }); + const initialChunks = await initialSplitter.splitDocuments([doc]); + const finalChunks: any[] = []; + for (const chunk of initialChunks) { + const contentType = detectContentType(chunk.pageContent); + const contentSplitter = createContentAwareSplitter(contentType); + const refinedChunks = await contentSplitter.splitDocuments([chunk]); + for (const refinedChunk of refinedChunks) { + refinedChunk.metadata = refinedChunk.metadata || {}; + refinedChunk.metadata.contentType = contentType; + } + finalChunks.push(...refinedChunks); + } + return finalChunks; } export async function generateDocsChunks(docsPath: string) { - const loader = new DirectoryLoader( - docsPath, - { ".mdx": (filePath: string) => new TextLoader(filePath) } - ); - const docs = await loader.load(); - const allChunks: any[] = []; - for (const doc of docs) { - const docChunks = await hybridChunkDocument(doc); - allChunks.push(...docChunks); - } - return allChunks; + const loader = new DirectoryLoader(docsPath, { + '.mdx': (filePath: string) => new TextLoader(filePath), + }); + const docs = await loader.load(); + const allChunks: any[] = []; + for (const doc of docs) { + const docChunks = await hybridChunkDocument(doc); + allChunks.push(...docChunks); + } + return allChunks; } /** @@ -133,25 +136,31 @@ export async function generateDocsChunks(docsPath: string) { * @returns Array of enriched chunk objects (no keywords or embeddings yet) */ export async function chunkAndEnrichDoc(fileContent: string): Promise { - const { content: markdownBody, data: frontmatter } = matter(fileContent); - const doc = { pageContent: markdownBody, metadata: {} }; - const chunks = await hybridChunkDocument(doc); - // Track heading and breadcrumbs as we walk through chunks - let currentHeading = ''; - return chunks.map((chunk, idx) => { - if (chunk.metadata.contentType === 'header' || chunk.metadata.contentType === 'header_section') { - currentHeading = chunk.pageContent.split('\n')[0].replace(/^#+\s*/, '').trim(); - } - return { - id: crypto.randomUUID(), - chunkIndex: idx, - totalChunks: chunks.length, - contentType: chunk.metadata.contentType, - heading: currentHeading, - text: chunk.pageContent, - title: frontmatter.title, - description: frontmatter.description, - createdAt: new Date().toISOString(), - }; - }); -} \ No newline at end of file + const { content: markdownBody, data: frontmatter } = matter(fileContent); + const doc = { pageContent: markdownBody, metadata: {} }; + const chunks = await hybridChunkDocument(doc); + // Track heading and breadcrumbs as we walk through chunks + let currentHeading = ''; + return chunks.map((chunk, idx) => { + if ( + chunk.metadata.contentType === 'header' || + chunk.metadata.contentType === 'header_section' + ) { + currentHeading = chunk.pageContent + .split('\n')[0] + .replace(/^#+\s*/, '') + .trim(); + } + return { + id: crypto.randomUUID(), + chunkIndex: idx, + totalChunks: chunks.length, + contentType: chunk.metadata.contentType, + heading: currentHeading, + text: chunk.pageContent, + title: frontmatter.title, + description: frontmatter.description, + createdAt: new Date().toISOString(), + }; + }); +} diff --git a/agent-docs/src/agents/doc-processing/docs-orchestrator.ts b/agent-docs/src/agents/doc-processing/docs-orchestrator.ts index dab447b8..4a235f1a 100644 --- a/agent-docs/src/agents/doc-processing/docs-orchestrator.ts +++ b/agent-docs/src/agents/doc-processing/docs-orchestrator.ts @@ -1,119 +1,153 @@ import type { AgentContext } from '@agentuity/sdk'; -import { processDoc } from './docs-processor'; import { VECTOR_STORE_NAME } from '../../../config'; +import { processDoc } from './docs-processor'; import type { SyncPayload, SyncStats } from './types'; /** * Helper to remove all vectors for a given logical path from the vector store. */ -async function removeVectorsByPath(ctx: AgentContext, logicalPath: string, vectorStoreName: string) { - ctx.logger.info('Removing vectors for path: %s', logicalPath); - - let totalDeleted = 0; - - while (true) { - const vectors = await ctx.vector.search(vectorStoreName, { - query: ' ', - limit: 100, - metadata: { path: logicalPath }, - }); - - if (!Array.isArray(vectors) || vectors.length === 0) { - break; - } - - // Delete vectors one by one to avoid issues with large batches - for (const vector of vectors) { - await ctx.vector.delete(vectorStoreName, vector.key); - } - - totalDeleted += vectors.length; - ctx.logger.info('Deleted %d vectors (total: %d) for path: %s', vectors.length, totalDeleted, logicalPath); - } - - if (totalDeleted > 0) { - ctx.logger.info('Completed removal of %d vectors for path: %s', totalDeleted, logicalPath); - } else { - ctx.logger.info('No vectors found for path: %s', logicalPath); - } +async function removeVectorsByPath( + ctx: AgentContext, + logicalPath: string, + vectorStoreName: string +) { + ctx.logger.info('Removing vectors for path: %s', logicalPath); + + let totalDeleted = 0; + + while (true) { + const vectors = await ctx.vector.search(vectorStoreName, { + query: ' ', + limit: 100, + metadata: { path: logicalPath }, + }); + + if (!Array.isArray(vectors) || vectors.length === 0) { + break; + } + + // Delete vectors one by one to avoid issues with large batches + for (const vector of vectors) { + await ctx.vector.delete(vectorStoreName, vector.key); + } + + totalDeleted += vectors.length; + ctx.logger.info( + 'Deleted %d vectors (total: %d) for path: %s', + vectors.length, + totalDeleted, + logicalPath + ); + } + + if (totalDeleted > 0) { + ctx.logger.info( + 'Completed removal of %d vectors for path: %s', + totalDeleted, + logicalPath + ); + } else { + ctx.logger.info('No vectors found for path: %s', logicalPath); + } } /** * Process documentation sync from embedded payload - completely filesystem-free */ -export async function syncDocsFromPayload(ctx: AgentContext, payload: SyncPayload): Promise { - const { changed = [], removed = [] } = payload; - let processed = 0, deleted = 0, errors = 0; - const errorFiles: string[] = []; - - // Process removed files - for (const logicalPath of removed) { - try { - await removeVectorsByPath(ctx, logicalPath, VECTOR_STORE_NAME); - deleted++; - ctx.logger.info('Successfully removed file: %s', logicalPath); - } catch (err) { - errors++; - errorFiles.push(logicalPath); - ctx.logger.error('Error deleting file %s: %o', logicalPath, err); - } - } - - // Process changed files with embedded content - for (const file of changed) { - try { - const { path: logicalPath, content: base64Content } = file; - - // Base64-decode the content - let content: string; - try { - const buf = Buffer.from(base64Content, 'base64'); - // re-encode to verify round-trip - if (buf.toString('base64') !== base64Content.replace(/\s/g, '')) { - throw new Error('Malformed base64 payload'); - } - content = buf.toString('utf-8'); - } catch (decodeErr) { - throw new Error(`Invalid base64 content for ${logicalPath}: ${decodeErr}`); - } - - // Remove existing vectors for this path - await removeVectorsByPath(ctx, logicalPath, VECTOR_STORE_NAME); - - // Process the document content into chunks - const chunks = await processDoc(content); - - // Upsert chunks with path metadata - for (const chunk of chunks) { - chunk.metadata = { - ...chunk.metadata, - path: logicalPath, - }; - const result = await ctx.vector.upsert(VECTOR_STORE_NAME, chunk); - ctx.logger.info('Upserted chunk: %o', result.length); - } - - ctx.logger.info('Upserted total %o chunks for file: %s', chunks.length, logicalPath); - - processed++; - ctx.logger.info('Successfully processed file: %s (%d chunks)', logicalPath, chunks.length); - } catch (err) { - errors++; - errorFiles.push(file.path); - ctx.logger.error('Error processing file %s: %o', file.path, err); - } - } - - const stats = { processed, deleted, errors, errorFiles }; - ctx.logger.info('Sync completed: %o', stats); - return stats; +export async function syncDocsFromPayload( + ctx: AgentContext, + payload: SyncPayload +): Promise { + const { changed = [], removed = [] } = payload; + let processed = 0; + let deleted = 0; + let errors = 0; + + const errorFiles: string[] = []; + + // Process removed files + for (const logicalPath of removed) { + try { + await removeVectorsByPath(ctx, logicalPath, VECTOR_STORE_NAME); + deleted++; + ctx.logger.info('Successfully removed file: %s', logicalPath); + } catch (err) { + errors++; + errorFiles.push(logicalPath); + ctx.logger.error('Error deleting file %s: %o', logicalPath, err); + } + } + + // Process changed files with embedded content + for (const file of changed) { + try { + const { path: logicalPath, content: base64Content } = file; + + // Base64-decode the content + let content: string; + try { + const buf = Buffer.from(base64Content, 'base64'); + // re-encode to verify round-trip + if (buf.toString('base64') !== base64Content.replace(/\s/g, '')) { + throw new Error('Malformed base64 payload'); + } + content = buf.toString('utf-8'); + } catch (decodeErr) { + throw new Error( + `Invalid base64 content for ${logicalPath}: ${decodeErr}` + ); + } + + // Remove existing vectors for this path + await removeVectorsByPath(ctx, logicalPath, VECTOR_STORE_NAME); + + // Process the document content into chunks + const chunks = await processDoc(content); + + // Upsert chunks with path metadata + for (const chunk of chunks) { + chunk.metadata = { + ...chunk.metadata, + path: logicalPath, + }; + const result = await ctx.vector.upsert(VECTOR_STORE_NAME, chunk); + ctx.logger.info('Upserted chunk: %o', result.length); + } + + ctx.logger.info( + 'Upserted total %o chunks for file: %s', + chunks.length, + logicalPath + ); + + processed++; + ctx.logger.info( + 'Successfully processed file: %s (%d chunks)', + logicalPath, + chunks.length + ); + } catch (err) { + errors++; + errorFiles.push(file.path); + ctx.logger.error('Error processing file %s: %o', file.path, err); + } + } + + const stats = { processed, deleted, errors, errorFiles }; + ctx.logger.info('Sync completed: %o', stats); + return stats; } export async function clearVectorDb(ctx: AgentContext) { - ctx.logger.info('Clearing all vectors from store: %s', VECTOR_STORE_NAME); - while (true) { - const batch = await ctx.vector.search(VECTOR_STORE_NAME, { query: ' ', limit: 1000 }); - if (batch.length === 0) break; - await Promise.all(batch.map(v => ctx.vector.delete(VECTOR_STORE_NAME, v.key))); - } -} \ No newline at end of file + ctx.logger.info('Clearing all vectors from store: %s', VECTOR_STORE_NAME); + while (true) { + const batch = await ctx.vector.search(VECTOR_STORE_NAME, { + query: ' ', + limit: 1000, + }); + if (batch.length === 0) break; + await Promise.all( + batch.map((v) => ctx.vector.delete(VECTOR_STORE_NAME, v.key)) + ); + } +} diff --git a/agent-docs/src/agents/doc-processing/docs-processor.ts b/agent-docs/src/agents/doc-processing/docs-processor.ts index 86ea3805..cdffb47a 100644 --- a/agent-docs/src/agents/doc-processing/docs-processor.ts +++ b/agent-docs/src/agents/doc-processing/docs-processor.ts @@ -1,42 +1,44 @@ import type { VectorUpsertParams } from '@agentuity/sdk'; - +import type { Chunk } from './chunk-mdx'; import { chunkAndEnrichDoc } from './chunk-mdx'; import { embedChunks } from './embed-chunks'; -import type { Chunk } from './chunk-mdx'; import type { ChunkMetadata } from './types'; - /** * Processes a single .mdx doc: loads, chunks, and enriches each chunk with metadata. * @param docContent Raw file content */ -export async function processDoc(docContent: string): Promise { - const chunks = await chunkAndEnrichDoc(docContent); - const vectors = await createVectorEmbedding(chunks); - return vectors; +export async function processDoc( + docContent: string +): Promise { + const chunks = await chunkAndEnrichDoc(docContent); + const vectors = await createVectorEmbedding(chunks); + return vectors; } -async function createVectorEmbedding(chunks: Chunk[]): Promise { - const embeddings = await embedChunks(chunks.map(chunk => chunk.text)); - return chunks.map((chunk, index) => { - if (!embeddings[index]) { - throw new Error(`No embedding found for chunk ${chunk.id}`); - } - const metadata: ChunkMetadata = { - chunkIndex: chunk.chunkIndex, - totalChunks: chunk.totalChunks, - contentType: chunk.contentType, - heading: chunk.heading, - title: chunk.title, - description: chunk.description, - text: chunk.text, - createdAt: chunk.createdAt, - }; +async function createVectorEmbedding( + chunks: Chunk[] +): Promise { + const embeddings = await embedChunks(chunks.map((chunk) => chunk.text)); + return chunks.map((chunk, index) => { + if (!embeddings[index]) { + throw new Error(`No embedding found for chunk ${chunk.id}`); + } + const metadata: ChunkMetadata = { + chunkIndex: chunk.chunkIndex, + totalChunks: chunk.totalChunks, + contentType: chunk.contentType, + heading: chunk.heading, + title: chunk.title, + description: chunk.description, + text: chunk.text, + createdAt: chunk.createdAt, + }; - return { - key: chunk.id, - embeddings: embeddings[index], - metadata, - }; - }); -} \ No newline at end of file + return { + key: chunk.id, + embeddings: embeddings[index], + metadata, + }; + }); +} diff --git a/agent-docs/src/agents/doc-processing/embed-chunks.ts b/agent-docs/src/agents/doc-processing/embed-chunks.ts index 0d508388..cca3c8d0 100644 --- a/agent-docs/src/agents/doc-processing/embed-chunks.ts +++ b/agent-docs/src/agents/doc-processing/embed-chunks.ts @@ -1,5 +1,5 @@ -import { embedMany } from 'ai'; import { openai } from '@ai-sdk/openai'; +import { embedMany } from 'ai'; /** * Generates embeddings for an array of texts using the OpenAI embedding API (via Vercel AI SDK). * @param texts Array of strings to embed. @@ -7,28 +7,30 @@ import { openai } from '@ai-sdk/openai'; * @returns Promise Array of embedding vectors. */ export async function embedChunks( - texts: string[], - model: string = 'text-embedding-3-small' + texts: string[], + model = 'text-embedding-3-small' ): Promise { - if (!Array.isArray(texts) || texts.length === 0) { - throw new Error('No texts provided for embedding.'); - } - if (texts.some(t => typeof t !== 'string' || t.trim() === '')) { - throw new Error('All items passed to embedChunks must be non-empty strings.'); - } - let response: Awaited>; - try { - response = await embedMany({ - model: openai.embedding(model), - values: texts, - }); - } catch (err) { - throw new Error(`Failed to embed ${texts.length} chunk(s): ${String(err)}`); - } + if (!Array.isArray(texts) || texts.length === 0) { + throw new Error('No texts provided for embedding.'); + } + if (texts.some((t) => typeof t !== 'string' || t.trim() === '')) { + throw new Error( + 'All items passed to embedChunks must be non-empty strings.' + ); + } + let response: Awaited>; + try { + response = await embedMany({ + model: openai.embedding(model), + values: texts, + }); + } catch (err) { + throw new Error(`Failed to embed ${texts.length} chunk(s): ${String(err)}`); + } + + if (!response.embeddings || response.embeddings.length !== texts.length) { + throw new Error('Embedding API returned unexpected result.'); + } - if (!response.embeddings || response.embeddings.length !== texts.length) { - throw new Error('Embedding API returned unexpected result.'); - } - - return response.embeddings; -} \ No newline at end of file + return response.embeddings; +} diff --git a/agent-docs/src/agents/doc-processing/index.ts b/agent-docs/src/agents/doc-processing/index.ts index 629e0773..a2435a1a 100644 --- a/agent-docs/src/agents/doc-processing/index.ts +++ b/agent-docs/src/agents/doc-processing/index.ts @@ -3,85 +3,114 @@ import { syncDocsFromPayload } from './docs-orchestrator'; import type { SyncPayload } from './types'; export const welcome = () => { - return { - welcome: "Documentation Sync Agent - Processes embedded MDX content from GitHub workflows", - prompts: [ - { - data: 'Sync documentation changes from GitHub', - contentType: 'text/plain', - }, - ], - }; + return { + welcome: + 'Documentation Sync Agent - Processes embedded MDX content from GitHub workflows', + prompts: [ + { + data: 'Sync documentation changes from GitHub', + contentType: 'text/plain', + }, + ], + }; }; export default async function Agent( - req: AgentRequest, - resp: AgentResponse, - ctx: AgentContext + req: AgentRequest, + resp: AgentResponse, + ctx: AgentContext ) { - try { - const payload = await req.data.json() as unknown as SyncPayload; - - // Validate that at least one operation is requested - if ((!payload.changed || payload.changed.length === 0) && - (!payload.removed || payload.removed.length === 0)) { - return resp.json({ - error: 'Invalid payload format. Must provide at least one of: changed files or removed files' - }, 400); - } + try { + const payload = (await req.data.json()) as unknown as SyncPayload; - // Validate changed files if present - if (payload.changed) { - if (!Array.isArray(payload.changed)) { - return resp.json({ - error: 'Invalid payload format. Changed files must be an array' - }, 400); - } + // Validate that at least one operation is requested + if ( + (!payload.changed || payload.changed.length === 0) && + (!payload.removed || payload.removed.length === 0) + ) { + return resp.json( + { + error: + 'Invalid payload format. Must provide at least one of: changed files or removed files', + }, + 400 + ); + } - for (const file of payload.changed) { - if (!file.path || !file.content || typeof file.path !== 'string' || typeof file.content !== 'string') { - return resp.json({ - error: 'Invalid file format. Each changed file must have {path: string, content: string}' - }, 400); - } - } - } + // Validate changed files if present + if (payload.changed) { + if (!Array.isArray(payload.changed)) { + return resp.json( + { + error: 'Invalid payload format. Changed files must be an array', + }, + 400 + ); + } - // Validate removed files if present - if (payload.removed) { - if (!Array.isArray(payload.removed)) { - return resp.json({ - error: 'Invalid payload format. Removed files must be an array' - }, 400); - } + for (const file of payload.changed) { + if ( + !file.path || + !file.content || + typeof file.path !== 'string' || + typeof file.content !== 'string' + ) { + return resp.json( + { + error: + 'Invalid file format. Each changed file must have {path: string, content: string}', + }, + 400 + ); + } + } + } - for (const file of payload.removed) { - if (typeof file !== 'string') { - return resp.json({ - error: 'Invalid removed file format. Each removed file must be a string path' - }, 400); - } - } - } + // Validate removed files if present + if (payload.removed) { + if (!Array.isArray(payload.removed)) { + return resp.json( + { + error: 'Invalid payload format. Removed files must be an array', + }, + 400 + ); + } - ctx.logger.info('Processing payload: %d changed files, %d removed files', - payload.changed?.length || 0, payload.removed?.length || 0); - - const stats = await syncDocsFromPayload(ctx, { - commit: payload.commit, - repo: payload.repo, - changed: payload.changed || [], - removed: payload.removed || [] - }); - return resp.json({ status: 'ok', stats }); - } catch (error) { - ctx.logger.error('Error running sync agent:', error); - let message = 'Unknown error'; - if (error instanceof Error) { - message = error.message; - } else if (typeof error === 'string') { - message = error; - } - return resp.json({ error: message }, 500); - } -} \ No newline at end of file + for (const file of payload.removed) { + if (typeof file !== 'string') { + return resp.json( + { + error: + 'Invalid removed file format. Each removed file must be a string path', + }, + 400 + ); + } + } + } + + ctx.logger.info( + 'Processing payload: %d changed files, %d removed files', + payload.changed?.length || 0, + payload.removed?.length || 0 + ); + + const stats = await syncDocsFromPayload(ctx, { + commit: payload.commit, + repo: payload.repo, + changed: payload.changed || [], + removed: payload.removed || [], + }); + return resp.json({ status: 'ok', stats }); + } catch (error) { + ctx.logger.error('Error running sync agent:', error); + let message = 'Unknown error'; + if (error instanceof Error) { + message = error.message; + } else if (typeof error === 'string') { + message = error; + } + return resp.json({ error: message }, 500); + } +} diff --git a/agent-docs/src/agents/doc-processing/keyword-extraction.ts b/agent-docs/src/agents/doc-processing/keyword-extraction.ts index 0ad1cce3..d0ab7e22 100644 --- a/agent-docs/src/agents/doc-processing/keyword-extraction.ts +++ b/agent-docs/src/agents/doc-processing/keyword-extraction.ts @@ -2,15 +2,18 @@ import { openai } from '@ai-sdk/openai'; import { generateText } from 'ai'; export interface KeywordExtractionResult { - keywords: string[]; - source: string; - chunkPreview?: string; + keywords: string[]; + source: string; + chunkPreview?: string; } export interface KeywordExtractionOptions { - model?: string; // e.g., 'gpt-4o', 'gpt-3.5-turbo' - maxKeywords?: number; - logger?: { info: (msg: string, ...args: any[]) => void; error: (msg: string, ...args: any[]) => void }; + model?: string; // e.g., 'gpt-4o', 'gpt-3.5-turbo' + maxKeywords?: number; + logger?: { + info: (msg: string, ...args: any[]) => void; + error: (msg: string, ...args: any[]) => void; + }; } /** @@ -22,16 +25,16 @@ export interface KeywordExtractionOptions { * @throws Error if the LLM fails to generate a valid JSON response. */ export async function extractKeywordsWithLLM( - chunkContent: string, - options: KeywordExtractionOptions = {} + chunkContent: string, + options: KeywordExtractionOptions = {} ): Promise { - const { - model = 'gpt-4o', - maxKeywords = 10, - logger = { info: () => { }, error: () => { } }, - } = options; + const { + model = 'gpt-4o', + maxKeywords = 10, + logger = { info: () => {}, error: () => {} }, + } = options; - const prompt = `You are an expert technical documentation assistant. + const prompt = `You are an expert technical documentation assistant. Given the following documentation chunk, extract 5 to 10 important keywords or key phrases that would help a developer search for or understand this content. Focus on technical terms, API names, function names, CLI commands, configuration options, and unique concepts. Avoid generic words. @@ -46,28 +49,30 @@ ${chunkContent} """ `; - logger.info('Extracting keywords for chunk (length: %d)...', chunkContent.length); - const result = await generateText({ - model: openai(model), - prompt, - maxTokens: 150, - temperature: 0.2, - }); - const raw = result.text || ''; - let keywords: string[] = []; - const parsed = JSON.parse(raw); - if (Array.isArray(parsed.keywords)) { - keywords = parsed.keywords - .map((k: string) => k.trim()) - .filter((k: string) => Boolean(k)) - .filter((k: string, i: number, arr: string[]) => arr.indexOf(k) === i) - .slice(0, maxKeywords); - } - logger.info('Extracted keywords: %o', keywords); - return { - keywords, - source: 'llm', - chunkPreview: chunkContent.slice(0, 100), - }; - -} \ No newline at end of file + logger.info( + 'Extracting keywords for chunk (length: %d)...', + chunkContent.length + ); + const result = await generateText({ + model: openai(model), + prompt, + maxTokens: 150, + temperature: 0.2, + }); + const raw = result.text || ''; + let keywords: string[] = []; + const parsed = JSON.parse(raw); + if (Array.isArray(parsed.keywords)) { + keywords = parsed.keywords + .map((k: string) => k.trim()) + .filter((k: string) => Boolean(k)) + .filter((k: string, i: number, arr: string[]) => arr.indexOf(k) === i) + .slice(0, maxKeywords); + } + logger.info('Extracted keywords: %o', keywords); + return { + keywords, + source: 'llm', + chunkPreview: chunkContent.slice(0, 100), + }; +} diff --git a/agent-docs/src/agents/doc-processing/test/chunk-mdx.test.ts b/agent-docs/src/agents/doc-processing/test/chunk-mdx.test.ts index 1c62e9c2..a81faca7 100644 --- a/agent-docs/src/agents/doc-processing/test/chunk-mdx.test.ts +++ b/agent-docs/src/agents/doc-processing/test/chunk-mdx.test.ts @@ -1,184 +1,191 @@ -import { expect, test } from "bun:test"; -import { detectContentType, hybridChunkDocument } from "../chunk-mdx"; -import { Document } from "langchain/document"; +import { expect, test } from 'bun:test'; +import type { Document } from 'langchain/document'; +import { detectContentType, hybridChunkDocument } from '../chunk-mdx'; -const makeDoc = (content: string): Document => ({ pageContent: content, metadata: { contentType: "text" } }); +const makeDoc = (content: string): Document => ({ + pageContent: content, + metadata: { contentType: 'text' }, +}); // 1. Headings -test("detects single heading", () => { - expect(detectContentType("# Heading 1")).toBe("header"); +test('detects single heading', () => { + expect(detectContentType('# Heading 1')).toBe('header'); }); -test("detects header section", () => { - expect(detectContentType("## Subheading\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.")).toBe("header_section"); +test('detects header section', () => { + expect( + detectContentType( + '## Subheading\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' + ) + ).toBe('header_section'); }); // 2. Paragraphs -test("detects paragraph as text", () => { - expect(detectContentType("This is a paragraph.")).toBe("text"); +test('detects paragraph as text', () => { + expect(detectContentType('This is a paragraph.')).toBe('text'); }); // 3. Code Blocks -test("detects code block", () => { - const code = "```js\nconsole.log('hi')\n```"; - expect(detectContentType(code)).toBe("code_block"); +test('detects code block', () => { + const code = "```js\nconsole.log('hi')\n```"; + expect(detectContentType(code)).toBe('code_block'); }); // 4. Lists -test("detects unordered list", () => { - const list = "- item 1\n- item 2"; - expect(detectContentType(list)).toBe("list"); +test('detects unordered list', () => { + const list = '- item 1\n- item 2'; + expect(detectContentType(list)).toBe('list'); }); -test("detects ordered list", () => { - const list = "1. item 1\n2. item 2"; - expect(detectContentType(list)).toBe("list"); +test('detects ordered list', () => { + const list = '1. item 1\n2. item 2'; + expect(detectContentType(list)).toBe('list'); }); // 5. Tables -test("detects table", () => { - const table = "| Col1 | Col2 |\n|------|------|\n| a | b |"; - expect(detectContentType(table)).toBe("table"); +test('detects table', () => { + const table = '| Col1 | Col2 |\n|------|------|\n| a | b |'; + expect(detectContentType(table)).toBe('table'); }); // 6. Frontmatter -test("detects frontmatter", () => { - const fm = "---\ntitle: Test\n---"; - expect(detectContentType(fm)).toBe("frontmatter"); +test('detects frontmatter', () => { + const fm = '---\ntitle: Test\n---'; + expect(detectContentType(fm)).toBe('frontmatter'); }); -test("detects no frontmatter", () => { - expect(detectContentType("No frontmatter here")).toBe("text"); +test('detects no frontmatter', () => { + expect(detectContentType('No frontmatter here')).toBe('text'); }); // 7. Edge Cases -test("empty file returns text", () => { - expect(detectContentType("")).toBe("text"); +test('empty file returns text', () => { + expect(detectContentType('')).toBe('text'); }); -test("file with only code", () => { - const code = "```python\nprint('hi')\n```"; - expect(detectContentType(code)).toBe("code_block"); +test('file with only code', () => { + const code = "```python\nprint('hi')\n```"; + expect(detectContentType(code)).toBe('code_block'); }); -test("file with only list", () => { - const list = "* a\n* b"; - expect(detectContentType(list)).toBe("list"); +test('file with only list', () => { + const list = '* a\n* b'; + expect(detectContentType(list)).toBe('list'); }); -test("file with only table", () => { - const table = "| A | B |\n|---|---|\n| 1 | 2 |"; - expect(detectContentType(table)).toBe("table"); +test('file with only table', () => { + const table = '| A | B |\n|---|---|\n| 1 | 2 |'; + expect(detectContentType(table)).toBe('table'); }); -test("file with only frontmatter", () => { - const fm = "---\ntitle: Only\n---"; - expect(detectContentType(fm)).toBe("frontmatter"); +test('file with only frontmatter', () => { + const fm = '---\ntitle: Only\n---'; + expect(detectContentType(fm)).toBe('frontmatter'); }); // 8. Mixed Content -test("mixed content: heading, paragraph, code, list", async () => { - const content = [ - "## Title", - "", - "This is a paragraph.", - "", - "- item 1", - "- item 2", - "", - "```js", - "console.log('hi')", - "```" - ].join("\n"); - const doc = makeDoc(content); - const chunks = await hybridChunkDocument(doc); - expect(chunks.some(c => c.metadata.contentType === "code_block")).toBe(true); +test('mixed content: heading, paragraph, code, list', async () => { + const content = [ + '## Title', + '', + 'This is a paragraph.', + '', + '- item 1', + '- item 2', + '', + '```js', + "console.log('hi')", + '```', + ].join('\n'); + const doc = makeDoc(content); + const chunks = await hybridChunkDocument(doc); + expect(chunks.some((c) => c.metadata.contentType === 'code_block')).toBe( + true + ); }); - // 10. Nested Lists -test("detects nested lists", () => { - const list = "- item 1\n - subitem 1\n - subitem 2\n- item 2"; - expect(detectContentType(list)).toBe("list"); +test('detects nested lists', () => { + const list = '- item 1\n - subitem 1\n - subitem 2\n- item 2'; + expect(detectContentType(list)).toBe('list'); }); // 11. Lists with Code Blocks -test("list with code block", () => { - const list = "- item 1\n ```js\nconsole.log('hi')\n```\n- item 2"; - expect(detectContentType(list)).toBe("code_block"); +test('list with code block', () => { + const list = "- item 1\n ```js\nconsole.log('hi')\n```\n- item 2"; + expect(detectContentType(list)).toBe('code_block'); }); // 12. Tables with Code/Multiline Text -test("table with code in cell", () => { - const table = "| Col1 | Col2 |\n|------|------|\n| `code` | line 2\nline 3 |"; - expect(detectContentType(table)).toBe("table"); +test('table with code in cell', () => { + const table = '| Col1 | Col2 |\n|------|------|\n| `code` | line 2\nline 3 |'; + expect(detectContentType(table)).toBe('table'); }); -test("table with multiline text", () => { - const table = "| A | B |\n|---|---|\n| line 1\nline 2 | value |"; - expect(detectContentType(table)).toBe("table"); +test('table with multiline text', () => { + const table = '| A | B |\n|---|---|\n| line 1\nline 2 | value |'; + expect(detectContentType(table)).toBe('table'); }); // 13. Headers with No Content -test("header with no content", async () => { - const content = "# Header Only"; - const doc = makeDoc(content); - const chunks = await hybridChunkDocument(doc); - expect(chunks.some(c => c.metadata.contentType === "header")).toBe(true); +test('header with no content', async () => { + const content = '# Header Only'; + const doc = makeDoc(content); + const chunks = await hybridChunkDocument(doc); + expect(chunks.some((c) => c.metadata.contentType === 'header')).toBe(true); }); - // 15. Very Large File -test("very large file splits into multiple chunks", async () => { - const content = Array(5000).fill("A line of text.").join("\n"); - const doc = makeDoc(content); - const chunks = await hybridChunkDocument(doc); - expect(chunks.length).toBeGreaterThan(1); +test('very large file splits into multiple chunks', async () => { + const content = Array(5000).fill('A line of text.').join('\n'); + const doc = makeDoc(content); + const chunks = await hybridChunkDocument(doc); + expect(chunks.length).toBeGreaterThan(1); }); // 16. Short Chunks -test("very short lines are chunked", async () => { - const content = "A\nB\nC"; - const doc = makeDoc(content); - const chunks = await hybridChunkDocument(doc); - expect(chunks.length).toBeGreaterThan(0); +test('very short lines are chunked', async () => { + const content = 'A\nB\nC'; + const doc = makeDoc(content); + const chunks = await hybridChunkDocument(doc); + expect(chunks.length).toBeGreaterThan(0); }); // 17. Inline Code -test("paragraph with inline code", () => { - const para = "This is `inline code` in a paragraph."; - expect(detectContentType(para)).toBe("text"); +test('paragraph with inline code', () => { + const para = 'This is `inline code` in a paragraph.'; + expect(detectContentType(para)).toBe('text'); }); // 18. Blockquotes -test("single-line blockquote", () => { - const quote = "> This is a quote."; - expect(detectContentType(quote)).toBe("text"); // No explicit blockquote type +test('single-line blockquote', () => { + const quote = '> This is a quote.'; + expect(detectContentType(quote)).toBe('text'); // No explicit blockquote type }); -test("multi-line blockquote", () => { - const quote = "> Line 1\n> Line 2"; - expect(detectContentType(quote)).toBe("text"); // No explicit blockquote type +test('multi-line blockquote', () => { + const quote = '> Line 1\n> Line 2'; + expect(detectContentType(quote)).toBe('text'); // No explicit blockquote type }); // 19. Horizontal Rules -test("horizontal rule is treated as text", () => { - expect(detectContentType("---")).toBe("text"); - expect(detectContentType("***")).toBe("text"); +test('horizontal rule is treated as text', () => { + expect(detectContentType('---')).toBe('text'); + expect(detectContentType('***')).toBe('text'); }); // 21. Leading/Trailing Whitespace -test("leading and trailing whitespace is handled", async () => { - const content = " \n\n# Heading\nContent\n\n "; - const doc = makeDoc(content); - const chunks = await hybridChunkDocument(doc); - expect(chunks.some(c => c.pageContent.includes("Heading"))).toBe(true); -}); \ No newline at end of file +test('leading and trailing whitespace is handled', async () => { + const content = ' \n\n# Heading\nContent\n\n '; + const doc = makeDoc(content); + const chunks = await hybridChunkDocument(doc); + expect(chunks.some((c) => c.pageContent.includes('Heading'))).toBe(true); +}); diff --git a/agent-docs/src/agents/doc-processing/types.ts b/agent-docs/src/agents/doc-processing/types.ts index 795d8a4f..923af879 100644 --- a/agent-docs/src/agents/doc-processing/types.ts +++ b/agent-docs/src/agents/doc-processing/types.ts @@ -1,30 +1,30 @@ export interface FilePayload { - path: string; - content: string; // base64-encoded + path: string; + content: string; // base64-encoded } export interface SyncPayload { - commit?: string; - repo?: string; - changed?: FilePayload[]; - removed?: string[]; + commit?: string; + repo?: string; + changed?: FilePayload[]; + removed?: string[]; } export interface SyncStats { - processed: number; - deleted: number; - errors: number; - errorFiles: string[]; -} + processed: number; + deleted: number; + errors: number; + errorFiles: string[]; +} export type ChunkMetadata = { - chunkIndex: number; - totalChunks: number; - contentType: string; - heading: string; - title: string; - description: string; - text: string; - createdAt: string; - path?: string; + chunkIndex: number; + totalChunks: number; + contentType: string; + heading: string; + title: string; + description: string; + text: string; + createdAt: string; + path?: string; }; diff --git a/agent-docs/src/agents/doc-qa/index.ts b/agent-docs/src/agents/doc-qa/index.ts index d49cef91..0d26e092 100644 --- a/agent-docs/src/agents/doc-qa/index.ts +++ b/agent-docs/src/agents/doc-qa/index.ts @@ -2,28 +2,32 @@ import type { AgentContext, AgentRequest, AgentResponse } from '@agentuity/sdk'; import answerQuestion from './rag'; export default async function Agent( - req: AgentRequest, - resp: AgentResponse, - ctx: AgentContext + req: AgentRequest, + resp: AgentResponse, + ctx: AgentContext ) { - let jsonRequest: any = null; - let prompt: string; + let jsonRequest: any = null; + let prompt: string; - try { - jsonRequest = await req.data.json(); - if (typeof jsonRequest === 'object' && jsonRequest !== null && 'message' in jsonRequest) { - prompt = String(jsonRequest.message || ''); - } else { - prompt = JSON.stringify(jsonRequest); - } - } catch { - prompt = await req.data.text(); - } + try { + jsonRequest = await req.data.json(); + if ( + typeof jsonRequest === 'object' && + jsonRequest !== null && + 'message' in jsonRequest + ) { + prompt = String(jsonRequest.message || ''); + } else { + prompt = JSON.stringify(jsonRequest); + } + } catch { + prompt = await req.data.text(); + } - if (!prompt.trim()) { - return resp.text("How can I help you?"); - } + if (!prompt.trim()) { + return resp.text('How can I help you?'); + } - const answer = await answerQuestion(ctx, prompt); - return resp.json(answer); -} \ No newline at end of file + const answer = await answerQuestion(ctx, prompt); + return resp.json(answer); +} diff --git a/agent-docs/src/agents/doc-qa/prompt.ts b/agent-docs/src/agents/doc-qa/prompt.ts index 5b71a09f..cec823fc 100644 --- a/agent-docs/src/agents/doc-qa/prompt.ts +++ b/agent-docs/src/agents/doc-qa/prompt.ts @@ -1,13 +1,15 @@ import type { AgentContext } from '@agentuity/sdk'; -import { generateObject, generateText } from 'ai'; import { openai } from '@ai-sdk/openai'; +import { generateObject, generateText } from 'ai'; import type { PromptType } from './types'; import { PromptClassificationSchema } from './types'; - -export async function rephraseVaguePrompt(ctx: AgentContext, input: string): Promise { - const systemPrompt = `You are a technical documentation search assistant for developer tools and AI agents. Your job is to CAREFULLY improve unclear queries ONLY when absolutely necessary. +export async function rephraseVaguePrompt( + ctx: AgentContext, + input: string +): Promise { + const systemPrompt = `You are a technical documentation search assistant for developer tools and AI agents. Your job is to CAREFULLY improve unclear queries ONLY when absolutely necessary. BE EXTREMELY CONSERVATIVE. Most queries should be returned UNCHANGED. @@ -43,28 +45,31 @@ If in doubt, return the query UNCHANGED. Better to leave it as-is than to misint Return ONLY the query text, nothing else.`; - try { - const result = await generateText({ - model: openai('gpt-4o-mini'), - system: systemPrompt, - prompt: `User query: "${input}"`, - maxTokens: 100, - temperature: 0.1, - }); - - const rephrasedQuery = result.text?.trim() || input; - console.log(rephrasedQuery); - // Log if we actually rephrased it - if (rephrasedQuery !== input) { - ctx.logger.info('Rephrased query from "%s" to "%s"', input, rephrasedQuery); - } - - return rephrasedQuery; - - } catch (error) { - ctx.logger.error('Error rephrasing prompt, returning original: %o', error); - return input; - } + try { + const result = await generateText({ + model: openai('gpt-4o-mini'), + system: systemPrompt, + prompt: `User query: "${input}"`, + maxTokens: 100, + temperature: 0.1, + }); + + const rephrasedQuery = result.text?.trim() || input; + console.log(rephrasedQuery); + // Log if we actually rephrased it + if (rephrasedQuery !== input) { + ctx.logger.info( + 'Rephrased query from "%s" to "%s"', + input, + rephrasedQuery + ); + } + + return rephrasedQuery; + } catch (error) { + ctx.logger.error('Error rephrasing prompt, returning original: %o', error); + return input; + } } /** @@ -74,8 +79,11 @@ Return ONLY the query text, nothing else.`; * @param input - The input string to analyze * @returns {Promise} - The determined PromptType */ -export async function getPromptType(ctx: AgentContext, input: string): Promise { - const systemPrompt = ` +export async function getPromptType( + ctx: AgentContext, + input: string +): Promise { + const systemPrompt = ` You are a query classifier that determines whether a user question requires simple retrieval (Normal) or complex reasoning (Thinking). Use these SPECIFIC criteria for classification: @@ -102,22 +110,28 @@ Respond with a JSON object containing: Be conservative - when in doubt, default to "Normal" for better performance.`; - try { - const result = await generateObject({ - model: openai('gpt-4o-mini'), // Use faster model for classification - system: systemPrompt, - prompt: `Classify this user query: "${input}"`, - schema: PromptClassificationSchema, - maxTokens: 200, - }); - - ctx.logger.info('Prompt classified as %s (confidence: %f): %s', - result.object.type, result.object.confidence, result.object.reasoning); - - return result.object.type as PromptType; - - } catch (error) { - ctx.logger.error('Error classifying prompt, defaulting to Normal: %o', error); - return 'Normal' as PromptType; - } + try { + const result = await generateObject({ + model: openai('gpt-4o-mini'), // Use faster model for classification + system: systemPrompt, + prompt: `Classify this user query: "${input}"`, + schema: PromptClassificationSchema, + maxTokens: 200, + }); + + ctx.logger.info( + 'Prompt classified as %s (confidence: %f): %s', + result.object.type, + result.object.confidence, + result.object.reasoning + ); + + return result.object.type as PromptType; + } catch (error) { + ctx.logger.error( + 'Error classifying prompt, defaulting to Normal: %o', + error + ); + return 'Normal' as PromptType; + } } diff --git a/agent-docs/src/agents/doc-qa/rag.ts b/agent-docs/src/agents/doc-qa/rag.ts index 2be63873..3140fd26 100644 --- a/agent-docs/src/agents/doc-qa/rag.ts +++ b/agent-docs/src/agents/doc-qa/rag.ts @@ -1,20 +1,22 @@ import type { AgentContext } from '@agentuity/sdk'; -import { generateObject } from 'ai'; import { openai } from '@ai-sdk/openai'; - -import { retrieveRelevantDocs } from './retriever'; +import { generateObject } from 'ai'; import { rephraseVaguePrompt } from './prompt'; -import { AnswerSchema } from './types'; +import { retrieveRelevantDocs } from './retriever'; import type { Answer } from './types'; +import { AnswerSchema } from './types'; -export default async function answerQuestion(ctx: AgentContext, prompt: string) { - // First, rephrase the prompt for better vector search - const rephrasedPrompt = await rephraseVaguePrompt(ctx, prompt); - - // Use the rephrased prompt for document retrieval - const relevantDocs = await retrieveRelevantDocs(ctx, rephrasedPrompt); +export default async function answerQuestion( + ctx: AgentContext, + prompt: string +) { + // First, rephrase the prompt for better vector search + const rephrasedPrompt = await rephraseVaguePrompt(ctx, prompt); - const systemPrompt = ` + // Use the rephrased prompt for document retrieval + const relevantDocs = await retrieveRelevantDocs(ctx, rephrasedPrompt); + + const systemPrompt = ` You are Agentuity's developer-documentation assistant. === CONTEXT === @@ -93,21 +95,21 @@ ${JSON.stringify(relevantDocs, null, 2)} `; - try { - const result = await generateObject({ - model: openai('gpt-4o'), - system: systemPrompt, - prompt: `The user is mostly a software engineer. Your answer should be concise, straightforward and in most cases, supplying the answer with examples code snipped is ideal.`, - schema: AnswerSchema, - maxTokens: 2048, - }); - return result.object; - } catch (error) { - ctx.logger.error('Error generating answer: %o', error); - - // Fallback response with MDX formatting - const fallbackAnswer: Answer = { - answer: `## Error + try { + const result = await generateObject({ + model: openai('gpt-4o'), + system: systemPrompt, + prompt: 'The user is mostly a software engineer. Your answer should be concise, straightforward and in most cases, supplying the answer with examples code snipped is ideal.', + schema: AnswerSchema, + maxTokens: 2048, + }); + return result.object; + } catch (error) { + ctx.logger.error('Error generating answer: %o', error); + + // Fallback response with MDX formatting + const fallbackAnswer: Answer = { + answer: `## Error I apologize, but I encountered an error while processing your question. @@ -117,9 +119,9 @@ I apologize, but I encountered an error while processing your question. - Checking if your question relates to Agentuity's documented features > If the problem persists, please contact support.`, - documents: [] - }; + documents: [], + }; - return fallbackAnswer; - } -} \ No newline at end of file + return fallbackAnswer; + } +} diff --git a/agent-docs/src/agents/doc-qa/retriever.ts b/agent-docs/src/agents/doc-qa/retriever.ts index b57c69fa..b63922d3 100644 --- a/agent-docs/src/agents/doc-qa/retriever.ts +++ b/agent-docs/src/agents/doc-qa/retriever.ts @@ -3,188 +3,224 @@ import type { AgentContext } from '@agentuity/sdk'; import { VECTOR_STORE_NAME, vectorSearchNumber } from '../../../config'; import type { RelevantDoc } from './types'; - - /** * Expands a group of chunks from the same path by creating a set of all needed chunk indices * and querying for them once */ async function expandPathGroup( - ctx: AgentContext, - path: string, - pathChunks: Array<{ - path: string; - content: string; - relevanceScore?: number; - chunkIndex?: number; - }> + ctx: AgentContext, + path: string, + pathChunks: Array<{ + path: string; + content: string; + relevanceScore?: number; + chunkIndex?: number; + }> ): Promise { - const contextWindow = 1; // Get 1 chunk before and after each chunk - const expandedChunkIndices = new Set(); - - // Add neighbors for each chunk to the set - for (const chunk of pathChunks) { - if (chunk.chunkIndex !== undefined) { - const targetIndex = chunk.chunkIndex; - - // Add the chunk itself and its neighbors - expandedChunkIndices.add(targetIndex - contextWindow); - expandedChunkIndices.add(targetIndex); - expandedChunkIndices.add(targetIndex + contextWindow); - } - } - - // Remove negative indices - const validIndices = Array.from(expandedChunkIndices).filter(index => index >= 0); - - if (validIndices.length === 0) { - ctx.logger.warn('No valid chunk indices found for path: %s', path); - return null; - } - - // Sort indices - validIndices.sort((a, b) => a - b); - - try { - // Query for all chunks at once - const chunkQueries = validIndices.map(index => - ctx.vector.search(VECTOR_STORE_NAME, { - query: ' ', - limit: 1, - metadata: { path: path, chunkIndex: index } - }) - ); - - const results = await Promise.all(chunkQueries); - - // Collect found chunks - const foundChunks: Array<{ index: number; text: string }> = []; - - for (const result of results) { - if (result.length > 0 && result[0] && result[0].metadata) { - const metadata = result[0].metadata; - if (typeof metadata.chunkIndex === 'number' && typeof metadata.text === 'string') { - foundChunks.push({ - index: metadata.chunkIndex, - text: metadata.text - }); - } - } - } - - if (foundChunks.length === 0) { - ctx.logger.warn('No chunks found for path: %s', path); - return null; - } - - // Sort by index and combine content - const sortedChunks = foundChunks.sort((a, b) => a.index - b.index); - const expandedContent = sortedChunks.map(chunk => chunk.text).join('\n\n'); - - // Find the best relevance score from the original chunks - const bestScore = Math.max(...pathChunks.map(chunk => chunk.relevanceScore || 0)); - - // Create chunk range - const minIndex = Math.min(...sortedChunks.map(c => c.index)); - const maxIndex = Math.max(...sortedChunks.map(c => c.index)); - const chunkRange = minIndex === maxIndex ? `${minIndex}` : `${minIndex}-${maxIndex}`; - - ctx.logger.debug('Expanded path %s with %d chunks (range: %s) score %d', path, foundChunks.length, chunkRange, bestScore); - - return { - path, - content: expandedContent, - relevanceScore: bestScore, - chunkRange, - chunkIndex: undefined // Not applicable for grouped chunks - }; - - } catch (err) { - ctx.logger.error('Error expanding path group %s: %o', path, err); - return null; - } -} + const contextWindow = 1; // Get 1 chunk before and after each chunk + const expandedChunkIndices = new Set(); + + // Add neighbors for each chunk to the set + for (const chunk of pathChunks) { + if (chunk.chunkIndex !== undefined) { + const targetIndex = chunk.chunkIndex; + + // Add the chunk itself and its neighbors + expandedChunkIndices.add(targetIndex - contextWindow); + expandedChunkIndices.add(targetIndex); + expandedChunkIndices.add(targetIndex + contextWindow); + } + } + + // Remove negative indices + const validIndices = Array.from(expandedChunkIndices).filter( + (index) => index >= 0 + ); + + if (validIndices.length === 0) { + ctx.logger.warn('No valid chunk indices found for path: %s', path); + return null; + } + + // Sort indices + validIndices.sort((a, b) => a - b); + + try { + // Query for all chunks at once + const chunkQueries = validIndices.map((index) => + ctx.vector.search(VECTOR_STORE_NAME, { + query: ' ', + limit: 1, + metadata: { path: path, chunkIndex: index }, + }) + ); + + const results = await Promise.all(chunkQueries); + + // Collect found chunks + const foundChunks: Array<{ index: number; text: string }> = []; + + for (const result of results) { + if (result.length > 0 && result[0] && result[0].metadata) { + const metadata = result[0].metadata; + if ( + typeof metadata.chunkIndex === 'number' && + typeof metadata.text === 'string' + ) { + foundChunks.push({ + index: metadata.chunkIndex, + text: metadata.text, + }); + } + } + } + + if (foundChunks.length === 0) { + ctx.logger.warn('No chunks found for path: %s', path); + return null; + } + + // Sort by index and combine content + const sortedChunks = foundChunks.sort((a, b) => a.index - b.index); + const expandedContent = sortedChunks + .map((chunk) => chunk.text) + .join('\n\n'); + + // Find the best relevance score from the original chunks + const bestScore = Math.max( + ...pathChunks.map((chunk) => chunk.relevanceScore || 0) + ); + + // Create chunk range + const minIndex = Math.min(...sortedChunks.map((c) => c.index)); + const maxIndex = Math.max(...sortedChunks.map((c) => c.index)); + const chunkRange = + minIndex === maxIndex ? `${minIndex}` : `${minIndex}-${maxIndex}`; -export async function retrieveRelevantDocs(ctx: AgentContext, prompt: string): Promise { - const dbQuery = { - query: prompt, - limit: vectorSearchNumber - } - try { - const vectors = await ctx.vector.search(VECTOR_STORE_NAME, dbQuery); - - ctx.logger.debug('Vector search returned %d results. First vector structure: %o', - vectors.length, vectors[0]); - - // Process each relevant chunk and expand with context - const relevantChunks: Array<{ - path: string; - content: string; - relevanceScore?: number; - chunkIndex?: number; - }> = []; - - for (const vector of vectors) { - if (!vector.metadata) { - ctx.logger.warn('Vector missing metadata, skipping'); - continue; - } - - const path = typeof vector.metadata.path === 'string' ? vector.metadata.path : undefined; - const text = typeof vector.metadata.text === 'string' ? vector.metadata.text : ''; - const chunkIndex = typeof vector.metadata.chunkIndex === 'number' ? vector.metadata.chunkIndex : undefined; - - if (!path) { - ctx.logger.warn('Vector metadata path is not a string, skipping'); - continue; - } - - const relevanceScore = (vector as any).similarity; - - ctx.logger.debug('Vector for path %s, chunk %d: similarity=%s, relevanceScore=%s', - path, chunkIndex, (vector as any).similarity, relevanceScore); - - relevantChunks.push({ - path, - content: text, - relevanceScore, - chunkIndex: chunkIndex - }); - } - - // Group chunks by path - const chunksByPath = new Map>(); - - for (const chunk of relevantChunks) { - if (!chunksByPath.has(chunk.path)) { - chunksByPath.set(chunk.path, []); - } - const pathChunks = chunksByPath.get(chunk.path); - if (pathChunks) { - pathChunks.push(chunk); - } - } - - // Expand each path group together - const relevantDocs: RelevantDoc[] = []; - - for (const [path, pathChunks] of chunksByPath) { - const expandedDoc = await expandPathGroup(ctx, path, pathChunks); - if (expandedDoc) { - relevantDocs.push(expandedDoc); - } - } - - ctx.logger.info('Retrieved and expanded %d relevant chunks from vector search', relevantDocs.length); - return relevantDocs; - } catch (err) { - ctx.logger.error('Error retrieving relevant docs: %o', err); - return []; - } + ctx.logger.debug( + 'Expanded path %s with %d chunks (range: %s) score %d', + path, + foundChunks.length, + chunkRange, + bestScore + ); + + return { + path, + content: expandedContent, + relevanceScore: bestScore, + chunkRange, + chunkIndex: undefined, // Not applicable for grouped chunks + }; + } catch (err) { + ctx.logger.error('Error expanding path group %s: %o', path, err); + return null; + } } +export async function retrieveRelevantDocs( + ctx: AgentContext, + prompt: string +): Promise { + const dbQuery = { + query: prompt, + limit: vectorSearchNumber, + }; + try { + const vectors = await ctx.vector.search(VECTOR_STORE_NAME, dbQuery); + + ctx.logger.debug( + 'Vector search returned %d results. First vector structure: %o', + vectors.length, + vectors[0] + ); + + // Process each relevant chunk and expand with context + const relevantChunks: Array<{ + path: string; + content: string; + relevanceScore?: number; + chunkIndex?: number; + }> = []; + + for (const vector of vectors) { + if (!vector.metadata) { + ctx.logger.warn('Vector missing metadata, skipping'); + continue; + } + + const path = + typeof vector.metadata.path === 'string' + ? vector.metadata.path + : undefined; + const text = + typeof vector.metadata.text === 'string' ? vector.metadata.text : ''; + const chunkIndex = + typeof vector.metadata.chunkIndex === 'number' + ? vector.metadata.chunkIndex + : undefined; + + if (!path) { + ctx.logger.warn('Vector metadata path is not a string, skipping'); + continue; + } + + const relevanceScore = (vector as any).similarity; + + ctx.logger.debug( + 'Vector for path %s, chunk %d: similarity=%s, relevanceScore=%s', + path, + chunkIndex, + (vector as any).similarity, + relevanceScore + ); + + relevantChunks.push({ + path, + content: text, + relevanceScore, + chunkIndex: chunkIndex, + }); + } + + // Group chunks by path + const chunksByPath = new Map< + string, + Array<{ + path: string; + content: string; + relevanceScore?: number; + chunkIndex?: number; + }> + >(); + + for (const chunk of relevantChunks) { + if (!chunksByPath.has(chunk.path)) { + chunksByPath.set(chunk.path, []); + } + const pathChunks = chunksByPath.get(chunk.path); + if (pathChunks) { + pathChunks.push(chunk); + } + } + + // Expand each path group together + const relevantDocs: RelevantDoc[] = []; + + for (const [path, pathChunks] of chunksByPath) { + const expandedDoc = await expandPathGroup(ctx, path, pathChunks); + if (expandedDoc) { + relevantDocs.push(expandedDoc); + } + } + + ctx.logger.info( + 'Retrieved and expanded %d relevant chunks from vector search', + relevantDocs.length + ); + return relevantDocs; + } catch (err) { + ctx.logger.error('Error retrieving relevant docs: %o', err); + return []; + } +} diff --git a/agent-docs/src/agents/doc-qa/types.ts b/agent-docs/src/agents/doc-qa/types.ts index 23672e0b..8e37facf 100644 --- a/agent-docs/src/agents/doc-qa/types.ts +++ b/agent-docs/src/agents/doc-qa/types.ts @@ -1,28 +1,28 @@ import { z } from 'zod'; export const RelevantDocSchema = z.object({ - path: z.string(), - content: z.string(), - relevanceScore: z.number().optional(), - chunkRange: z.string().optional(), - chunkIndex: z.number().optional() + path: z.string(), + content: z.string(), + relevanceScore: z.number().optional(), + chunkRange: z.string().optional(), + chunkIndex: z.number().optional(), }); export const AnswerSchema = z.object({ - answer: z.string(), - documents: z.array(z.string()) + answer: z.string(), + documents: z.array(z.string()), }); export const PromptTypeSchema = z.enum(['Normal', 'Thinking']); export const PromptClassificationSchema = z.object({ - type: PromptTypeSchema, - confidence: z.number().min(0).max(1), - reasoning: z.string() + type: PromptTypeSchema, + confidence: z.number().min(0).max(1), + reasoning: z.string(), }); // Generated TypeScript types export type RelevantDoc = z.infer; export type Answer = z.infer; export type PromptType = z.infer; -export type PromptClassification = z.infer; \ No newline at end of file +export type PromptClassification = z.infer; diff --git a/agent-docs/tsconfig.json b/agent-docs/tsconfig.json index 314bfbf3..42442234 100644 --- a/agent-docs/tsconfig.json +++ b/agent-docs/tsconfig.json @@ -1,24 +1,24 @@ { - "compilerOptions": { - "allowImportingTsExtensions": true, - "allowJs": true, - "esModuleInterop": true, - "jsx": "react-jsx", - "lib": ["ESNext"], - "module": "ESNext", - "moduleDetection": "force", - "moduleResolution": "bundler", - "noEmit": true, - "noFallthroughCasesInSwitch": true, - "noPropertyAccessFromIndexSignature": false, - "noUncheckedIndexedAccess": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "skipLibCheck": true, - "strict": true, - "target": "ESNext", - "types": ["@types/bun", "@agentuity/sdk"], - "verbatimModuleSyntax": true - }, - "exclude": ["node_modules", ".agentuity"] + "compilerOptions": { + "allowImportingTsExtensions": true, + "allowJs": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "lib": ["ESNext"], + "module": "ESNext", + "moduleDetection": "force", + "moduleResolution": "bundler", + "noEmit": true, + "noFallthroughCasesInSwitch": true, + "noPropertyAccessFromIndexSignature": false, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "skipLibCheck": true, + "strict": true, + "target": "ESNext", + "types": ["@types/bun", "@agentuity/sdk"], + "verbatimModuleSyntax": true + }, + "exclude": ["node_modules", ".agentuity"] } diff --git a/app/(docs)/[[...slug]]/page.tsx b/app/(docs)/[[...slug]]/page.tsx index 1231e1a5..1e04170f 100644 --- a/app/(docs)/[[...slug]]/page.tsx +++ b/app/(docs)/[[...slug]]/page.tsx @@ -1,24 +1,24 @@ -import { CLICommand } from "@/components/CLICommand"; -import { CodeExample } from "@/components/CodeExample"; -import { Mermaid } from "@/components/Mermaid"; -import { Sparkle } from "@/components/Sparkle"; -import { ThemeImage } from "@/components/ThemeImage"; -import { TypingAnimation } from "@/components/TypingAnimation"; -import { XButton } from "@/components/XButton"; -import { source } from "@/lib/source"; -import { Popup, PopupContent, PopupTrigger } from "fumadocs-twoslash/ui"; -import { Tab, Tabs } from "fumadocs-ui/components/tabs"; -import defaultMdxComponents from "fumadocs-ui/mdx"; +import { Popup, PopupContent, PopupTrigger } from 'fumadocs-twoslash/ui'; +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; +import defaultMdxComponents from 'fumadocs-ui/mdx'; import { DocsBody, DocsDescription, DocsPage, DocsTitle, -} from "fumadocs-ui/page"; -import { notFound } from "next/navigation"; -import { CommunityButton } from "../../../components/Community"; -import { NavButton } from "../../../components/NavButton"; -import CopyPageDropdown from "../../../components/CopyPageDropdown"; +} from 'fumadocs-ui/page'; +import { notFound } from 'next/navigation'; +import { CLICommand } from '@/components/CLICommand'; +import { CodeExample } from '@/components/CodeExample'; +import { Mermaid } from '@/components/Mermaid'; +import { Sparkle } from '@/components/Sparkle'; +import { ThemeImage } from '@/components/ThemeImage'; +import { TypingAnimation } from '@/components/TypingAnimation'; +import { XButton } from '@/components/XButton'; +import { source } from '@/lib/source'; +import { CommunityButton } from '../../../components/Community'; +import CopyPageDropdown from '../../../components/CopyPageDropdown'; +import { NavButton } from '../../../components/NavButton'; export default async function Page(props: { params: Promise<{ slug?: string[] }>; @@ -35,9 +35,9 @@ export default async function Page(props: { toc={page.data.toc} full={page.data.full} editOnGithub={{ - owner: "agentuity", - repo: "docs", - sha: "main", + owner: 'agentuity', + repo: 'docs', + sha: 'main', path: `content/${page.file.path}`, }} > @@ -74,7 +74,7 @@ export default async function Page(props: { with other humans building agents.

- Send us an email at{" "} + Send us an email at{' '} hi@agentuity.com if you'd like to get in touch.

@@ -82,7 +82,7 @@ export default async function Page(props: { Please

- If you haven't already, please{" "} + If you haven't already, please{' '} Signup for your free account now and start building your first agent!

@@ -106,9 +106,9 @@ export async function generateMetadata(props: { return { title: - page.data.title && page.data.title !== "Agentuity" + page.data.title && page.data.title !== 'Agentuity' ? `${page.data.title} — Agentuity Docs` - : "Agentuity Docs", + : 'Agentuity Docs', description: page.data.description, }; } diff --git a/app/(docs)/layout.tsx b/app/(docs)/layout.tsx index a3ee0ca4..5900714e 100644 --- a/app/(docs)/layout.tsx +++ b/app/(docs)/layout.tsx @@ -1,9 +1,9 @@ -import { baseOptions } from "@/app/layout.config"; -import { source } from "@/lib/source"; -import { DocsLayout } from "fumadocs-ui/layouts/notebook"; import { LargeSearchToggle } from 'fumadocs-ui/components/layout/search-toggle'; -import AISearchToggle from "../../components/AISearchToggle"; -import type { ReactNode } from "react"; +import { DocsLayout } from 'fumadocs-ui/layouts/notebook'; +import type { ReactNode } from 'react'; +import { baseOptions } from '@/app/layout.config'; +import { source } from '@/lib/source'; +import AISearchToggle from '../../components/AISearchToggle'; export default function Layout({ children }: { children: ReactNode }) { return ( @@ -12,12 +12,12 @@ export default function Layout({ children }: { children: ReactNode }) { tree={source.pageTree} searchToggle={{ components: { - lg: ( -
- - -
- ), + lg: ( +
+ + +
+ ), }, }} > diff --git a/app/api/page-content/route.ts b/app/api/page-content/route.ts index 3b71c853..c91c3939 100644 --- a/app/api/page-content/route.ts +++ b/app/api/page-content/route.ts @@ -1,45 +1,46 @@ -import { NextRequest } from 'next/server'; +import type { NextRequest } from 'next/server'; import docsJson from '@/content/docs.json'; interface Doc { - file: string; - meta: Record; - content: string; + file: string; + meta: Record; + content: string; } const docs = docsJson.docs as Doc[]; export async function GET(request: NextRequest) { - try { - const { searchParams } = new URL(request.url); - const path = searchParams.get('path'); - - if (!path) { - return new Response('Path parameter required', { status: 400 }); - } - - if (path.includes('..') || path.includes('\\') || path.startsWith('/')) { - return new Response('Invalid path parameter', { status: 400 }); - } - - const doc = docs.find(d => - d.file === `${path}.mdx` || - d.file === `${path}/index.mdx` || - d.file === path - ); - - if (!doc) { - return new Response('Page not found', { status: 404 }); - } - - return Response.json({ - content: doc.content, - title: doc.meta.title || '', - description: doc.meta.description || '', - path - }); - } catch (error) { - console.error('Error reading page content:', error); - return new Response('Failed to read page content', { status: 500 }); - } + try { + const { searchParams } = new URL(request.url); + const path = searchParams.get('path'); + + if (!path) { + return new Response('Path parameter required', { status: 400 }); + } + + if (path.includes('..') || path.includes('\\') || path.startsWith('/')) { + return new Response('Invalid path parameter', { status: 400 }); + } + + const doc = docs.find( + (d) => + d.file === `${path}.mdx` || + d.file === `${path}/index.mdx` || + d.file === path + ); + + if (!doc) { + return new Response('Page not found', { status: 404 }); + } + + return Response.json({ + content: doc.content, + title: doc.meta.title || '', + description: doc.meta.description || '', + path, + }); + } catch (error) { + console.error('Error reading page content:', error); + return new Response('Failed to read page content', { status: 500 }); + } } diff --git a/app/api/rag-search/route.ts b/app/api/rag-search/route.ts index be9ec324..665a892f 100644 --- a/app/api/rag-search/route.ts +++ b/app/api/rag-search/route.ts @@ -1,165 +1,177 @@ -import { source } from '@/lib/source'; -import { NextRequest } from 'next/server'; +import type { NextRequest } from 'next/server'; import { getAgentConfig } from '@/lib/env'; +import { source } from '@/lib/source'; function documentPathToUrl(docPath: string): string { - // Remove the .md or .mdx extension before any # symbol - const path = docPath.replace(/\.mdx?(?=#|$)/, ''); - - // Split path and hash (if any) - const [basePath, hash] = path.split('#'); - - // Split the base path into segments - const segments = basePath.split('/').filter(Boolean); - - // If the last segment is 'index', remove it - if (segments.length > 0 && segments[segments.length - 1].toLowerCase() === 'index') { - segments.pop(); - } - - // Reconstruct the path - let url = '/' + segments.join('/'); - if (url === '/') { - url = '/'; - } - if (hash) { - url += '#' + hash; - } - return url; + // Remove the .md or .mdx extension before any # symbol + const path = docPath.replace(/\.mdx?(?=#|$)/, ''); + + // Split path and hash (if any) + const [basePath, hash] = path.split('#'); + + // Split the base path into segments + const segments = basePath.split('/').filter(Boolean); + + // If the last segment is 'index', remove it + if ( + segments.length > 0 && + segments[segments.length - 1].toLowerCase() === 'index' + ) { + segments.pop(); + } + + // Reconstruct the path + let url = '/' + segments.join('/'); + if (url === '/') { + url = '/'; + } + if (hash) { + url += '#' + hash; + } + return url; } // Helper function to get document title and description from source -function getDocumentMetadata(docPath: string): { title: string; description?: string } { - try { - const urlPath = documentPathToUrl(docPath).substring(1).split('/'); - const page = source.getPage(urlPath); - - if (page?.data) { - return { - title: page.data.title || formatPathAsTitle(docPath), - description: page.data.description - }; - } - } catch (error) { - console.warn(`Failed to get metadata for ${docPath}:`, error); - } - - return { title: formatPathAsTitle(docPath) }; +function getDocumentMetadata(docPath: string): { + title: string; + description?: string; +} { + try { + const urlPath = documentPathToUrl(docPath).substring(1).split('/'); + const page = source.getPage(urlPath); + + if (page?.data) { + return { + title: page.data.title || formatPathAsTitle(docPath), + description: page.data.description, + }; + } + } catch (error) { + console.warn(`Failed to get metadata for ${docPath}:`, error); + } + + return { title: formatPathAsTitle(docPath) }; } function formatPathAsTitle(docPath: string): string { - return docPath - .replace(/\.mdx?$/, '') - .split('/') - .map(segment => segment.charAt(0).toUpperCase() + segment.slice(1)) - .join(' > '); + return docPath + .replace(/\.mdx?$/, '') + .split('/') + .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)) + .join(' > '); } -function getDocumentSnippet(docPath: string, maxLength: number = 150): string { - try { - const urlPath = documentPathToUrl(docPath).substring(1).split('/'); - const page = source.getPage(urlPath); - - if (page?.data.description) { - return page.data.description.length > maxLength - ? page.data.description.substring(0, maxLength) + '...' - : page.data.description; - } - - // Fallback description based on path - const pathParts = docPath.replace(/\.mdx?$/, '').split('/'); - const section = pathParts[0]; - const topic = pathParts[pathParts.length - 1]; - - return `Learn about ${topic} in the ${section} section of our documentation.`; - } catch { - return `Documentation for ${formatPathAsTitle(docPath)}`; - } +function getDocumentSnippet(docPath: string, maxLength = 150): string { + try { + const urlPath = documentPathToUrl(docPath).substring(1).split('/'); + const page = source.getPage(urlPath); + + if (page?.data.description) { + return page.data.description.length > maxLength + ? page.data.description.substring(0, maxLength) + '...' + : page.data.description; + } + + // Fallback description based on path + const pathParts = docPath.replace(/\.mdx?$/, '').split('/'); + const section = pathParts[0]; + const topic = pathParts[pathParts.length - 1]; + + return `Learn about ${topic} in the ${section} section of our documentation.`; + } catch { + return `Documentation for ${formatPathAsTitle(docPath)}`; + } } export async function GET(request: NextRequest) { - const { searchParams } = new URL(request.url); - const query = searchParams.get('query'); - - // If no query, return empty results - if (!query || query.trim().length === 0) { - return Response.json([]); - } - - try { - const agentConfig = getAgentConfig(); - - // Prepare headers - const headers: Record = { - 'Content-Type': 'application/json', - }; - - // Add bearer token if provided - if (agentConfig.bearerToken) { - headers['Authorization'] = `Bearer ${agentConfig.bearerToken}`; - } - - const response = await fetch(agentConfig.url, { - method: 'POST', - headers, - body: JSON.stringify({ message: query }), - }); - - if (!response.ok) { - throw new Error(`Agent API error: ${response.status} ${response.statusText}`); - } - - const data = await response.json(); - const results = []; - - if (data?.answer?.trim()) { - results.push({ - id: `ai-answer-${Date.now()}`, - url: '#ai-answer', - title: 'AI Answer', - content: data.answer.trim(), - type: 'ai-answer' - }); - } - - // Add related documents as clickable results - if (data.documents && Array.isArray(data.documents) && data.documents.length > 0) { - const uniqueDocuments = [...new Set(data.documents as string[])]; - - uniqueDocuments.forEach((docPath: string, index: number) => { - try { - const url = documentPathToUrl(docPath); - const metadata = getDocumentMetadata(docPath); - const snippet = getDocumentSnippet(docPath); - - results.push({ - id: `doc-${Date.now()}-${index}`, - url: url, - title: metadata.title, - content: snippet, - type: 'document' - }); - } catch (error) { - console.warn(`Failed to process document ${docPath}:`, error); - } - }); - } - - console.log('Returning RAG results:', results.length, 'items'); - return Response.json(results); - - } catch (error) { - console.error('Error calling AI agent:', error); - - // Return error message as AI answer - return Response.json([ - { - id: 'error-notice', - url: '#error', - title: '❌ Search Error', - content: 'AI search is temporarily unavailable. Please try again later or use the regular search.', - type: 'ai-answer' - } - ]); - } -} \ No newline at end of file + const { searchParams } = new URL(request.url); + const query = searchParams.get('query'); + + // If no query, return empty results + if (!query || query.trim().length === 0) { + return Response.json([]); + } + + try { + const agentConfig = getAgentConfig(); + + // Prepare headers + const headers: Record = { + 'Content-Type': 'application/json', + }; + + // Add bearer token if provided + if (agentConfig.bearerToken) { + headers['Authorization'] = `Bearer ${agentConfig.bearerToken}`; + } + + const response = await fetch(agentConfig.url, { + method: 'POST', + headers, + body: JSON.stringify({ message: query }), + }); + + if (!response.ok) { + throw new Error( + `Agent API error: ${response.status} ${response.statusText}` + ); + } + + const data = await response.json(); + const results = []; + + if (data?.answer?.trim()) { + results.push({ + id: `ai-answer-${Date.now()}`, + url: '#ai-answer', + title: 'AI Answer', + content: data.answer.trim(), + type: 'ai-answer', + }); + } + + // Add related documents as clickable results + if ( + data.documents && + Array.isArray(data.documents) && + data.documents.length > 0 + ) { + const uniqueDocuments = [...new Set(data.documents as string[])]; + + uniqueDocuments.forEach((docPath: string, index: number) => { + try { + const url = documentPathToUrl(docPath); + const metadata = getDocumentMetadata(docPath); + const snippet = getDocumentSnippet(docPath); + + results.push({ + id: `doc-${Date.now()}-${index}`, + url: url, + title: metadata.title, + content: snippet, + type: 'document', + }); + } catch (error) { + console.warn(`Failed to process document ${docPath}:`, error); + } + }); + } + + console.log('Returning RAG results:', results.length, 'items'); + return Response.json(results); + } catch (error) { + console.error('Error calling AI agent:', error); + + // Return error message as AI answer + return Response.json([ + { + id: 'error-notice', + url: '#error', + title: '❌ Search Error', + content: + 'AI search is temporarily unavailable. Please try again later or use the regular search.', + type: 'ai-answer', + }, + ]); + } +} diff --git a/app/api/search/route.ts b/app/api/search/route.ts index cb4a0a13..681f630b 100644 --- a/app/api/search/route.ts +++ b/app/api/search/route.ts @@ -1,5 +1,5 @@ -import { source } from '@/lib/source'; import { createFromSource } from 'fumadocs-core/search/server'; +import { source } from '@/lib/source'; // Export the default fumadocs search handler export const { GET } = createFromSource(source); diff --git a/app/global.css b/app/global.css index 507d580f..b379f21b 100644 --- a/app/global.css +++ b/app/global.css @@ -51,7 +51,7 @@ --color-fd-accent-foreground: var(--color-cyan-900); --color-fd-ring: var(--color-cyan-500); } - + .dark { --color-fd-background: var(--color-cyan-900); --color-fd-foreground: var(--color-white); @@ -78,11 +78,11 @@ aside [data-radix-scroll-area-viewport] button, aside [data-radix-scroll-area-viewport] a { - color: #0A0A0A; + color: #0a0a0a; } .aside { - background: #FAFAFA; + background: #fafafa; } .dark aside, @@ -92,7 +92,7 @@ aside [data-radix-scroll-area-viewport] a { .dark aside [data-radix-scroll-area-viewport] button, .dark aside [data-radix-scroll-area-viewport] a { - color: #FFF; + color: #fff; } /* make sure empty lines are rendered */ @@ -105,7 +105,7 @@ code span.line > span { } .code-example > div[role="tablist"] { - background-color: #EEE; + background-color: #eee; } .dark .code-example > div[role="tablist"] { @@ -133,7 +133,7 @@ figure > div:nth-child(2) { } .mermaid .cluster rect { - fill: #FFF !important; + fill: #fff !important; stroke: #099 !important; } @@ -158,7 +158,7 @@ figure > div:nth-child(2) { } .dark .mermaid .nodeLabel { - color: #FFF !important; + color: #fff !important; } .mermaid text.actor > tspan { diff --git a/app/layout.config.tsx b/app/layout.config.tsx index fb50b565..b52b7e52 100644 --- a/app/layout.config.tsx +++ b/app/layout.config.tsx @@ -1,14 +1,14 @@ -import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared"; -import { Github } from "lucide-react"; -import { CommunityButton } from "../components/Community"; -import { NavButton } from "../components/NavButton"; -import { XButton } from "../components/XButton"; +import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; +import { Github } from 'lucide-react'; +import { CommunityButton } from '../components/Community'; +import { NavButton } from '../components/NavButton'; +import { XButton } from '../components/XButton'; /** * Shared layout configurations */ export const baseOptions: BaseLayoutProps = { nav: { - url: "/Introduction", + url: '/Introduction', title: (
- Blog - Console + + Blog + + + Console + - +
diff --git a/app/layout.tsx b/app/layout.tsx index 2440a3d1..6c55a977 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,15 +1,17 @@ -import { RootProvider } from "fumadocs-ui/provider"; -import { GeistSans } from "geist/font/sans"; -import type { ReactNode } from "react"; +import { RootProvider } from 'fumadocs-ui/provider'; +import { GeistSans } from 'geist/font/sans'; import type { Metadata } from 'next'; -import { validateEnv } from "@/lib/env"; -import "./global.css"; +import type { ReactNode } from 'react'; +import { validateEnv } from '@/lib/env'; +import './global.css'; // Validate environment variables at startup (server-side only) if (typeof window === 'undefined') { const isValid = validateEnv(); if (!isValid) { - console.warn('Environment validation failed during build – this is expected at build time'); + console.warn( + 'Environment validation failed during build – this is expected at build time' + ); } } @@ -82,7 +84,8 @@ export const metadata: Metadata = { title: 'Agentuity Docs', statusBarStyle: 'black-translucent', }, - abstract: 'Documentation for Agentuity, the cloud platform purpose-built for deploying, managing, and scaling AI agents.', + abstract: + 'Documentation for Agentuity, the cloud platform purpose-built for deploying, managing, and scaling AI agents.', category: 'technology', classification: 'Business Software', }; @@ -91,9 +94,7 @@ export default function Layout({ children }: { children: ReactNode }) { return ( - + {children} diff --git a/app/llms-full.txt/route.ts b/app/llms-full.txt/route.ts index 1bc80a1f..6648a740 100644 --- a/app/llms-full.txt/route.ts +++ b/app/llms-full.txt/route.ts @@ -1,4 +1,4 @@ -import docsJson from "@/content/docs.json"; +import docsJson from '@/content/docs.json'; interface Doc { file: string; @@ -49,21 +49,21 @@ When interacting with this documentation: return `file: ${doc.file}\nmeta: ${JSON.stringify(doc.meta, null, 2)}\n${doc.content}`; }); - return new Response(preamble + scanned.join("\n\n"), { - headers: { "Content-Type": "text/plain" }, + return new Response(preamble + scanned.join('\n\n'), { + headers: { 'Content-Type': 'text/plain' }, }); } catch (error) { - console.error("Error in GET route:", error); + console.error('Error in GET route:', error); return new Response( JSON.stringify({ - error: "Failed to process content", + error: 'Failed to process content', details: error instanceof Error ? error.message : String(error), }), { status: 500, - headers: { "Content-Type": "application/json" }, - }, + headers: { 'Content-Type': 'application/json' }, + } ); } } diff --git a/app/llms.txt/route.ts b/app/llms.txt/route.ts index 9f21c721..78a21052 100644 --- a/app/llms.txt/route.ts +++ b/app/llms.txt/route.ts @@ -1,4 +1,4 @@ -import docsJson from "@/content/docs.json"; +import docsJson from '@/content/docs.json'; interface Doc { file: string; @@ -46,26 +46,26 @@ When interacting with this documentation: 6. Troubleshooting - Common issues and solutions\n\n`; const scanned = docs.map((doc) => { - if (!doc.file.startsWith("Changelog")) { + if (!doc.file.startsWith('Changelog')) { return `file: ${doc.file}\nmeta: ${JSON.stringify(doc.meta, null, 2)}\n${doc.content}`; } }); - return new Response(preamble + scanned.join("\n\n"), { - headers: { "Content-Type": "text/plain" }, + return new Response(preamble + scanned.join('\n\n'), { + headers: { 'Content-Type': 'text/plain' }, }); } catch (error) { - console.error("Error in GET route:", error); + console.error('Error in GET route:', error); return new Response( JSON.stringify({ - error: "Failed to process content", + error: 'Failed to process content', details: error instanceof Error ? error.message : String(error), }), { status: 500, - headers: { "Content-Type": "application/json" }, - }, + headers: { 'Content-Type': 'application/json' }, + } ); } } diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..a6475d1d --- /dev/null +++ b/biome.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.1.2/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "formatter": { + "enabled": true, + "useEditorconfig": true, + "formatWithErrors": false, + "indentStyle": "tab", + "indentWidth": 2, + "lineEnding": "lf", + "lineWidth": 80, + "attributePosition": "auto", + "bracketSpacing": true + }, + "assist": { + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "includes": ["**"], + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedImports": "info" + }, + "style": { + "noParameterAssign": "error", + "useAsConstAssertion": "error", + "useDefaultParameterLast": "error", + "useEnumInitializers": "error", + "useSelfClosingElements": "error", + "useSingleVarDeclarator": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error", + "noUselessElse": "error" + } + } + }, + "javascript": { + "formatter": { + "jsxQuoteStyle": "double", + "quoteProperties": "asNeeded", + "trailingCommas": "es5", + "semicolons": "always", + "arrowParentheses": "always", + "bracketSameLine": false, + "quoteStyle": "single", + "attributePosition": "auto", + "bracketSpacing": true + } + } +} diff --git a/components/AISearchToggle.tsx b/components/AISearchToggle.tsx index 6cc35d0d..7746a766 100644 --- a/components/AISearchToggle.tsx +++ b/components/AISearchToggle.tsx @@ -1,27 +1,28 @@ 'use client'; -import { useState } from 'react'; import { Sparkles } from 'lucide-react'; +import { useState } from 'react'; import CustomSearchDialog from './CustomSearchDialog'; export default function AISearchToggle() { - const [isOpen, setIsOpen] = useState(false); + const [isOpen, setIsOpen] = useState(false); - const handleToggle = (e: React.MouseEvent) => { - e.preventDefault(); - setIsOpen(true); - }; + const handleToggle = (e: React.MouseEvent) => { + e.preventDefault(); + setIsOpen(true); + }; - return ( - <> - - - - ); -} \ No newline at end of file + return ( + <> + + + + ); +} diff --git a/components/CLICommand.tsx b/components/CLICommand.tsx index 9ca0f64d..eb5349e1 100644 --- a/components/CLICommand.tsx +++ b/components/CLICommand.tsx @@ -1,4 +1,4 @@ -import { CodeBlock } from "fumadocs-ui/components/codeblock"; +import { CodeBlock } from 'fumadocs-ui/components/codeblock'; export interface CLICommandProps { command: string; @@ -10,7 +10,9 @@ export function CLICommand({ command, children }: CLICommandProps) {
- ${" "} + + $ + {' '}
{command}
{children && ( diff --git a/components/CodeExample.tsx b/components/CodeExample.tsx index 799312c1..b2d7381c 100644 --- a/components/CodeExample.tsx +++ b/components/CodeExample.tsx @@ -1,5 +1,5 @@ -import { Tab, Tabs } from "fumadocs-ui/components/tabs"; -import { DynamicCodeBlock } from "fumadocs-ui/components/dynamic-codeblock"; +import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock'; +import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; interface CodeExampleProps { py?: string; @@ -11,18 +11,14 @@ export function CodeExample({ py, js }: CodeExampleProps) { return null; } if (!py && js) { - return ( - - ); + return ; } if (!js && py) { - return ( - - ); + return ; } return ( , + props?: Omit ) { return ( ; - handler: () => Promise; + id: ActionType; + label: string; + icon: React.ComponentType<{ className?: string }>; + handler: () => Promise; } interface CopyPageDropdownProps { - enhanced?: boolean; + enhanced?: boolean; } const STORAGE_KEY = 'agentuity-copy-preference'; -export default function CopyPageDropdown({ enhanced = false }: CopyPageDropdownProps) { - const [isOpen, setIsOpen] = useState(false); - const [isLoading, setIsLoading] = useState(false); - const [preferredAction, setPreferredAction] = useState('copy-markdown'); - const [isInitialized, setIsInitialized] = useState(false); - const pathname = usePathname(); +export default function CopyPageDropdown({ + enhanced = false, +}: CopyPageDropdownProps) { + const [isOpen, setIsOpen] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [preferredAction, setPreferredAction] = + useState('copy-markdown'); + const [isInitialized, setIsInitialized] = useState(false); + const pathname = usePathname(); + + useEffect(() => { + try { + const stored = localStorage.getItem(STORAGE_KEY); + if ( + stored && + [ + 'copy-markdown', + 'view-markdown', + 'open-chatgpt', + 'open-claude', + ].includes(stored) + ) { + setPreferredAction(stored as ActionType); + } + } catch (error) { + console.error('Failed to load copy preference:', error); + } finally { + setIsInitialized(true); + } + }, []); + + const savePreference = (action: ActionType) => { + try { + localStorage.setItem(STORAGE_KEY, action); + setPreferredAction(action); + } catch (error) { + console.error('Failed to save copy preference:', error); + } + }; + + const formatMarkdownForLLM = (content: PageContent): string => { + return `# ${content.title}\n\n${content.description ? `${content.description}\n\n` : ''}${content.content}`; + }; + + const fetchPageContent = async (): Promise => { + try { + setIsLoading(true); + const contentPath = pathname.startsWith('/') + ? pathname.slice(1) + : pathname; + + const response = await fetch( + `/api/page-content?path=${encodeURIComponent(contentPath)}` + ); + if (!response.ok) throw new Error('Failed to fetch content'); + + return await response.json(); + } catch (error) { + console.error('Error fetching page content:', error); + return null; + } finally { + setIsLoading(false); + } + }; + + const handleCopyMarkdown = async () => { + const content = await fetchPageContent(); + if (!content) return; + + const markdownForLLM = formatMarkdownForLLM(content); + + try { + if (navigator.clipboard && navigator.clipboard.writeText) { + await navigator.clipboard.writeText(markdownForLLM); + } else { + const textArea = document.createElement('textarea'); + textArea.value = markdownForLLM; + textArea.style.position = 'fixed'; + textArea.style.left = '-999999px'; + textArea.style.top = '-999999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + document.execCommand('copy'); + document.body.removeChild(textArea); + } + } catch (error) { + console.error('Failed to copy to clipboard:', error); + const textArea = document.createElement('textarea'); + textArea.value = markdownForLLM; + textArea.style.position = 'fixed'; + textArea.style.left = '-999999px'; + textArea.style.top = '-999999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + document.execCommand('copy'); + } catch (fallbackError) { + console.error('Fallback copy also failed:', fallbackError); + } + document.body.removeChild(textArea); + } + setIsOpen(false); + }; - useEffect(() => { - try { - const stored = localStorage.getItem(STORAGE_KEY); - if (stored && ['copy-markdown', 'view-markdown', 'open-chatgpt', 'open-claude'].includes(stored)) { - setPreferredAction(stored as ActionType); - } - } catch (error) { - console.error('Failed to load copy preference:', error); - } finally { - setIsInitialized(true); - } - }, []); + const handleViewMarkdown = async () => { + const content = await fetchPageContent(); + if (!content) return; - const savePreference = (action: ActionType) => { - try { - localStorage.setItem(STORAGE_KEY, action); - setPreferredAction(action); - } catch (error) { - console.error('Failed to save copy preference:', error); - } - }; + const markdownForLLM = formatMarkdownForLLM(content); + const blob = new Blob([markdownForLLM], { type: 'text/markdown' }); + const url = URL.createObjectURL(blob); - const formatMarkdownForLLM = (content: PageContent): string => { - return `# ${content.title}\n\n${content.description ? `${content.description}\n\n` : ''}${content.content}`; - }; + try { + const newWindow = window.open(url, '_blank'); + if (!newWindow) { + const link = document.createElement('a'); + link.href = url; + link.download = `${content.title.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.md`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + } catch (error) { + console.error('Failed to open markdown view:', error); + const link = document.createElement('a'); + link.href = url; + link.download = `${content.title.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.md`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } - const fetchPageContent = async (): Promise => { - try { - setIsLoading(true); - const contentPath = pathname.startsWith('/') ? pathname.slice(1) : pathname; - - const response = await fetch(`/api/page-content?path=${encodeURIComponent(contentPath)}`); - if (!response.ok) throw new Error('Failed to fetch content'); - - return await response.json(); - } catch (error) { - console.error('Error fetching page content:', error); - return null; - } finally { - setIsLoading(false); - } - }; + setTimeout(() => URL.revokeObjectURL(url), 1000); + setIsOpen(false); + }; - const handleCopyMarkdown = async () => { - const content = await fetchPageContent(); - if (!content) return; - - const markdownForLLM = formatMarkdownForLLM(content); - - try { - if (navigator.clipboard && navigator.clipboard.writeText) { - await navigator.clipboard.writeText(markdownForLLM); - } else { - const textArea = document.createElement('textarea'); - textArea.value = markdownForLLM; - textArea.style.position = 'fixed'; - textArea.style.left = '-999999px'; - textArea.style.top = '-999999px'; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - document.execCommand('copy'); - document.body.removeChild(textArea); - } - } catch (error) { - console.error('Failed to copy to clipboard:', error); - const textArea = document.createElement('textarea'); - textArea.value = markdownForLLM; - textArea.style.position = 'fixed'; - textArea.style.left = '-999999px'; - textArea.style.top = '-999999px'; - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - try { - document.execCommand('copy'); - } catch (fallbackError) { - console.error('Fallback copy also failed:', fallbackError); - } - document.body.removeChild(textArea); - } - setIsOpen(false); - }; + const handleOpenInChatGPT = async () => { + const currentUrl = `${window.location.origin}${pathname}`; + const chatGPTUrl = `https://chatgpt.com/?hints=search&prompt=${encodeURIComponent(`Read from ${currentUrl} so I can ask questions about it`)}`; - const handleViewMarkdown = async () => { - const content = await fetchPageContent(); - if (!content) return; - - const markdownForLLM = formatMarkdownForLLM(content); - const blob = new Blob([markdownForLLM], { type: 'text/markdown' }); - const url = URL.createObjectURL(blob); - - try { - const newWindow = window.open(url, '_blank'); - if (!newWindow) { - const link = document.createElement('a'); - link.href = url; - link.download = `${content.title.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.md`; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - } catch (error) { - console.error('Failed to open markdown view:', error); - const link = document.createElement('a'); - link.href = url; - link.download = `${content.title.replace(/[^a-z0-9]/gi, '_').toLowerCase()}.md`; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - - setTimeout(() => URL.revokeObjectURL(url), 1000); - setIsOpen(false); - }; + try { + const newWindow = window.open(chatGPTUrl, '_blank'); + if (!newWindow) { + window.location.href = chatGPTUrl; + } + } catch (error) { + console.error('Failed to open ChatGPT:', error); + window.location.href = chatGPTUrl; + } + setIsOpen(false); + }; - const handleOpenInChatGPT = async () => { - const currentUrl = `${window.location.origin}${pathname}`; - const chatGPTUrl = `https://chatgpt.com/?hints=search&prompt=${encodeURIComponent(`Read from ${currentUrl} so I can ask questions about it`)}`; - - try { - const newWindow = window.open(chatGPTUrl, '_blank'); - if (!newWindow) { - window.location.href = chatGPTUrl; - } - } catch (error) { - console.error('Failed to open ChatGPT:', error); - window.location.href = chatGPTUrl; - } - setIsOpen(false); - }; + const handleOpenInClaude = async () => { + const currentUrl = `${window.location.origin}${pathname}`; + const claudeUrl = `https://claude.ai/new?q=${encodeURIComponent(`Read from ${currentUrl} so I can ask questions about it`)}`; - const handleOpenInClaude = async () => { - const currentUrl = `${window.location.origin}${pathname}`; - const claudeUrl = `https://claude.ai/new?q=${encodeURIComponent(`Read from ${currentUrl} so I can ask questions about it`)}`; - - try { - const newWindow = window.open(claudeUrl, '_blank'); - if (!newWindow) { - window.location.href = claudeUrl; - } - } catch (error) { - console.error('Failed to open Claude:', error); - window.location.href = claudeUrl; - } - setIsOpen(false); - }; + try { + const newWindow = window.open(claudeUrl, '_blank'); + if (!newWindow) { + window.location.href = claudeUrl; + } + } catch (error) { + console.error('Failed to open Claude:', error); + window.location.href = claudeUrl; + } + setIsOpen(false); + }; - const actionConfigs: ActionConfig[] = [ - { - id: 'copy-markdown', - label: 'Copy as Markdown', - icon: Copy, - handler: handleCopyMarkdown - }, - { - id: 'view-markdown', - label: 'View as Markdown', - icon: FileText, - handler: handleViewMarkdown - }, - { - id: 'open-chatgpt', - label: 'Open in ChatGPT', - icon: OpenAIIcon, - handler: handleOpenInChatGPT - }, - { - id: 'open-claude', - label: 'Open in Claude', - icon: ClaudeIcon, - handler: handleOpenInClaude - } - ]; + const actionConfigs: ActionConfig[] = [ + { + id: 'copy-markdown', + label: 'Copy as Markdown', + icon: Copy, + handler: handleCopyMarkdown, + }, + { + id: 'view-markdown', + label: 'View as Markdown', + icon: FileText, + handler: handleViewMarkdown, + }, + { + id: 'open-chatgpt', + label: 'Open in ChatGPT', + icon: OpenAIIcon, + handler: handleOpenInChatGPT, + }, + { + id: 'open-claude', + label: 'Open in Claude', + icon: ClaudeIcon, + handler: handleOpenInClaude, + }, + ]; - const primaryAction = actionConfigs.find(action => action.id === preferredAction) || actionConfigs[0]; + const primaryAction = + actionConfigs.find((action) => action.id === preferredAction) || + actionConfigs[0]; - const handlePrimaryAction = async () => { - await primaryAction.handler(); - }; + const handlePrimaryAction = async () => { + await primaryAction.handler(); + }; - const handleActionSelect = async (actionId: ActionType) => { - savePreference(actionId); - const action = actionConfigs.find(a => a.id === actionId); - if (action) { - await action.handler(); - } - }; + const handleActionSelect = async (actionId: ActionType) => { + savePreference(actionId); + const action = actionConfigs.find((a) => a.id === actionId); + if (action) { + await action.handler(); + } + }; - if (!isInitialized) { - return null; - } + if (!isInitialized) { + return null; + } - return ( - - {enhanced ? ( -
- - - - -
- ) : ( - - - - )} - e.preventDefault()} - > -
- {actionConfigs.map((action) => ( - - ))} -
-
-
- ); + return ( + + {enhanced ? ( +
+ + + + +
+ ) : ( + + + + )} + e.preventDefault()} + > +
+ {actionConfigs.map((action) => ( + + ))} +
+
+
+ ); } diff --git a/components/CustomSearchDialog.tsx b/components/CustomSearchDialog.tsx index cb7443e5..ebcd9afd 100644 --- a/components/CustomSearchDialog.tsx +++ b/components/CustomSearchDialog.tsx @@ -1,4 +1,4 @@ 'use client'; import { default as CustomSearchDialogImpl } from './CustomSearchDialog/index'; -export default CustomSearchDialogImpl; \ No newline at end of file +export default CustomSearchDialogImpl; diff --git a/components/CustomSearchDialog/MessageList.tsx b/components/CustomSearchDialog/MessageList.tsx index eb5ba3d2..2824f1b2 100644 --- a/components/CustomSearchDialog/MessageList.tsx +++ b/components/CustomSearchDialog/MessageList.tsx @@ -1,170 +1,205 @@ 'use client'; -import React, { useRef, useEffect } from 'react'; +import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock'; +import { HelpCircle, Loader2, User } from 'lucide-react'; +import React, { useEffect, useRef } from 'react'; import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; -import { User, HelpCircle, Loader2 } from 'lucide-react'; -import { AgentuityLogo } from '../icons/AgentuityLogo'; import { CLICommand } from '../CLICommand'; -import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock'; -import { MessageListProps, Message } from './types'; - -export function MessageList({ messages, loading, handleSourceClick }: MessageListProps) { - const messagesEndRef = useRef(null); - - // Auto-scroll to bottom when new messages arrive - useEffect(() => { - messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); - }, [messages]); - - return ( -
- {messages.length === 0 && } - - {messages.map((message) => ( - - ))} - - {loading && } - -
-
- ); +import { AgentuityLogo } from '../icons/AgentuityLogo'; +import type { Message, MessageListProps } from './types'; + +export function MessageList({ + messages, + loading, + handleSourceClick, +}: MessageListProps) { + const messagesEndRef = useRef(null); + + // Auto-scroll to bottom when new messages arrive + // biome-ignore lint/correctness/useExhaustiveDependencies: Implementation specific + useEffect(() => { + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [messages]); + + return ( +
+ {messages.length === 0 && } + + {messages.map((message) => ( + + ))} + + {loading && } + +
+
+ ); } function EmptyState() { - return ( -
-
- -
-

- Ask a question -

-

- Search our documentation or ask about Agentuity features -

-
- ); + return ( +
+
+ +
+

+ Ask a question +

+

+ Search our documentation or ask about Agentuity features +

+
+ ); } function LoadingIndicator() { - return ( -
-
- -
-
-
- - Searching... -
-
-
- ); + return ( +
+
+ +
+
+
+ + + Searching... + +
+
+
+ ); } interface MessageItemProps { - message: Message; - handleSourceClick: (url: string) => void; + message: Message; + handleSourceClick: (url: string) => void; } function MessageItem({ message, handleSourceClick }: MessageItemProps) { - return ( -
- {message.type === 'ai' && ( -
- -
- )} - -
-
- {message.type === 'ai' ? ( -
- { - // Extract code content and language - const codeElement = React.Children.toArray(children)[0] as React.ReactElement<{ - className?: string; - children?: React.ReactNode; - }>; - const className = codeElement?.props?.className || ''; - const language = className.replace('language-', ''); - - // Extract string content from children - const code = typeof codeElement?.props?.children === 'string' - ? codeElement.props.children - : String(codeElement?.props?.children || ''); - - // Use CLICommand for bash/shell commands - if (language === 'bash' || language === 'sh' || language === 'shell') { - return ; - } - - return ( - - ); - }, - code: ({ children, className, ...props }) => { - if (!className) { - return ( - - {children} - - ); - } - return {children}; - } - }} - > - {message.content} - -
- ) : ( -

{message.content}

- )} -
- - {/* Sources for AI messages */} - {message.type === 'ai' && message.sources && message.sources.length > 0 && ( -
-

Related:

- {message.sources.map((source) => ( - - ))} -
- )} - -
- {message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} -
-
- - {message.type === 'user' && ( -
- -
- )} -
- ); -} \ No newline at end of file + return ( +
+ {message.type === 'ai' && ( +
+ +
+ )} + +
+
+ {message.type === 'ai' ? ( +
+ { + // Extract code content and language + const codeElement = React.Children.toArray( + children + )[0] as React.ReactElement<{ + className?: string; + children?: React.ReactNode; + }>; + const className = codeElement?.props?.className || ''; + const language = className.replace('language-', ''); + + // Extract string content from children + const code = + typeof codeElement?.props?.children === 'string' + ? codeElement.props.children + : String(codeElement?.props?.children || ''); + + // Use CLICommand for bash/shell commands + if ( + language === 'bash' || + language === 'sh' || + language === 'shell' + ) { + return ; + } + + return ( + + ); + }, + code: ({ children, className, ...props }) => { + if (!className) { + return ( + + {children} + + ); + } + return {children}; + }, + }} + > + {message.content} + +
+ ) : ( +

+ {message.content} +

+ )} +
+ + {/* Sources for AI messages */} + {message.type === 'ai' && + message.sources && + message.sources.length > 0 && ( +
+

+ Related: +

+ {message.sources.map((source) => ( + + ))} +
+ )} + +
+ {message.timestamp.toLocaleTimeString([], { + hour: '2-digit', + minute: '2-digit', + })} +
+
+ + {message.type === 'user' && ( +
+ +
+ )} +
+ ); +} diff --git a/components/CustomSearchDialog/SearchInput.tsx b/components/CustomSearchDialog/SearchInput.tsx index dd65d8d2..aa6f97e7 100644 --- a/components/CustomSearchDialog/SearchInput.tsx +++ b/components/CustomSearchDialog/SearchInput.tsx @@ -1,77 +1,83 @@ 'use client'; -import { useRef, useEffect, KeyboardEvent } from 'react'; import { Send } from 'lucide-react'; -import { SearchInputProps } from './types'; +import { type KeyboardEvent, useEffect, useRef } from 'react'; +import type { SearchInputProps } from './types'; -export function SearchInput({ currentInput, setCurrentInput, loading, sendMessage }: SearchInputProps) { - const textareaRef = useRef(null); +export function SearchInput({ + currentInput, + setCurrentInput, + loading, + sendMessage, +}: SearchInputProps) { + const textareaRef = useRef(null); - useEffect(() => { - const textarea = textareaRef.current; - if (!textarea) return; + // biome-ignore lint/correctness/useExhaustiveDependencies: Implementation specific + useEffect(() => { + const textarea = textareaRef.current; + if (!textarea) return; - textarea.style.height = 'auto'; - - const newHeight = Math.min(textarea.scrollHeight, 150); // Max height of 150px - textarea.style.height = `${newHeight}px`; - }, [currentInput]); + textarea.style.height = 'auto'; - useEffect(() => { - textareaRef.current?.focus(); - }, []); + const newHeight = Math.min(textarea.scrollHeight, 150); // Max height of 150px + textarea.style.height = `${newHeight}px`; + }, [currentInput]); - // Refocus when loading completes - useEffect(() => { - if (!loading) { - textareaRef.current?.focus(); - } - }, [loading]); + useEffect(() => { + textareaRef.current?.focus(); + }, []); - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === 'Enter' && (!e.shiftKey || e.ctrlKey || e.metaKey)) { - e.preventDefault(); - if (currentInput.trim()) { - sendMessage(currentInput); - } - } - }; + // Refocus when loading completes + useEffect(() => { + if (!loading) { + textareaRef.current?.focus(); + } + }, [loading]); - const handleSend = () => { - if (currentInput.trim()) { - sendMessage(currentInput); - } - }; + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Enter' && (!e.shiftKey || e.ctrlKey || e.metaKey)) { + e.preventDefault(); + if (currentInput.trim()) { + sendMessage(currentInput); + } + } + }; - return ( -
- {/* Textarea Container */} -
-