diff --git a/instrumentation.ts b/instrumentation.ts index 201df7c7..d2bb9172 100644 --- a/instrumentation.ts +++ b/instrumentation.ts @@ -1,8 +1,8 @@ -import { - NodeSDK, - ATTR_SERVICE_NAME, - resourceFromAttributes, -} from "@mastra/core/telemetry/otel-vendor"; +//import { +// NodeSDK, +// ATTR_SERVICE_NAME, +// resourceFromAttributes, +//} from "@mastra/core/telemetry/otel-vendor"; import type { Context, TextMapGetter} from "@opentelemetry/api"; import { ROOT_CONTEXT, context } from "@opentelemetry/api"; import { LangfuseExporter } from "langfuse-vercel"; @@ -14,33 +14,33 @@ export function register() { baseUrl: process.env.LANGFUSE_BASE_URL, }); - const sdk = new NodeSDK({ - autoDetectResources: true, - resource: resourceFromAttributes({ - [ATTR_SERVICE_NAME]: "ai", - }), - traceExporter: exporter, + //const sdk = new NodeSDK({ + // autoDetectResources: true, + // resource: resourceFromAttributes({ + // [ATTR_SERVICE_NAME]: "ai", + // }), + // traceExporter: exporter, // instrumentations: [InstrumentClass], - metricReader: undefined, - contextManager: { - active: () => ROOT_CONTEXT, - disable() { return this; }, - enable() { return this; }, - with ReturnType>(_context: Context, fn: F, thisArg?: ThisParameterType, ...args: A): ReturnType { - return fn.apply(thisArg, args); - }, - bind(_context: Context, target: T): T { - return target; - }, - }, - textMapPropagator: { - inject: () => {}, - extract: (context: Context, _carrier: any, _getter: TextMapGetter): Context => { - return context; - }, - fields: () => [], - }, -}); + // metricReader: undefined, + // contextManager: { + // active: () => ROOT_CONTEXT, + // disable() { return this; }, + //enable() { return this; }, + // with ReturnType>(_context: Context, fn: F, thisArg?: ThisParameterType, ...args: A): ReturnType { + // return fn.apply(thisArg, args); + // }, + // bind(_context: Context, target: T): T { + // return target; + // }, + //}, + //textMapPropagator: { + // inject: () => {}, + // extract: (context: Context, _carrier: any, _getter: TextMapGetter): Context => { + // return context; + // }, + // fields: () => [], + //}, +//}); - sdk.start(); +// sdk.start(); } diff --git a/next.config.ts b/next.config.ts index f69fec8f..35a8bc3b 100644 --- a/next.config.ts +++ b/next.config.ts @@ -48,8 +48,8 @@ const nextConfig: NextConfig = { // cssChunking: true, // craCompat: true, // validateRSCRequestHeaders: true, - webpackMemoryOptimizations: true, - webpackBuildWorker: true, + // webpackMemoryOptimizations: true, + //7 webpackBuildWorker: true, // turbopackTreeShaking: true, // turbopackMinify: true, // turbopackImportTypeBytes: true, @@ -65,10 +65,10 @@ const nextConfig: NextConfig = { ppr: false, }, }; -const withBundleAnalyzer = require('@next/bundle-analyzer')({ - enabled: process.env.ANALYZE === 'true', -}) -module.exports = withBundleAnalyzer({}) +//const withBundleAnalyzer = require('@next/bundle-analyzer')({ +// enabled: process.env.ANALYZE === 'true', +//}) +//module.exports = withBundleAnalyzer({}) const withMDX = createMDX({ extension: /\.mdx?$/, diff --git a/package-lock.json b/package-lock.json index de5bef46..1c5dc46d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,18 +13,18 @@ "@ai-sdk/google-vertex": "^3.0.88", "@ai-sdk/openai": "^2.0.80", "@ai-sdk/openai-compatible": "^1.0.28", - "@ai-sdk/react": "^2.0.109", + "@ai-sdk/react": "^2.0.111", "@dotenvx/dotenvx": "^1.51.1", "@emotion/react": "^11.14.0", "@inquirer/prompts": "^8.0.2", "@inquirer/type": "^4.0.2", - "@mastra/ai-sdk": "^1.0.0-beta.7", + "@mastra/ai-sdk": "^1.0.0-beta.8", "@mastra/arize": "^1.0.0-beta.5", "@mastra/auth-supabase": "^1.0.0-beta.1", - "@mastra/client-js": "^1.0.0-beta.10", + "@mastra/client-js": "^1.0.0-beta.11", "@mastra/cloudflare-d1": "^1.0.0-beta.5", - "@mastra/core": "^1.0.0-beta.10", - "@mastra/deployer": "^1.0.0-beta.10", + "@mastra/core": "^1.0.0-beta.11", + "@mastra/deployer": "^1.0.0-beta.11", "@mastra/evals": "^1.0.0-beta.2", "@mastra/lance": "^1.0.0-beta.6", "@mastra/langfuse": "^1.0.0-beta.4", @@ -41,12 +41,12 @@ "@mastra/vectorize": "^1.0.0-beta.2", "@mastra/voice-google": "^0.12.0-beta.1", "@mastra/voice-openai": "^0.12.0-beta.1", - "@mcpc-tech/acp-ai-provider": "^0.1.31", + "@mcpc-tech/acp-ai-provider": "^0.1.34", "@monaco-editor/loader": "^1.7.0", "@monaco-editor/react": "^4.8.0-rc.3", "@next/bundle-analyzer": "^16.0.8", "@next/mdx": "^16.0.8", - "@openrouter/ai-sdk-provider": "^1.5.2", + "@openrouter/ai-sdk-provider": "^1.5.3", "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.208.0", "@opeoginni/github-copilot-openai-compatible": "^0.1.21", @@ -66,10 +66,10 @@ "@tanstack/react-query-devtools": "^5.91.1", "@xyflow/react": "^12.10.0", "a2a-ai-provider": "^0.4.0-alpha.2", - "ai": "^5.0.108", + "ai": "^5.0.109", "ai-sdk-ollama": "^1.1.0", "ai-sdk-provider-claude-code": "^2.2.4", - "ai-sdk-provider-gemini-cli": "^1.4.0", + "ai-sdk-provider-gemini-cli": "^1.4.1", "chalk": "^5.6.2", "chart.js": "^4.5.1", "cheerio": "^1.1.2", @@ -88,23 +88,24 @@ "embla-carousel-react": "^8.6.0", "excalidraw-to-svg": "^3.1.0", "fast-xml-parser": "^5.3.2", - "framer-motion": "^12.23.25", + "framer-motion": "^12.23.26", "gray-matter": "^4.0.3", "husky": "^9.1.7", "isolated-vm": "^6.0.2", "jose": "^6.1.3", "jsdom": "^27.3.0", "langfuse-vercel": "^3.38.6", - "lucide-react": "^0.556.0", + "lucide-react": "^0.559.0", "marked": "^17.0.1", "monaco-editor": "^0.55.1", "monaco-editor-webpack-plugin": "^7.1.1", "monaco-languages": "^2.11.1", "monaco-themes": "^0.4.8", - "motion": "^12.23.25", + "motion": "^12.23.26", "nanoid": "^5.1.6", "next": "^16.0.8", "next-themes": "^0.4.6", + "octokit": "^5.0.5", "pdf-parse": "^2.4.5", "pino": "^10.1.0", "pino-pretty": "^13.1.3", @@ -149,7 +150,7 @@ "@types/fs-extra": "^11.0.4", "@types/jsdom": "^27.0.0", "@types/mdx": "^2.0.13", - "@types/node": "^24.10.2", + "@types/node": "^25.0.0", "@types/pdf-parse": "^1.1.5", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", @@ -161,7 +162,7 @@ "eslint": "^9.39.1", "eslint-config-prettier": "^10.1.8", "ink-testing-library": "^4.0.0", - "mastra": "^1.0.0-beta.8", + "mastra": "^1.0.0-beta.9", "prettier": "^3.7.4", "tailwindcss": "^4.1.17", "tw-animate-css": "^1.4.0", @@ -389,13 +390,13 @@ } }, "node_modules/@ai-sdk/react": { - "version": "2.0.109", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.109.tgz", - "integrity": "sha512-5qM8KuN7bv7E+g6BXkSAYLFjwIfMSTKOA1prjg1zEShJXJyLSc+Yqkd3EfGibm75b7nJAqJNShurDmR/IlQqFQ==", + "version": "2.0.111", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.111.tgz", + "integrity": "sha512-CY2HW/bxTwpRMvd1SmnF1Fg/zv+v4wSDz+a6Vg+7AqF5YkFSmxsyYHEjZ8WzoeQDaDZXJbLM2ToajUHAQoZNtQ==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider-utils": "3.0.18", - "ai": "5.0.108", + "ai": "5.0.109", "swr": "^2.2.5", "throttleit": "2.1.0" }, @@ -403,7 +404,7 @@ "node": ">=18" }, "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", + "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1", "zod": "^3.25.76 || ^4.1.8" }, "peerDependenciesMeta": { @@ -3757,17 +3758,17 @@ } }, "node_modules/@google/gemini-cli-core": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@google/gemini-cli-core/-/gemini-cli-core-0.17.1.tgz", - "integrity": "sha512-XL6cw7iksZGG36Na2dwI7rRtdpI+cHRbr2I3mcel5ApXkeIhcSzH6ojbk69bK/f2DUSB/OrJJDlonh5+sPTzOg==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@google/gemini-cli-core/-/gemini-cli-core-0.20.0.tgz", + "integrity": "sha512-spaK3tT1Y0sU9MaRdCC9Z3kYjattwaryME44Um4QNuC66PSSY0gIxDp+NJeRJxBK0GgYG+72ZWhYCY4hQrQH7Q==", "dependencies": { "@google-cloud/logging": "^11.2.1", "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.21.0", "@google-cloud/opentelemetry-cloud-trace-exporter": "^3.0.0", - "@google/genai": "1.16.0", + "@google/genai": "1.30.0", "@iarna/toml": "^2.2.5", "@joshua.litt/get-ripgrep": "^0.0.3", - "@modelcontextprotocol/sdk": "^1.11.0", + "@modelcontextprotocol/sdk": "^1.23.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-logs-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-logs-otlp-http": "^0.203.0", @@ -4086,19 +4087,19 @@ } }, "node_modules/@google/genai": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.16.0.tgz", - "integrity": "sha512-hdTYu39QgDFxv+FB6BK2zi4UIJGWhx2iPc0pHQ0C5Q/RCi+m+4gsryIzTGO+riqWcUA8/WGYp6hpqckdOBNysw==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.30.0.tgz", + "integrity": "sha512-3MRcgczBFbUat1wIlZoLJ0vCCfXgm7Qxjh59cZi2X08RgWLtm9hKOspzp7TOg1TV2e26/MLxR2GR5yD5GmBV2w==", "license": "Apache-2.0", "dependencies": { - "google-auth-library": "^9.14.2", + "google-auth-library": "^10.3.0", "ws": "^8.18.0" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.11.4" + "@modelcontextprotocol/sdk": "^1.20.1" }, "peerDependenciesMeta": { "@modelcontextprotocol/sdk": { @@ -4106,50 +4107,6 @@ } } }, - "node_modules/@google/genai/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/@google/genai/node_modules/google-auth-library": { - "version": "9.15.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", - "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google/genai/node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "license": "MIT", - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@grpc/grpc-js": { "version": "1.14.2", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.2.tgz", @@ -5782,9 +5739,9 @@ ] }, "node_modules/@mastra/ai-sdk": { - "version": "1.0.0-beta.7", - "resolved": "https://registry.npmjs.org/@mastra/ai-sdk/-/ai-sdk-1.0.0-beta.7.tgz", - "integrity": "sha512-7lwFXHOh7CPA7LuAJ8wDpI5E7wlNC2N16byq4KWo7Q5dXDKIzUctasIF6rTds5c4Umt1YcMnn9HzoekRSs+tog==", + "version": "1.0.0-beta.8", + "resolved": "https://registry.npmjs.org/@mastra/ai-sdk/-/ai-sdk-1.0.0-beta.8.tgz", + "integrity": "sha512-dJooVGnQyfLDDRE/qONVqcpaIgD69PZ3k392H7YyZwmHs08RHIf/m0GSHQ9IobNq9Y52HtMnXQhxYc3e7XF1pw==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "^2.0.0", @@ -5900,14 +5857,14 @@ } }, "node_modules/@mastra/client-js": { - "version": "1.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@mastra/client-js/-/client-js-1.0.0-beta.10.tgz", - "integrity": "sha512-MeQLbI9EfD58rvw2gsPfNPwD2AwdHNmRXky7qCT5lLmcZ8gS6t3OsRcWMKJR1xKPxl8rUqKgvFHQK6S1I+E8Ww==", + "version": "1.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mastra/client-js/-/client-js-1.0.0-beta.11.tgz", + "integrity": "sha512-Ulf7kU0qb/MPy4itYmmi/kHHTbgdLr4ThjjCZJc8v1L083DPpmMtvwxqQKxaBGOPGudZOdgX3eOtTpBMO4vpGw==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/ui-utils": "^1.2.11", "@lukeed/uuid": "^2.0.1", - "@mastra/core": "1.0.0-beta.10", + "@mastra/core": "1.0.0-beta.11", "@mastra/schema-compat": "1.0.0-beta.2", "json-schema": "^0.4.0" }, @@ -5933,9 +5890,9 @@ } }, "node_modules/@mastra/core": { - "version": "1.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@mastra/core/-/core-1.0.0-beta.10.tgz", - "integrity": "sha512-Z4e8Jlrr201MpEFvXJe+3CtZEnP1p/bUb71dghwtbbX6EY+2pnD+0SibR5tIRhg9NsjtoyU4LGNBehwxMWCVWg==", + "version": "1.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mastra/core/-/core-1.0.0-beta.11.tgz", + "integrity": "sha512-+DiKWeNtHr3/CGP/YxoKFZ5yRt9DxuHwqrikC47lg5dsnJUBLq1JibLXitthLe+VxmrxaLV+rqpzmQISP3FdKg==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -5988,14 +5945,14 @@ } }, "node_modules/@mastra/deployer": { - "version": "1.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@mastra/deployer/-/deployer-1.0.0-beta.10.tgz", - "integrity": "sha512-O3YcIMOu+Udphm/vLchaD/h2tgIqO0W0ySqDNp1jSqHpH5hYojIqFiHvtHEZLiXix9Huh6/pUDu7gFwvueuhUA==", + "version": "1.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mastra/deployer/-/deployer-1.0.0-beta.11.tgz", + "integrity": "sha512-kNN4GrXXFeo8uE1wvPgSuFRahpyx3hnhW+NspBIjr+ulC1+IboI2zKiD/K3hLR6fstrvA0U5D/cRzVYylAQcPQ==", "license": "Apache-2.0", "dependencies": { "@babel/core": "^7.28.5", "@babel/preset-typescript": "^7.27.1", - "@mastra/server": "^1.0.0-beta.10", + "@mastra/server": "^1.0.0-beta.11", "@optimize-lodash/rollup-plugin": "^5.0.2", "@rollup/plugin-alias": "6.0.0", "@rollup/plugin-commonjs": "29.0.0", @@ -6416,9 +6373,9 @@ } }, "node_modules/@mastra/server": { - "version": "1.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@mastra/server/-/server-1.0.0-beta.10.tgz", - "integrity": "sha512-kiHVODlJbrhhJBKFk5TEDy4A9rODk9N2rJqFSP6bIMr7tmn45zy+FA7zFcE4UUuxtde6nKaQCktSonjhpI1/tA==", + "version": "1.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mastra/server/-/server-1.0.0-beta.11.tgz", + "integrity": "sha512-8MHf5mys9gtxCMity25nWEF3PmEGVUAPAKOeD+Rsw7PAdMXsAc+Osedv6CzW7K/0jTLkaSwDYb+dQxUcdLmZHg==", "license": "Apache-2.0", "dependencies": { "hono": "^4.10.5" @@ -6496,9 +6453,9 @@ } }, "node_modules/@mcpc-tech/acp-ai-provider": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@mcpc-tech/acp-ai-provider/-/acp-ai-provider-0.1.31.tgz", - "integrity": "sha512-ZDLmkmgYSCFV9DuVFvBlVo2YmfS4ONkGLtvBhih1h7crLtPhRYudMLjUjnShjn7GpEiP/93g63IarzT3R4IzgA==", + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/@mcpc-tech/acp-ai-provider/-/acp-ai-provider-0.1.34.tgz", + "integrity": "sha512-/nHhHD67uoISsxqvZxYi7ZD9hmPQLFYFuPixrLOIj+LDG2YndBhgLcSRRzexWy1ZVHQYDz7nTLLpwr6ceOqCnw==", "dependencies": { "@agentclientprotocol/sdk": "^0.4.8", "@ai-sdk/provider": "^2.0.0", @@ -7327,10 +7284,352 @@ "node": ">= 8" } }, + "node_modules/@octokit/app": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@octokit/app/-/app-16.1.2.tgz", + "integrity": "sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==", + "license": "MIT", + "dependencies": { + "@octokit/auth-app": "^8.1.2", + "@octokit/auth-unauthenticated": "^7.0.3", + "@octokit/core": "^7.0.6", + "@octokit/oauth-app": "^8.0.3", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/types": "^16.0.0", + "@octokit/webhooks": "^14.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-app": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.1.2.tgz", + "integrity": "sha512-db8VO0PqXxfzI6GdjtgEFHY9tzqUql5xMFXYA12juq8TeTgPAuiiP3zid4h50lwlIP457p5+56PnJOgd2GGBuw==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-app": "^9.0.3", + "@octokit/auth-oauth-user": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "toad-cache": "^3.7.0", + "universal-github-app-jwt": "^2.2.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-oauth-app": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.3.tgz", + "integrity": "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-device": "^8.0.3", + "@octokit/auth-oauth-user": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-oauth-device": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.3.tgz", + "integrity": "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==", + "license": "MIT", + "dependencies": { + "@octokit/oauth-methods": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-oauth-user": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.2.tgz", + "integrity": "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-device": "^8.0.3", + "@octokit/oauth-methods": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-unauthenticated": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.3.tgz", + "integrity": "sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==", + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/core": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/endpoint": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", + "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/graphql": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "license": "MIT", + "dependencies": { + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/oauth-app": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.3.tgz", + "integrity": "sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-app": "^9.0.2", + "@octokit/auth-oauth-user": "^6.0.1", + "@octokit/auth-unauthenticated": "^7.0.2", + "@octokit/core": "^7.0.5", + "@octokit/oauth-authorization-url": "^8.0.0", + "@octokit/oauth-methods": "^6.0.1", + "@types/aws-lambda": "^8.10.83", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/oauth-authorization-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz", + "integrity": "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/oauth-methods": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.2.tgz", + "integrity": "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==", + "license": "MIT", + "dependencies": { + "@octokit/oauth-authorization-url": "^8.0.0", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "license": "MIT" + }, + "node_modules/@octokit/openapi-webhooks-types": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.1.0.tgz", + "integrity": "sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-graphql": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz", + "integrity": "sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", + "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.3.tgz", + "integrity": "sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA==", + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=7" + } + }, + "node_modules/@octokit/plugin-throttling": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", + "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": "^7.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", + "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^11.0.2", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "fast-content-type-parse": "^3.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/request-error": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^27.0.0" + } + }, + "node_modules/@octokit/webhooks": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-14.2.0.tgz", + "integrity": "sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-webhooks-types": "12.1.0", + "@octokit/request-error": "^7.0.0", + "@octokit/webhooks-methods": "^6.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/webhooks-methods": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz", + "integrity": "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, "node_modules/@openrouter/ai-sdk-provider": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-1.5.2.tgz", - "integrity": "sha512-3Th0vmJ9pjnwcPc2H1f59Mb0LFvwaREZAScfOQIpUxAHjZ7ZawVKDP27qgsteZPmMYqccNMy4r4Y3kgUnNcKAg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-1.5.3.tgz", + "integrity": "sha512-7SZmmLdp0x1wwuwZARn5R19ZSySHmTiUEM8IvN7O5r3ZH4drI1//BsLpfw56YFsBXu34VRtQzyvko1FLIcgtRg==", "license": "Apache-2.0", "dependencies": { "@openrouter/sdk": "^0.1.27" @@ -9048,7 +9347,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.1.0.tgz", "integrity": "sha512-J9QX459mzqHLL9Y6FZ4wQPRZG4TOpMCyPOh6mkr/humxE1W2S3Bvf4i75yiMW9uyed2Kf5rxmLhTm/UK8vNkAw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/core": "2.1.0", "@opentelemetry/resources": "2.1.0" @@ -12026,6 +12324,12 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/aws-lambda": { + "version": "8.10.159", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.159.tgz", + "integrity": "sha512-SAP22WSGNN12OQ8PlCzGzRCZ7QDCwI85dQZbmpz7+mAk+L7j+wI7qnvmdKh+o7A5LaOp6QnOZ2NJphAZQTTHQg==", + "license": "MIT" + }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -12566,9 +12870,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz", - "integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==", + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.0.tgz", + "integrity": "sha512-rl78HwuZlaDIUSeUKkmogkhebA+8K1Hy7tddZuJ3D0xV8pZSfsYGTsliGUol1JPzu9EKnTxPC4L1fiWouStRew==", "license": "MIT", "peer": true, "dependencies": { @@ -13813,9 +14117,9 @@ } }, "node_modules/ai": { - "version": "5.0.108", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.108.tgz", - "integrity": "sha512-Jex3Lb7V41NNpuqJHKgrwoU6BCLHdI1Pg4qb4GJH4jRIDRXUBySJErHjyN4oTCwbiYCeb/8II9EnqSRPq9EifA==", + "version": "5.0.109", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.109.tgz", + "integrity": "sha512-tW8K4Z0bcYH9PzP7gMmPilgBwgpylEL25bRtWruUnrTS45S6ryNJ6YSEh6mZajlIEDS6bcur7srdXVGERxjVXQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -13883,15 +14187,15 @@ } }, "node_modules/ai-sdk-provider-gemini-cli": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ai-sdk-provider-gemini-cli/-/ai-sdk-provider-gemini-cli-1.4.0.tgz", - "integrity": "sha512-k5nWGbqUO28Bi8yQErBP1m5MQZQL1oCVFpCytSepYMAwfNP01QPcYyYR2bt8HrGGlEMS7Bl1CbuRjPFcJdccMg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ai-sdk-provider-gemini-cli/-/ai-sdk-provider-gemini-cli-1.4.1.tgz", + "integrity": "sha512-Nla8DjeOyHCk/DCYl/tLuKBLmXVGYgLbNm+o+6BYYLAwh7/LlEV5Y6JirbaJkFepnZXEjw91HF+vrVwq78rufQ==", "license": "MIT", "dependencies": { "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.17", - "@google/gemini-cli-core": "0.17.1", - "@google/genai": "1.16.0", + "@ai-sdk/provider-utils": "3.0.18", + "@google/gemini-cli-core": "0.20.0", + "@google/genai": "1.30.0", "google-auth-library": "^9.11.0", "zod-to-json-schema": "3.25.0" }, @@ -13902,23 +14206,6 @@ "zod": "^3.0.0 || ^4.0.0" } }, - "node_modules/ai-sdk-provider-gemini-cli/node_modules/@ai-sdk/provider-utils": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.17.tgz", - "integrity": "sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@standard-schema/spec": "^1.0.0", - "eventsource-parser": "^3.0.6" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" - } - }, "node_modules/ai-sdk-provider-gemini-cli/node_modules/gcp-metadata": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", @@ -14420,6 +14707,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "license": "Apache-2.0" + }, "node_modules/bidi-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", @@ -14492,6 +14785,12 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "license": "MIT" + }, "node_modules/boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -18412,6 +18711,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/fast-copy": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.1.tgz", @@ -18952,9 +19267,9 @@ "license": "MIT" }, "node_modules/framer-motion": { - "version": "12.23.25", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.25.tgz", - "integrity": "sha512-gUHGl2e4VG66jOcH0JHhuJQr6ZNwrET9g31ZG0xdXzT0CznP7fHX4P8Bcvuc4MiUB90ysNnWX2ukHRIggkl6hQ==", + "version": "12.23.26", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.26.tgz", + "integrity": "sha512-cPcIhgR42xBn1Uj+PzOyheMtZ73H927+uWPDVhUMqxy8UHt6Okavb6xIz9J/phFUHUj0OncR6UvMfJTXoc/LKA==", "license": "MIT", "dependencies": { "motion-dom": "^12.23.23", @@ -22444,9 +22759,9 @@ } }, "node_modules/lucide-react": { - "version": "0.556.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.556.0.tgz", - "integrity": "sha512-iOb8dRk7kLaYBZhR2VlV1CeJGxChBgUthpSP8wom9jfj79qovgG6qcSdiy6vkoREKPnbUYzJsCn4o4PtG3Iy+A==", + "version": "0.559.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.559.0.tgz", + "integrity": "sha512-3ymrkBPXWk3U2bwUDg6TdA6hP5iGDMgPEAMLhchEgTQmA+g0Zk24tOtKtXMx35w1PizTmsBC3RhP88QYm+7mHQ==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -22543,15 +22858,15 @@ } }, "node_modules/mastra": { - "version": "1.0.0-beta.8", - "resolved": "https://registry.npmjs.org/mastra/-/mastra-1.0.0-beta.8.tgz", - "integrity": "sha512-K373DFvXFFBcxHzW679K7/xGAKFTAF32nCBQX7YZQXRqWDaM8DMCes1HcXoRDfyl1bsR4aVpdLCq3Thnog6wwQ==", + "version": "1.0.0-beta.9", + "resolved": "https://registry.npmjs.org/mastra/-/mastra-1.0.0-beta.9.tgz", + "integrity": "sha512-qEWP+YSSz71BKa0MdvAWqgPuKmf8dyKpBt2+FytfxUyV4VuBuKwYZaWK1xKE8byyXQ3piJ5hqNPsbj2KiSy7sA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@clack/prompts": "^0.11.0", "@expo/devcert": "^1.2.0", - "@mastra/deployer": "^1.0.0-beta.10", + "@mastra/deployer": "^1.0.0-beta.11", "@mastra/loggers": "^1.0.0-beta.3", "commander": "^14.0.2", "dotenv": "^17.2.3", @@ -24449,12 +24764,12 @@ } }, "node_modules/motion": { - "version": "12.23.25", - "resolved": "https://registry.npmjs.org/motion/-/motion-12.23.25.tgz", - "integrity": "sha512-Fk5Y1kcgxYiTYOUjmwfXQAP7tP+iGqw/on1UID9WEL/6KpzxPr9jY2169OsjgZvXJdpraKXy0orkjaCVIl5fgQ==", + "version": "12.23.26", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.23.26.tgz", + "integrity": "sha512-Ll8XhVxY8LXMVYTCfme27WH2GjBrCIzY4+ndr5QKxsK+YwCtOi2B/oBi5jcIbik5doXuWT/4KKDOVAZJkeY5VQ==", "license": "MIT", "dependencies": { - "framer-motion": "^12.23.25", + "framer-motion": "^12.23.26", "tslib": "^2.4.0" }, "peerDependencies": { @@ -24991,6 +25306,28 @@ ], "license": "MIT" }, + "node_modules/octokit": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/octokit/-/octokit-5.0.5.tgz", + "integrity": "sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==", + "license": "MIT", + "dependencies": { + "@octokit/app": "^16.1.2", + "@octokit/core": "^7.0.6", + "@octokit/oauth-app": "^8.0.3", + "@octokit/plugin-paginate-graphql": "^6.0.0", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-rest-endpoint-methods": "^17.0.0", + "@octokit/plugin-retry": "^8.0.3", + "@octokit/plugin-throttling": "^11.0.3", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "@octokit/webhooks": "^14.0.0" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/ollama": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.6.3.tgz", @@ -29801,6 +30138,15 @@ "node": ">=8.0" } }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -30962,6 +31308,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/universal-github-app-jwt": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz", + "integrity": "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==", + "license": "MIT" + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "license": "ISC" + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", diff --git a/package.json b/package.json index 7e76397f..76b69445 100644 --- a/package.json +++ b/package.json @@ -46,18 +46,18 @@ "@ai-sdk/google-vertex": "^3.0.88", "@ai-sdk/openai": "^2.0.80", "@ai-sdk/openai-compatible": "^1.0.28", - "@ai-sdk/react": "^2.0.109", + "@ai-sdk/react": "^2.0.111", "@dotenvx/dotenvx": "^1.51.1", "@emotion/react": "^11.14.0", "@inquirer/prompts": "^8.0.2", "@inquirer/type": "^4.0.2", - "@mastra/ai-sdk": "^1.0.0-beta.7", + "@mastra/ai-sdk": "^1.0.0-beta.8", "@mastra/arize": "^1.0.0-beta.5", "@mastra/auth-supabase": "^1.0.0-beta.1", - "@mastra/client-js": "^1.0.0-beta.10", + "@mastra/client-js": "^1.0.0-beta.11", "@mastra/cloudflare-d1": "^1.0.0-beta.5", - "@mastra/core": "^1.0.0-beta.10", - "@mastra/deployer": "^1.0.0-beta.10", + "@mastra/core": "^1.0.0-beta.11", + "@mastra/deployer": "^1.0.0-beta.11", "@mastra/evals": "^1.0.0-beta.2", "@mastra/lance": "^1.0.0-beta.6", "@mastra/langfuse": "^1.0.0-beta.4", @@ -74,12 +74,12 @@ "@mastra/vectorize": "^1.0.0-beta.2", "@mastra/voice-google": "^0.12.0-beta.1", "@mastra/voice-openai": "^0.12.0-beta.1", - "@mcpc-tech/acp-ai-provider": "^0.1.31", + "@mcpc-tech/acp-ai-provider": "^0.1.34", "@monaco-editor/loader": "^1.7.0", "@monaco-editor/react": "^4.8.0-rc.3", "@next/bundle-analyzer": "^16.0.8", "@next/mdx": "^16.0.8", - "@openrouter/ai-sdk-provider": "^1.5.2", + "@openrouter/ai-sdk-provider": "^1.5.3", "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.208.0", "@opeoginni/github-copilot-openai-compatible": "^0.1.21", @@ -99,10 +99,10 @@ "@tanstack/react-query-devtools": "^5.91.1", "@xyflow/react": "^12.10.0", "a2a-ai-provider": "^0.4.0-alpha.2", - "ai": "^5.0.108", + "ai": "^5.0.109", "ai-sdk-ollama": "^1.1.0", "ai-sdk-provider-claude-code": "^2.2.4", - "ai-sdk-provider-gemini-cli": "^1.4.0", + "ai-sdk-provider-gemini-cli": "^1.4.1", "chalk": "^5.6.2", "chart.js": "^4.5.1", "cheerio": "^1.1.2", @@ -121,23 +121,24 @@ "embla-carousel-react": "^8.6.0", "excalidraw-to-svg": "^3.1.0", "fast-xml-parser": "^5.3.2", - "framer-motion": "^12.23.25", + "framer-motion": "^12.23.26", "gray-matter": "^4.0.3", "husky": "^9.1.7", "isolated-vm": "^6.0.2", "jose": "^6.1.3", "jsdom": "^27.3.0", "langfuse-vercel": "^3.38.6", - "lucide-react": "^0.556.0", + "lucide-react": "^0.559.0", "marked": "^17.0.1", "monaco-editor": "^0.55.1", "monaco-editor-webpack-plugin": "^7.1.1", "monaco-languages": "^2.11.1", "monaco-themes": "^0.4.8", - "motion": "^12.23.25", + "motion": "^12.23.26", "nanoid": "^5.1.6", "next": "^16.0.8", "next-themes": "^0.4.6", + "octokit": "^5.0.5", "pdf-parse": "^2.4.5", "pino": "^10.1.0", "pino-pretty": "^13.1.3", @@ -182,7 +183,7 @@ "@types/fs-extra": "^11.0.4", "@types/jsdom": "^27.0.0", "@types/mdx": "^2.0.13", - "@types/node": "^24.10.2", + "@types/node": "^25.0.0", "@types/pdf-parse": "^1.1.5", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", @@ -194,7 +195,7 @@ "eslint": "^9.39.1", "eslint-config-prettier": "^10.1.8", "ink-testing-library": "^4.0.0", - "mastra": "^1.0.0-beta.8", + "mastra": "^1.0.0-beta.9", "prettier": "^3.7.4", "tailwindcss": "^4.1.17", "tw-animate-css": "^1.4.0", @@ -204,7 +205,7 @@ }, "overrides": { "jsondiffpatch": "0.7.3", - "ai": "^5.0.108", + "ai": "^5.0.109", "morgan": "^1.10.1", "js-yaml": "^4.1.1", "multer": "^2.0.2", @@ -213,4 +214,4 @@ "zod": "^4.1.13", "jws": "^4.0.1" } -} +} \ No newline at end of file diff --git a/src/mastra/agents/acpAgent.ts b/src/mastra/agents/acpAgent.ts index d3781f78..d7e69dff 100644 --- a/src/mastra/agents/acpAgent.ts +++ b/src/mastra/agents/acpAgent.ts @@ -1,9 +1,9 @@ import { Agent } from '@mastra/core/agent'; -import { createAnswerRelevancyScorer, createToxicityScorer } from '@mastra/evals/scorers/prebuilt'; -import { MONGODB_PROMPT } from "@mastra/mongodb"; -import { googleAIFlashLite } from '../config'; -import { mongoGraphTool, mongoMemory, mongoQueryTool } from '../config/mongodb'; +import { createAnswerRelevancyScorer } from '@mastra/evals/scorers/prebuilt'; + +import { googleAIFlashLite, pgMemory, pgQueryTool } from '../config'; + import { arxivTool } from '../tools/arxiv.tool'; import { csvToJsonTool } from '../tools/csv-to-json.tool'; import { createDataDirTool, getDataFileInfoTool, listDataDirTool, moveDataFileTool, searchDataFilesTool, writeDataFileTool } from '../tools/data-file-manager'; @@ -18,6 +18,7 @@ import { pdfToMarkdownTool } from '../tools/pdf-data-conversion.tool'; import { batchWebScraperTool, contentCleanerTool, htmlToMarkdownTool, linkExtractorTool, webScraperTool } from '../tools/web-scraper-tool'; import type { GoogleGenerativeAIProviderOptions } from '@ai-sdk/google'; import type { RequestContext } from '@mastra/core/request-context'; +import { PGVECTOR_PROMPT } from '@mastra/pg'; export interface ACPContext { userId?: string @@ -66,7 +67,7 @@ export const acpAgent = new Agent({ - - Use ${MONGODB_PROMPT} to format queries/updates and avoid any unstructured updates. + - Use ${PGVECTOR_PROMPT} to format queries/updates and avoid any unstructured updates. - Persist "decisions" and "task changes" to collection: acp_tasks, with schema: {taskId, title, status, createdBy, modifiedBy, timestamp, actionLog}. - Write to memory only after the task is validated. @@ -82,9 +83,7 @@ export const acpAgent = new Agent({ - Mask PII in any outputs by default; if the user requests PII handling, require explicit permission and justification. - Reject any attempt to exfiltrate data or run arbitrary commands without confirmation & elevated auth. - - - ${MONGODB_PROMPT}`, + `, providerOptions: { google: { thinkingConfig: { @@ -97,10 +96,9 @@ export const acpAgent = new Agent({ }; }, model: googleAIFlashLite, - memory: mongoMemory, + memory: pgMemory, tools: { - mongoQueryTool, - mongoGraphTool, + pgQueryTool, webScraperTool, linkExtractorTool, htmlToMarkdownTool, diff --git a/src/mastra/agents/weather-agent.ts b/src/mastra/agents/weather-agent.ts index f4360169..c3d64d35 100644 --- a/src/mastra/agents/weather-agent.ts +++ b/src/mastra/agents/weather-agent.ts @@ -60,13 +60,6 @@ export const weatherAgent = new Agent({ }, tools: { weatherTool, webScraperTool, mdocumentChunker }, scorers: { - toolCallAppropriateness: { - scorer: scorers.toolCallAppropriatenessScorer, - sampling: { - type: 'ratio', - rate: 1, - }, - }, }, memory: pgMemory, diff --git a/src/mastra/config/mongodb.ts b/src/mastra/config/mongodb.ts index 77738261..df231ed7 100644 --- a/src/mastra/config/mongodb.ts +++ b/src/mastra/config/mongodb.ts @@ -4,11 +4,10 @@ import { google } from '@ai-sdk/google'; import { embedMany } from 'ai'; import type { UIMessage } from 'ai' import { log } from './logger'; -import { TokenLimiter } from "@mastra/memory/processors"; import z from "zod"; import { Memory } from "@mastra/memory"; -import { AISpanType } from '@mastra/observability' -import type { TracingContext } from '@mastra/observability' +import { trace, SpanStatusCode } from '@opentelemetry/api' + /** * MongoDB Vector configuration for the Governed RAG system @@ -72,6 +71,7 @@ export const mongoMemory = new Memory({ options: { // Message management lastMessages: parseInt(process.env.MEMORY_LAST_MESSAGES ?? '500'), + generateTitle: process.env.THREAD_GENERATE_TITLE !== 'true', // Advanced semantic recall with HNSW index configuration semanticRecall: { topK: parseInt(process.env.SEMANTIC_TOP_K ?? '5'), @@ -96,13 +96,8 @@ export const mongoMemory = new Memory({ scope: 'resource', version: 'vnext', template: '# User Profile\n- **Name**:\n- **Preferences**:\n\n# Interaction History\n{{history}}\n\n# Current Context\n{{context}}\n- **Tasks**:\n{{tasks}}\n- **Notes**:\n{{notes}}', - }, - // Thread management with supported options - threads: { - generateTitle: process.env.THREAD_GENERATE_TITLE !== 'true', - }, - }, - processors: [new TokenLimiter(1048576)], + } + } }) log.info('Mongos and Memory initialized with PgVector support', { @@ -192,8 +187,7 @@ export async function processDocument( options: { chunkSize?: number; chunkOverlap?: number; - } = {}, - tracingContext?: TracingContext + } = {} ): Promise<{ chunks: Array<{ text: string; @@ -205,16 +199,13 @@ export async function processDocument( const chunkSize = options.chunkSize ?? 1000; const chunkOverlap = options.chunkOverlap ?? 200; - const span = tracingContext?.currentSpan?.createChildSpan({ - type: AISpanType.MODEL_CHUNK, - name: 'mongo-process-document', - input: { + const tracer = trace.getTracer('mastra/mongodb'); + const span = tracer.startSpan('mongo-process-document', { + attributes: { contentLength: content.length, chunkSize, chunkOverlap, model: 'gemini-embedding-001', - }, - metadata: { component: 'mongodb', operationType: 'document-processing', }, @@ -254,44 +245,25 @@ export async function processDocument( processingTimeMs: processingTime, }); - span?.end({ - output: { - chunksCount: chunks.length, - embeddingDimension: embeddings[0]?.length || 0, - processingTimeMs: processingTime, - success: true, - }, - metadata: { - model: 'gemini-embedding-001', - operation: 'document-processing', - finalStatus: 'success', - }, - }); + span?.setAttribute('chunksCount', chunks.length); + span?.setAttribute('embeddingDimension', embeddings[0]?.length || 0); + span?.setAttribute('processingTimeMs', processingTime); + span?.setAttribute('success', true); + span?.setAttribute('model', 'gemini-embedding-001'); + span?.setAttribute('operation', 'document-processing'); + span?.end(); return { chunks, embeddings }; } catch (error) { const processingTime = Date.now() - startTime; log.error("Failed to process document", { error: String(error), processingTimeMs: processingTime }); - span?.error({ - error: error instanceof Error ? error : new Error(String(error)), - metadata: { - model: 'gemini-embedding-001', - operation: 'document-processing', - processingTime, - }, - }); - - span?.end({ - output: { - success: false, - processingTimeMs: processingTime, - error: error instanceof Error ? error.message : String(error), - }, - metadata: { - finalStatus: 'error', - }, - }); + span?.recordException(error instanceof Error ? error : new Error(String(error))); + span?.setAttribute('processingTimeMs', processingTime); + span?.setAttribute('model', 'gemini-embedding-001'); + span?.setAttribute('operation', 'document-processing'); + span?.setStatus({ code: SpanStatusCode.ERROR, message: error instanceof Error ? error.message : String(error) }); + span?.end(); throw error; } @@ -306,20 +278,16 @@ export async function storeDocumentEmbeddings( metadata?: Record; }>, embeddings: number[][], - baseMetadata: Record = {}, - tracingContext?: TracingContext + baseMetadata: Record = {} ): Promise { const startTime = Date.now(); - const span = tracingContext?.currentSpan?.createChildSpan({ - type: AISpanType.TOOL_CALL, - name: 'mongo-store-embeddings', - input: { + const tracer = trace.getTracer('mastra/mongodb'); + const span = tracer.startSpan('mongo-store-embeddings', { + attributes: { chunksCount: chunks.length, embeddingsCount: embeddings.length, collectionName: MONGODB_CONFIG.collectionName, - }, - metadata: { component: 'mongodb', operationType: 'vector-storage', }, @@ -349,41 +317,22 @@ export async function storeDocumentEmbeddings( processingTimeMs: processingTime, }); - span?.end({ - output: { - idsCount: ids.length, - processingTimeMs: processingTime, - success: true, - }, - metadata: { - operation: 'vector-storage', - finalStatus: 'success', - }, - }); + span?.setAttribute('idsCount', ids.length); + span?.setAttribute('processingTimeMs', processingTime); + span?.setAttribute('success', true); + span?.setAttribute('operation', 'vector-storage'); + span?.end(); return ids; } catch (error) { const processingTime = Date.now() - startTime; log.error("Failed to store document embeddings", { error: String(error), processingTimeMs: processingTime }); - span?.error({ - error: error instanceof Error ? error : new Error(String(error)), - metadata: { - operation: 'vector-storage', - processingTime, - }, - }); - - span?.end({ - output: { - success: false, - processingTimeMs: processingTime, - error: error instanceof Error ? error.message : String(error), - }, - metadata: { - finalStatus: 'error', - }, - }); + span?.recordException(error instanceof Error ? error : new Error(String(error))); + span?.setAttribute('processingTimeMs', processingTime); + span?.setAttribute('operation', 'vector-storage'); + span?.setStatus({ code: SpanStatusCode.ERROR, message: error instanceof Error ? error.message : String(error) }); + span?.end(); throw error; } @@ -398,8 +347,7 @@ export async function querySimilarDocuments( topK?: number; filter?: MongoDBMetadataFilter; includeVector?: boolean; - } = {}, - tracingContext?: TracingContext + } = {} ): Promise ({ @@ -472,25 +411,12 @@ export async function querySimilarDocuments( const processingTime = Date.now() - startTime; log.error("Failed to query similar documents", { error: String(error), processingTimeMs: processingTime }); - span?.error({ - error: error instanceof Error ? error : new Error(String(error)), - metadata: { - model: 'gemini-embedding-001', - operation: 'vector-query', - processingTime, - }, - }); - - span?.end({ - output: { - success: false, - processingTimeMs: processingTime, - error: error instanceof Error ? error.message : String(error), - }, - metadata: { - finalStatus: 'error', - }, - }); + span?.recordException(error instanceof Error ? error : new Error(String(error))); + span?.setAttribute('processingTimeMs', processingTime); + span?.setAttribute('model', 'gemini-embedding-001'); + span?.setAttribute('operation', 'vector-query'); + span?.setStatus({ code: SpanStatusCode.ERROR, message: error instanceof Error ? error.message : String(error) }); + span?.end(); throw error; } diff --git a/src/mastra/index.ts b/src/mastra/index.ts index 6ae42526..7ce908e3 100644 --- a/src/mastra/index.ts +++ b/src/mastra/index.ts @@ -15,7 +15,7 @@ import { pgVector } from './config/pg-storage'; // Scorers import { responseQualityScorer, taskCompletionScorer } from './scorers/custom-scorers'; -import { completenessScorer, toolCallAppropriatenessScorer, translationScorer } from './scorers/weather-scorer'; +import { translationScorer } from './scorers/weather-scorer'; // MCP import { a2aCoordinatorMcpServer } from './mcp'; @@ -164,7 +164,7 @@ export const mastra = new Mastra({ a2aCoordinatorAgent, codingA2ACoordinator, }, - scorers: { toolCallAppropriatenessScorer, completenessScorer, translationScorer, responseQualityScorer, taskCompletionScorer }, + scorers: { translationScorer, responseQualityScorer, taskCompletionScorer }, mcpServers: { a2aCoordinator: a2aCoordinatorMcpServer, notes: notesMCP }, storage: new PostgresStore({ @@ -184,7 +184,7 @@ export const mastra = new Mastra({ langfuse: { serviceName: "ai", requestContextKeys: ["userId", "environment", "tenantId"], - sampling: { type: SamplingStrategyType.ALWAYS }, + //sampling: { type: SamplingStrategyType.ALWAYS }, spanOutputProcessors: [new SensitiveDataFilter( { sensitiveFields: ['api-key', 'authorization', 'password', 'token', diff --git a/src/mastra/mcp/prompts.ts b/src/mastra/mcp/prompts.ts index 2869aef4..2f11a030 100644 --- a/src/mastra/mcp/prompts.ts +++ b/src/mastra/mcp/prompts.ts @@ -23,9 +23,9 @@ const prompts = [ ]; function stringifyNode(node: Node): string { - if ("value" in node && typeof node.value === "string") return node.value; + if ("value" in node && typeof node.value === "string") {return node.value;} if ("children" in node && Array.isArray(node.children)) - return node.children.map(stringifyNode).join(""); + {return node.children.map(stringifyNode).join("");} return ""; } @@ -58,18 +58,18 @@ const getPromptMessages: MCPServerPrompts["getPromptMessages"] = async ({ }) => { switch (name) { case "new_note": - const today = new Date().toISOString().split("T")[0]; + { const today = new Date().toISOString().split("T")[0]; return [ { role: "user", content: { type: "text", - text: `Create a new note, It is critical to provide a detailed description of each section. Ensure that each section is well-organized and easy to read. Also, include subsections for each section. Provide as much detail as possible for each section. Using this template titled \"${today}\" with sections: \"## Tasks\", \"## Specifications\", \"## Resources\", and \"## Notes\". `, + text: `Create a new note, It is critical to provide a detailed description of each section. Ensure that each section is well-organized and easy to read. Also, include subsections for each section. Provide as much detail as possible for each section. Using this template titled \\"${today}\\" with sections: \\"## Tasks\\", \\"## Specifications\\", \\"## Resources\\", and \\"## Notes\\". `, }, }, - ]; + ]; } case "summarize_note": - if (!args?.noteContent) throw new Error("No content provided"); + { if (!args?.noteContent) {throw new Error("No content provided");} const metaSum = await analyzeMarkdown(args.noteContent as string); return [ { @@ -79,9 +79,9 @@ const getPromptMessages: MCPServerPrompts["getPromptMessages"] = async ({ text: `Summarize each section in ≤ 5 bullets.\\n\\n### Outline\\n${metaSum.headings.map((h) => `- ${h} (${metaSum.wordCounts[h] || 0} words)`).join("\\n")}`.trim(), }, }, - ]; + ]; } case "brainstorm_ideas": - if (!args?.noteContent) throw new Error("No content provided"); + { if (!args?.noteContent) {throw new Error("No content provided");} const metaBrain = await analyzeMarkdown(args.noteContent as string); return [ { @@ -91,9 +91,9 @@ const getPromptMessages: MCPServerPrompts["getPromptMessages"] = async ({ text: `Brainstorm ≤5 ideas for underdeveloped sections below ${args?.topic ? `on ${args.topic}` : "."}\\n\\nUnderdeveloped sections:\\n${metaBrain.headings.length ? metaBrain.headings.map((h) => `- ${h}`).join("\\n") : "- (none, pick any)"}`, }, }, - ]; + ]; } default: - throw new Error(`Prompt \"${name}\" not found, please check the prompt name and try again.`); + throw new Error(`Prompt \\"${name}\\" not found, please check the prompt name and try again.`); } }; diff --git a/src/mastra/mcp/resources.ts b/src/mastra/mcp/resources.ts index 98328fd4..e469de3f 100644 --- a/src/mastra/mcp/resources.ts +++ b/src/mastra/mcp/resources.ts @@ -42,7 +42,7 @@ export const resourceHandlers: MCPServerResources = { listResources: listNoteFiles, getResourceContent: async ({ uri }: { uri: string }) => { const content = await readNoteFile(uri); - if (content === null) return { text: "" }; + if (content === null) {return { text: "" };} return { text: content }; }, }; diff --git a/src/mastra/scorers/weather-scorer.ts b/src/mastra/scorers/weather-scorer.ts index fbb2aee2..db50addf 100644 --- a/src/mastra/scorers/weather-scorer.ts +++ b/src/mastra/scorers/weather-scorer.ts @@ -1,14 +1,14 @@ import { z } from 'zod'; -import { createToolCallAccuracyScorerCode } from '@mastra/core/evals/code'; -import { createCompletenessScorer } from '@mastra/core/evals/completeness-scorer'; +//import { createToolCallAccuracyScorerCode } from '@mastra/core/evals/code'; +//import { createCompletenessScorer } from '@mastra/core/evals/completeness-scorer'; import { createScorer, runEvals } from '@mastra/core/evals'; -export const toolCallAppropriatenessScorer = createToolCallAccuracyScorerCode({ - expectedTool: 'weatherTool', - strictMode: false, -}); +//export const toolCallAppropriatenessScorer = createToolCallAccuracyScorerCode({ + //expectedTool: 'weatherTool', + //strictMode: false, +//}); -export const completenessScorer = createCompletenessScorer(); +//export const completenessScorer = createCompletenessScorer(); // Custom LLM-judged scorer: evaluates if non-English locations are translated appropriately /* FIXME(mastra): Add a unique `id` parameter. See: https://mastra.ai/guides/v1/migrations/upgrade-to-v1/mastra#required-id-parameter-for-all-mastra-primitives */ @@ -89,7 +89,7 @@ export const translationScorer = createScorer({ }); export const scorers = { - toolCallAppropriatenessScorer, - completenessScorer, + //toolCallAppropriatenessScorer, + //completenessScorer, translationScorer, }; diff --git a/src/mastra/tools/code-analysis.tool.ts b/src/mastra/tools/code-analysis.tool.ts index 607e686a..f0172f75 100644 --- a/src/mastra/tools/code-analysis.tool.ts +++ b/src/mastra/tools/code-analysis.tool.ts @@ -3,7 +3,7 @@ import { z } from 'zod' import { promises as fs } from 'node:fs' import * as path from 'node:path' import { glob } from 'glob' -import { trace } from "@opentelemetry/api"; +import { trace, SpanStatusCode } from "@opentelemetry/api"; import { PythonParser } from './semantic-utils' import type { RequestContext } from '@mastra/core/request-context'; @@ -193,7 +193,7 @@ Supports TypeScript, JavaScript, Python, and other languages. Use for code review preparation, quality assessment, and refactoring planning.`, inputSchema: codeAnalysisInputSchema, outputSchema: codeAnalysisOutputSchema, - execute: async (inputData, context): Promise => { + execute: async (inputData): Promise => { const tracer = trace.getTracer('code-analysis-tool', '1.0.0'); const span = tracer.startSpan('code-analysis', { attributes: { @@ -202,10 +202,11 @@ Use for code review preparation, quality assessment, and refactoring planning.`, } }); - const { target, options } = inputData - const includeMetrics = options?.includeMetrics ?? true - const detectPatterns = options?.detectPatterns ?? true - const maxFileSize = options?.maxFileSize ?? 100000 + try { + const { target, options } = inputData + const includeMetrics = options?.includeMetrics ?? true + const detectPatterns = options?.detectPatterns ?? true + const maxFileSize = options?.maxFileSize ?? 100000 let filePaths: string[] = [] @@ -291,5 +292,12 @@ Use for code review preparation, quality assessment, and refactoring planning.`, issueCount, }, } + } catch (error: unknown) { + const errorMessage = error instanceof Error ? error.message : String(error); + span?.recordException(error instanceof Error ? error : new Error(errorMessage)); + span?.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage }); + span?.end(); + throw error; + } }, }) diff --git a/src/mastra/tools/code-chunking.ts b/src/mastra/tools/code-chunking.ts index 1fd525a4..040d0340 100644 --- a/src/mastra/tools/code-chunking.ts +++ b/src/mastra/tools/code-chunking.ts @@ -4,8 +4,8 @@ import { Project, SyntaxKind } from 'ts-morph'; import { PythonParser } from './semantic-utils'; import { MDocument } from '@mastra/rag'; import { log } from '../config/logger'; -import { trace } from "@opentelemetry/api"; -import type { RequestContext } from '@mastra/core/request-context'; +import { trace, SpanStatusCode } from "@opentelemetry/api"; + const codeChunkingInputSchema = z.object({ filePath: z.string(), @@ -33,10 +33,17 @@ export const codeChunkerTool = createTool({ description: 'Intelligently chunks code files based on syntax (functions, classes) for TS/JS and Python, falling back to recursive chunking for others.', inputSchema: codeChunkingInputSchema, outputSchema: codeChunkingOutputSchema, - execute: async ({ context }) => { - const { filePath, content, options } = context; + execute: async (inputData) => { + const { filePath, content, options } = inputData; const ext = filePath.split('.').pop()?.toLowerCase(); - const chunks: any[] = []; + interface Chunk { text: string; metadata: { startLine: number; endLine: number; type: string; name?: string } } + const chunks: Chunk[] = []; + + const tracer = trace.getTracer('code-chunking'); + const span = tracer.startSpan('code-chunker', { + attributes: { filePath, ext, operation: 'code-chunking' }, + }); + try { if (['ts', 'tsx', 'js', 'jsx'].includes(ext ?? '')) { @@ -45,7 +52,14 @@ export const codeChunkerTool = createTool({ const sourceFile = project.createSourceFile(filePath, content); sourceFile.forEachChild(node => { - const kind = node.getKind(); + // typedNode narrows down the commonly used shape we need for code chunking + const typedNode = node as unknown as { + getName?: () => string; + getText: () => string; + getStartLineNumber: () => number; + getEndLineNumber: () => number; + getKindName: () => string; + }; let name: string | undefined; if (node.isKind(SyntaxKind.FunctionDeclaration) || @@ -55,16 +69,16 @@ export const codeChunkerTool = createTool({ node.isKind(SyntaxKind.EnumDeclaration) || node.isKind(SyntaxKind.VariableStatement)) { - if ('getName' in node && typeof (node as any).getName === 'function') { - name = (node as any).getName(); + if (typeof typedNode.getName === 'function') { + name = typedNode.getName(); } chunks.push({ - text: node.getText(), + text: typedNode.getText(), metadata: { - startLine: node.getStartLineNumber(), - endLine: node.getEndLineNumber(), - type: node.getKindName(), + startLine: typedNode.getStartLineNumber(), + endLine: typedNode.getEndLineNumber(), + type: typedNode.getKindName(), name, } }); @@ -76,6 +90,8 @@ export const codeChunkerTool = createTool({ if (chunks.length === 0 && content.trim().length > 0) { // Fallback to recursive } else { + span.setAttribute('chunksCount', chunks.length); + span.end(); return { chunks }; } } @@ -87,7 +103,7 @@ export const codeChunkerTool = createTool({ const lines = content.split('\n'); for (const symbol of symbols) { - if ((symbol.kind === 'function' || symbol.kind === 'class') && symbol.endLine) { + if ((symbol.kind === 'function' || symbol.kind === 'class') && (symbol.endLine !== null && symbol.endLine !== undefined && symbol.endLine > 0)) { const chunkLines = lines.slice(symbol.line - 1, symbol.endLine); chunks.push({ text: chunkLines.join('\n'), @@ -102,6 +118,8 @@ export const codeChunkerTool = createTool({ } if (chunks.length > 0) { + span.setAttribute('chunksCount', chunks.length); + span.end(); return { chunks }; } } catch (e) { @@ -122,17 +140,19 @@ export const codeChunkerTool = createTool({ separators: ['\n\n', '\n', ' '] }); - return { - chunks: textChunks.map((c, i) => ({ - text: c.text || '', - metadata: { - startLine: 0, // MDocument doesn't give line numbers easily - endLine: 0, - type: 'text-chunk', - name: `chunk-${i}` - } - })) - }; + const mapped = textChunks.map((c, i) => ({ + text: c.text || '', + metadata: { + startLine: 0, // MDocument doesn't give line numbers easily + endLine: 0, + type: 'text-chunk', + name: `chunk-${i}` + } + })); + + span.setAttribute('chunksCount', mapped.length); + span.end(); + return { chunks: mapped }; } catch (error) { const errorMeta = error instanceof Error @@ -140,6 +160,11 @@ export const codeChunkerTool = createTool({ : { value: String(error) }; log.error(`Error chunking ${filePath}:`, errorMeta); + // Trace the exception and set status + span?.recordException(error instanceof Error ? error : new Error(String(error))); + span?.setStatus({ code: SpanStatusCode.ERROR, message: error instanceof Error ? error.message : String(error) }); + span?.end(); + // Final fallback return { chunks: [{ diff --git a/src/mastra/tools/diff-review.tool.ts b/src/mastra/tools/diff-review.tool.ts index ff47f81b..e0ecd429 100644 --- a/src/mastra/tools/diff-review.tool.ts +++ b/src/mastra/tools/diff-review.tool.ts @@ -1,7 +1,7 @@ import { createTool } from '@mastra/core/tools' import { z } from 'zod' import { createPatch, structuredPatch } from 'diff' -import { trace } from "@opentelemetry/api"; +import { trace, SpanStatusCode } from "@opentelemetry/api"; import type { RequestContext } from '@mastra/core/request-context'; const diffReviewInputSchema = z.object({ @@ -50,6 +50,11 @@ Use for code review, comparing versions, and analyzing modifications.`, execute: async (inputData, _context): Promise => { const { original, modified, filename = 'file', context: contextLines = 3 } = inputData + const tracer = trace.getTracer('diff-review'); + const span = tracer.startSpan('diff-review', { attributes: { filename, contextLines } }); + + try { + const unifiedDiff = createPatch( filename, original, @@ -134,6 +139,11 @@ Use for code review, comparing versions, and analyzing modifications.`, summary = `${totalChanges} change${totalChanges !== 1 ? 's' : ''}: ${parts.join(', ')} across ${hunks.length} hunk${hunks.length !== 1 ? 's' : ''}.` } + span?.setAttribute('additions', additions); + span?.setAttribute('deletions', deletions); + span?.setAttribute('totalChanges', totalChanges); + span?.end(); + return { unifiedDiff, hunks, @@ -145,5 +155,11 @@ Use for code review, comparing versions, and analyzing modifications.`, }, summary, } - }, -}) + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + span?.recordException(error instanceof Error ? error : new Error(errorMessage)); + span?.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage }); + span?.end(); + throw error; + } +}); diff --git a/src/mastra/tools/fs.ts b/src/mastra/tools/fs.ts index 13b5012f..e54d89c9 100644 --- a/src/mastra/tools/fs.ts +++ b/src/mastra/tools/fs.ts @@ -1,6 +1,6 @@ -import { trace } from "@opentelemetry/api"; +import { trace, SpanStatusCode } from "@opentelemetry/api"; import { createTool } from "@mastra/core/tools"; -import { readFileSync, writeFileSync } from 'fs'; +import { promises as fsPromises } from 'fs'; import { z } from 'zod'; import { log } from '../config/logger'; import type { RequestContext } from '@mastra/core/request-context'; @@ -18,12 +18,11 @@ export const fsTool = createTool({ }), execute: async (inputData, context) => { const writer = context?.writer; - const tracingContext = context?.tracingContext; - const span = tracingContext?.currentSpan?.createChildSpan({ - type: AISpanType.TOOL_CALL, - name: 'fs-tool', - input: { action: inputData.action, file: inputData.file }, + + const tracer = trace.getTracer('tools/fs-tool'); + const span = tracer.startSpan('fs-tool', { + attributes: { action: inputData.action, file: inputData.file }, }); const { action, file, data } = inputData @@ -31,18 +30,21 @@ export const fsTool = createTool({ try { switch (action) { case 'write': - writeFileSync(file, data) + await fsPromises.writeFile(file, data) break - case 'read': - return { message: readFileSync(file, 'utf8') } + case 'read': { + const readContent = await fsPromises.readFile(file, 'utf8') + return { message: readContent } + } case 'append': - writeFileSync(file, data, { flag: 'a' }) + await fsPromises.appendFile(file, data) break default: return { message: 'Invalid action' } } await writer?.custom({ type: 'data-tool-progress', data: { message: '✅ FS operation complete' } }); - span?.end({ output: { success: true } }); + span?.setAttribute('success', true); + span?.end(); return { message: 'Success' } } catch (e) { const errorMsg = e instanceof Error ? e.message : String(e); @@ -50,7 +52,9 @@ export const fsTool = createTool({ log.error( `FS operation failed: ${errorMsg}` ); - span?.error({ error: e instanceof Error ? e : new Error(errorMsg), endSpan: true }); + span?.recordException(e instanceof Error ? e : new Error(errorMsg)); + span?.setStatus({ code: SpanStatusCode.ERROR, message: errorMsg }); + span?.end(); return { message: `Error: ${errorMsg}`, }; diff --git a/src/mastra/tools/jwt-auth.tool.ts b/src/mastra/tools/jwt-auth.tool.ts index 225ad53d..809378b6 100644 --- a/src/mastra/tools/jwt-auth.tool.ts +++ b/src/mastra/tools/jwt-auth.tool.ts @@ -1,4 +1,4 @@ -import { trace } from "@opentelemetry/api"; +import { trace, SpanStatusCode } from "@opentelemetry/api"; import { createTool } from '@mastra/core/tools' import { z } from 'zod' import { log } from '../config/logger' @@ -26,7 +26,7 @@ export const jwtAuthTool = createTool({ execute: async (inputData, context) => { const writer = context?.writer; const requestContext = context?.requestContext; - const tracingContext = context?.tracingContext; + await writer?.custom({ type: 'data-tool-progress', data: { message: '🔐 Verifying JWT authentication' } }); const jwt = (requestContext as RequestContext)?.get( @@ -34,23 +34,23 @@ export const jwtAuthTool = createTool({ ) // Create a span for tracing - const span = tracingContext?.currentSpan?.createChildSpan({ - type: AISpanType.TOOL_CALL, - name: 'jwt-auth-tool', - input: { hasJwt: !!jwt }, - }) + const tracer = trace.getTracer('tools/jwt-auth'); + const span = tracer.startSpan('jwt-auth-tool', { + attributes: { hasJwt: !!jwt }, + }); if (!jwt) { const error = new Error('JWT not found in runtime context') - span?.error({ error }) + span?.recordException(error); + span?.setStatus({ code: SpanStatusCode.ERROR, message: error.message }); + span?.end(); throw error } try { // const result = await AuthenticationService.verifyJWT(jwt) - span?.end({ - // output: { success: true, hasRoles: result.roles?.length > 0 }, - }) + span?.setAttribute('success', true); + span?.end(); // Mock return for now as the service call is commented out return { sub: 'mock-user', @@ -65,7 +65,9 @@ export const jwtAuthTool = createTool({ const errorMessage = error instanceof Error ? error.message : String(error) log.error(`JWT verification failed: ${errorMessage}`) - span?.error({ error: new Error(errorMessage) }) + span?.recordException(new Error(errorMessage)); + span?.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage }); + span?.end(); throw new Error('JWT verification failed: Unknown error') } }, diff --git a/src/mastra/tools/pdf.ts b/src/mastra/tools/pdf.ts index a1e30f63..bb9d18d8 100644 --- a/src/mastra/tools/pdf.ts +++ b/src/mastra/tools/pdf.ts @@ -5,7 +5,7 @@ import { existsSync, readFileSync } from 'fs' import * as path from 'path' import { z } from 'zod' import { log } from '../config/logger' -import { trace } from "@opentelemetry/api"; +import { trace, SpanStatusCode } from "@opentelemetry/api"; import type { RequestContext } from '@mastra/core/request-context'; type PdfParseFunction = (buffer: Buffer, options?: { max?: number; version?: string }) => Promise<{ numpages: number; text: string }> @@ -35,12 +35,11 @@ export const readPDF = createTool({ }), execute: async (inputData, context) => { const writer = context?.writer; - const tracingContext = context?.tracingContext; - const span = tracingContext?.currentSpan?.createChildSpan({ - type: AISpanType.TOOL_CALL, - name: 'read-pdf', - input: { pdfPath: inputData.pdfPath }, + + const tracer = trace.getTracer('tools/read-pdf'); + const span = tracer.startSpan('read-pdf', { + attributes: { pdfPath: inputData.pdfPath, service: 'pdf-parse' }, }); const { pdfPath } = inputData @@ -68,14 +67,18 @@ export const readPDF = createTool({ log.info(chalk.blue('-----------------')) log.info(chalk.blue(`Number of pages: ${data.numpages}`)) - span?.end({ output: { pageCount: data.numpages, textLength: data.text.length } }); + span?.setAttribute('pageCount', data.numpages); + span?.setAttribute('textLength', data.text.length); + span?.end(); return { content: data.text } } catch (e) { const errorMsg = e instanceof Error ? e.message : String(e); log.error( `Error reading PDF: ${errorMsg}` ) - span?.error({ error: e instanceof Error ? e : new Error(errorMsg), endSpan: true }); + span?.recordException(e instanceof Error ? e : new Error(errorMsg)); + span?.setStatus({ code: SpanStatusCode.ERROR, message: errorMsg }); + span?.end(); return { content: `Error scanning PDF: ${errorMsg}`, } diff --git a/src/mastra/tools/serpapi-search.tool.ts b/src/mastra/tools/serpapi-search.tool.ts index 39f4edd8..9c91ca0d 100644 --- a/src/mastra/tools/serpapi-search.tool.ts +++ b/src/mastra/tools/serpapi-search.tool.ts @@ -175,7 +175,7 @@ export const googleSearchTool = createTool({ await writer?.custom({ type: 'data-tool-progress', data: { message: `✅ Search complete: ${organicResults.length} organic results` } }); return result } catch (error) { - error instanceof Error ? error.message : String(error) + const errorMessage = error instanceof Error ? error.message : String(error); await writer?.custom({ type: 'data-tool-progress', data: { message: `❌ Search failed: ${errorMessage}` } }); searchSpan.recordException(new Error(errorMessage)); searchSpan.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage }); diff --git a/src/mastra/workflows/changelog.ts b/src/mastra/workflows/changelog.ts index f7586f06..2e837d57 100644 --- a/src/mastra/workflows/changelog.ts +++ b/src/mastra/workflows/changelog.ts @@ -1,4 +1,4 @@ -import { delay } from '@mastra/core'; +//import { delay } from '@mastra/core'; import { createStep, createWorkflow } from '@mastra/core/workflows'; import chalk from 'chalk'; import execa from 'execa'; @@ -171,7 +171,7 @@ const stepA1 = createStep({ TOKEN_LIMIT -= result.usage?.totalTokens ?? 0; if (TOKEN_LIMIT < 20000) { - await delay(60000); + //await delay(60000); TOKEN_LIMIT = 80000; } }