diff --git a/bun.lock b/bun.lock index 44a6b814..7877e233 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 1, "workspaces": { "": { "name": "@decocms/mcps", @@ -34,10 +35,10 @@ }, }, "content-scraper": { - "name": "mcp-content-scraper", + "name": "content-scraper", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.3", "@supabase/supabase-js": "^2.49.0", "zod": "^4.0.0", }, @@ -94,6 +95,33 @@ "wrangler": "^4.28.0", }, }, + "deco-llm": { + "name": "deco-llm", + "version": "1.0.0", + "dependencies": { + "@ai-sdk/provider": "^3.0.2", + "@ai-sdk/provider-utils": "^4.0.4", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.3", + "@openrouter/ai-sdk-provider": "^1.5.4", + "@openrouter/sdk": "^0.3.11", + "ai": "^6.0.3", + "zod": "^4.0.0", + }, + "devDependencies": { + "@cloudflare/vite-plugin": "^1.13.4", + "@cloudflare/workers-types": "^4.20251014.0", + "@decocms/mcps-shared": "1.0.0", + "@decocms/openrouter": "1.0.0", + "@mastra/core": "^0.24.0", + "@modelcontextprotocol/sdk": "1.25.1", + "@types/mime-db": "^1.43.6", + "deco-cli": "^0.28.0", + "typescript": "^5.7.2", + "vite": "7.2.0", + "wrangler": "^4.28.0", + }, + }, "gemini-pro-vision": { "name": "gemini-pro-vision", "version": "1.0.0", @@ -114,11 +142,25 @@ "wrangler": "^4.28.0", }, }, + "google-big-query": { + "name": "google-big-query", + "version": "1.0.0", + "dependencies": { + "@decocms/runtime": "^1.1.0", + "zod": "^4.0.0", + }, + "devDependencies": { + "@decocms/mcps-shared": "workspace:*", + "@modelcontextprotocol/sdk": "1.25.1", + "deco-cli": "^0.28.0", + "typescript": "^5.7.2", + }, + }, "google-calendar": { "name": "google-calendar", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0", }, "devDependencies": { @@ -132,7 +174,7 @@ "name": "google-tag-manager", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0", }, "devDependencies": { @@ -147,8 +189,8 @@ "version": "1.0.0", "dependencies": { "@ai-sdk/mcp": "^1.0.1", - "@decocms/bindings": "^1.0.7", - "@decocms/runtime": "^1.1.0", + "@decocms/bindings": "^1.0.8", + "@decocms/runtime": "^1.1.3", "@jitl/quickjs-singlefile-cjs-release-sync": "^0.31.0", "@modelcontextprotocol/sdk": "^1.25.1", "@radix-ui/react-collapsible": "^1.1.12", @@ -173,6 +215,7 @@ "tailwind-merge": "^3.0.2", "tailwindcss": "^4.0.6", "tailwindcss-animate": "^1.0.7", + "ts-morph": "^27.0.2", "zod": "^4.0.0", }, "devDependencies": { @@ -185,7 +228,7 @@ "name": "meta-ads", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0", }, "devDependencies": { @@ -259,13 +302,13 @@ }, }, "openrouter": { - "name": "openrouter", + "name": "@decocms/openrouter", "version": "1.0.0", "dependencies": { "@ai-sdk/provider": "^3.0.2", "@ai-sdk/provider-utils": "^4.0.4", - "@decocms/bindings": "^1.0.6", - "@decocms/runtime": "^1.1.1", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.3", "@openrouter/ai-sdk-provider": "^1.5.4", "@openrouter/sdk": "^0.3.11", "ai": "^6.0.3", @@ -371,7 +414,7 @@ "version": "1.0.0", "dependencies": { "@decocms/bindings": "^1.0.4", - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.3", "@supabase/supabase-js": "^2.89.0", "zod": "^4.0.0", }, @@ -411,7 +454,8 @@ "name": "@decocms/mcps-shared", "version": "1.0.0", "devDependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.3", "@types/bun": "^1.2.14", "vite": "7.2.0", "zod": "^4.0.0", @@ -544,7 +588,7 @@ "@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.33", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.12" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-egqr9PHqqX2Am5mn/Xs1C3+1/wphVKiAjpsVpW85eLc2WpW7AgiAg52DCBr4By9bw3UVVuMeR4uEO1X0dKDUDA=="], - "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.9", "", { "dependencies": { "@ai-sdk/provider": "3.0.2", "@ai-sdk/provider-utils": "4.0.4", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-EA5dZIukimwoJ9HIPuuREotAqaTItpdc/yImzVF0XGNg7B0YRJmYI8Uq3aCMr87vjr1YB1cWUfnrTt6OJ9eHiQ=="], + "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "3.0.2", "@ai-sdk/provider-utils": "4.0.4", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-sRlPMKd38+fdp2y11USW44c0o8tsIsT6T/pgyY04VXC3URjIRnkxugxd9AkU2ogfpPDMz50cBAGPnMxj+6663Q=="], "@ai-sdk/google-v5": ["@ai-sdk/google@2.0.40", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-E7MTVE6vhWXQJzXQDvojwA9t5xlhWpxttCH3R/kUyiE6y0tT8Ay2dmZLO+bLpFBQ5qrvBMrjKWpDVQMoo6TJZg=="], @@ -588,77 +632,77 @@ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.962.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-node": "3.962.0", "@aws-sdk/middleware-bucket-endpoint": "3.957.0", "@aws-sdk/middleware-expect-continue": "3.957.0", "@aws-sdk/middleware-flexible-checksums": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-location-constraint": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-sdk-s3": "3.957.0", "@aws-sdk/middleware-ssec": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/signature-v4-multi-region": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/eventstream-serde-browser": "^4.2.7", "@smithy/eventstream-serde-config-resolver": "^4.3.7", "@smithy/eventstream-serde-node": "^4.2.7", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-blob-browser": "^4.2.8", "@smithy/hash-node": "^4.2.7", "@smithy/hash-stream-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/md5-js": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-I2/1McBZCcM3PfM4ck8D6gnZR3K7+yl1fGkwTq/3ThEn9tdLjNwcdgTbPfxfX6LoecLrH9Ekoo+D9nmQ0T261w=="], + "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.965.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.965.0", "@aws-sdk/credential-provider-node": "3.965.0", "@aws-sdk/middleware-bucket-endpoint": "3.965.0", "@aws-sdk/middleware-expect-continue": "3.965.0", "@aws-sdk/middleware-flexible-checksums": "3.965.0", "@aws-sdk/middleware-host-header": "3.965.0", "@aws-sdk/middleware-location-constraint": "3.965.0", "@aws-sdk/middleware-logger": "3.965.0", "@aws-sdk/middleware-recursion-detection": "3.965.0", "@aws-sdk/middleware-sdk-s3": "3.965.0", "@aws-sdk/middleware-ssec": "3.965.0", "@aws-sdk/middleware-user-agent": "3.965.0", "@aws-sdk/region-config-resolver": "3.965.0", "@aws-sdk/signature-v4-multi-region": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@aws-sdk/util-user-agent-browser": "3.965.0", "@aws-sdk/util-user-agent-node": "3.965.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/eventstream-serde-browser": "^4.2.7", "@smithy/eventstream-serde-config-resolver": "^4.3.7", "@smithy/eventstream-serde-node": "^4.2.7", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-blob-browser": "^4.2.8", "@smithy/hash-node": "^4.2.7", "@smithy/hash-stream-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/md5-js": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-BTeaaU1iK0BfatTCrtYjNkIHCoZH256qOI18l9bK4z6mVOgpHkYN4RvOu+NnKgyX58n+HWfOuhtKUD4OE33Vdw=="], - "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.958.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-6qNCIeaMzKzfqasy2nNRuYnMuaMebCcCPP4J2CVGkA8QYMbIVKPlkn9bpB20Vxe6H/r3jtCCLQaOJjVTx/6dXg=="], + "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.965.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.965.0", "@aws-sdk/middleware-host-header": "3.965.0", "@aws-sdk/middleware-logger": "3.965.0", "@aws-sdk/middleware-recursion-detection": "3.965.0", "@aws-sdk/middleware-user-agent": "3.965.0", "@aws-sdk/region-config-resolver": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@aws-sdk/util-user-agent-browser": "3.965.0", "@aws-sdk/util-user-agent-node": "3.965.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-iv2tr+n4aZ+nPUFFvG00hISPuEd4DU+1/Q8rPAYKXsM+vEPJ2nAnP5duUOa2fbOLIUCRxX3dcQaQaghVHDHzQw=="], - "@aws-sdk/core": ["@aws-sdk/core@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@aws-sdk/xml-builder": "3.957.0", "@smithy/core": "^3.20.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-DrZgDnF1lQZv75a52nFWs6MExihJF2GZB6ETZRqr6jMwhrk2kbJPUtvgbifwcL7AYmVqHQDJBrR/MqkwwFCpiw=="], + "@aws-sdk/core": ["@aws-sdk/core@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@aws-sdk/xml-builder": "3.965.0", "@smithy/core": "^3.20.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-aq9BhQxdHit8UUJ9C0im9TtuKeK0pT6NXmNJxMTCFeStI7GG7ImIsSislg3BZTIifVg1P6VLdzMyz9de85iutQ=="], - "@aws-sdk/crc64-nvme": ["@aws-sdk/crc64-nvme@3.957.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-qSwSfI+qBU9HDsd6/4fM9faCxYJx2yDuHtj+NVOQ6XYDWQzFab/hUdwuKZ77Pi6goLF1pBZhJ2azaC2w7LbnTA=="], + "@aws-sdk/crc64-nvme": ["@aws-sdk/crc64-nvme@3.965.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-9FbIyJ/Zz1AdEIrb0+Pn7wRi+F/0Y566ooepg0hDyHUzRV3ZXKjOlu3wJH3YwTz2UkdwQmldfUos2yDJps7RyA=="], - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-475mkhGaWCr+Z52fOOVb/q2VHuNvqEDixlYIkeaO6xJ6t9qR0wpLt4hOQaR6zR1wfZV0SlE7d8RErdYq/PByog=="], + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-mdGnaIjMxTIjsb70dEj3VsWPWpoq1V5MWzBSfJq2H8zgMBXjn6d5/qHP8HMf53l9PrsgqzMpXGv3Av549A2x1g=="], - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/node-http-handler": "^4.4.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" } }, "sha512-8dS55QHRxXgJlHkEYaCGZIhieCs9NU1HU1BcqQ4RfUdSsfRdxxktqUKgCnBnOOn0oD3PPA8cQOCAVgIyRb3Rfw=="], + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/node-http-handler": "^4.4.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" } }, "sha512-YuGQel9EgA/z25oeLM+GYYQS750+8AESvr7ZEmVnRPL0sg+K3DmGqdv+9gFjFd0UkLjTlC/jtbP2cuY6UcPiHQ=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.962.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", "@aws-sdk/credential-provider-login": "3.962.0", "@aws-sdk/credential-provider-process": "3.957.0", "@aws-sdk/credential-provider-sso": "3.958.0", "@aws-sdk/credential-provider-web-identity": "3.958.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-h0kVnXLW2d3nxbcrR/Pfg3W/+YoCguasWz7/3nYzVqmdKarGrpJzaFdoZtLgvDSZ8VgWUC4lWOTcsDMV0UNqUQ=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/credential-provider-env": "3.965.0", "@aws-sdk/credential-provider-http": "3.965.0", "@aws-sdk/credential-provider-login": "3.965.0", "@aws-sdk/credential-provider-process": "3.965.0", "@aws-sdk/credential-provider-sso": "3.965.0", "@aws-sdk/credential-provider-web-identity": "3.965.0", "@aws-sdk/nested-clients": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-xRo72Prer5s0xYVSCxCymVIRSqrVlevK5cmU0GWq9yJtaBNpnx02jwdJg80t/Ni7pgbkQyFWRMcq38c1tc6M/w=="], - "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.962.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-kHYH6Av2UifG3mPkpPUNRh/PuX6adaAcpmsclJdHdxlixMCRdh8GNeEihq480DC0GmfqdpoSf1w2CLmLLPIS6w=="], + "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/nested-clients": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-43/H8Qku8LHyugbhLo8kjD+eauhybCeVkmrnvWl8bXNHJP7xi1jCdtBQJKKJqiIHZws4MOEwkji8kFdAVRCe6g=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.962.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", "@aws-sdk/credential-provider-ini": "3.962.0", "@aws-sdk/credential-provider-process": "3.957.0", "@aws-sdk/credential-provider-sso": "3.958.0", "@aws-sdk/credential-provider-web-identity": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-CS78NsWRxLa+nWqeWBEYMZTLacMFIXs1C5WJuM9kD05LLiWL32ksljoPsvNN24Bc7rCSQIIMx/U3KGvkDVZMVg=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.965.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.965.0", "@aws-sdk/credential-provider-http": "3.965.0", "@aws-sdk/credential-provider-ini": "3.965.0", "@aws-sdk/credential-provider-process": "3.965.0", "@aws-sdk/credential-provider-sso": "3.965.0", "@aws-sdk/credential-provider-web-identity": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-cRxmMHF+Zh2lkkkEVduKl+8OQdtg/DhYA69+/7SPSQURlgyjFQGlRQ58B7q8abuNlrGT3sV+UzeOylZpJbV61Q=="], - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-/KIz9kadwbeLy6SKvT79W81Y+hb/8LMDyeloA2zhouE28hmne+hLn0wNCQXAAupFFlYOAtZR2NTBs7HBAReJlg=="], + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-gmkPmdiR0yxnTzLPDb7rwrDhGuCUjtgnj8qWP+m0gSz/W43rR4jRPVEf6DUX2iC+ImQhxo3NFhuB3V42Kzo3TQ=="], - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.958.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.958.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/token-providers": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-CBYHJ5ufp8HC4q+o7IJejCUctJXWaksgpmoFpXerbjAso7/Fg7LLUu9inXVOxlHKLlvYekDXjIUBXDJS2WYdgg=="], + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.965.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.965.0", "@aws-sdk/core": "3.965.0", "@aws-sdk/token-providers": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-N01AYvtCqG3Wo/s/LvYt19ity18/FqggiXT+elAs3X9Om/Wfx+hw9G+i7jaDmy+/xewmv8AdQ2SK5Q30dXw/Fw=="], - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.958.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-dgnvwjMq5Y66WozzUzxNkCFap+umHUtqMMKlr8z/vl9NYMLem/WUbWNpFFOVFWquXikc+ewtpBMR4KEDXfZ+KA=="], + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/nested-clients": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-T4gMZ2JzXnfxe1oTD+EDGLSxFfk1+WkLZdiHXEMZp8bFI1swP/3YyDFXI+Ib9Uq1JhnAmrCXtOnkicKEhDkdhQ=="], - "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@aws-sdk/util-arn-parser": "3.957.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-iczcn/QRIBSpvsdAS/rbzmoBpleX1JBjXvCynMbDceVLBIcVrwT1hXECrhtIC2cjh4HaLo9ClAbiOiWuqt+6MA=="], + "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@aws-sdk/util-arn-parser": "3.965.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-gbdv3Dl8l8xmg4oH60fXvfDyTxfx28w5/Hxdymx3vurM07tAyd4qld8zEXejnSpraTo45QcHRtk5auELIMfeag=="], - "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-AlbK3OeVNwZZil0wlClgeI/ISlOt/SPUxBsIns876IFaVu/Pj3DgImnYhpcJuFRek4r4XM51xzIaGQXM6GDHGg=="], + "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-UBxVytsmhEmFwkBnt+aV0eAJ7uc+ouNokCqMBrQ7Oc5A77qhlcHfOgXIKz2SxqsiYTsDq+a0lWFM/XpyRWraqA=="], - "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.957.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/crc64-nvme": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-iJpeVR5V8se1hl2pt+k8bF/e9JO4KWgPCMjg8BtRspNtKIUGy7j6msYvbDixaKZaF2Veg9+HoYcOhwnZumjXSA=="], + "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.965.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.965.0", "@aws-sdk/crc64-nvme": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-5rzEW08trcpHMe6jkQyYc4PL1KG/H7BbnySFSzhih+r/gktQEiE36sb1BNf7av9I0Vk2Ccmt7wocB5PIT7GDkQ=="], - "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-BBgKawVyfQZglEkNTuBBdC3azlyqNXsvvN4jPkWAiNYcY0x1BasaJFl+7u/HisfULstryweJq/dAvIZIxzlZaA=="], + "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-SfpSYqoPOAmdb3DBsnNsZ0vix+1VAtkUkzXM79JL3R5IfacpyKE2zytOgVAQx/FjhhlpSTwuXd+LRhUEVb3MaA=="], - "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-y8/W7TOQpmDJg/fPYlqAhwA4+I15LrS7TwgUEoxogtkD8gfur9wFMRLT8LCyc9o4NMEcAnK50hSb4+wB0qv6tQ=="], + "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-07T1rwAarQs33mVg5U28AsSdLB5JUXu9yBTBmspFGajKVsEahIyntf53j9mAXF1N2KR0bNdP0J4A0kst4t43UQ=="], - "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-w1qfKrSKHf9b5a8O76yQ1t69u6NWuBjr5kBX+jRWFx/5mu6RLpqERXRpVJxfosbep7k3B+DSB5tZMZ82GKcJtQ=="], + "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-gjUvJRZT1bUABKewnvkj51LAynFrfz2h5DYAg5/2F4Utx6UOGByTSr9Rq8JCLbURvvzAbCtcMkkIJRxw+8Zuzw=="], - "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-D2H/WoxhAZNYX+IjkKTdOhOkWQaK0jjJrDBj56hKjU5c9ltQiaX/1PqJ4dfjHntEshJfu0w+E6XJ+/6A6ILBBA=="], + "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-6dvD+18Ni14KCRu+tfEoNxq1sIGVp9tvoZDZ7aMvpnA7mDXuRLrOjRQ/TAZqXwr9ENKVGyxcPl0cRK8jk1YWjA=="], - "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-arn-parser": "3.957.0", "@smithy/core": "^3.20.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-5B2qY2nR2LYpxoQP0xUum5A1UNvH2JQpLHDH1nWFNF/XetV7ipFHksMxPNhtJJ6ARaWhQIDXfOUj0jcnkJxXUg=="], + "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-arn-parser": "3.965.0", "@smithy/core": "^3.20.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-dXEgnojaaVRl+OlOx35mg3rYEbfffIN4X6tLmIfDnaKz0hMaDMvsE9jJXb/vBvokbdO1sVB27/2FEM4ttLSLnw=="], - "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-qwkmrK0lizdjNt5qxl4tHYfASh8DFpHXM1iDVo+qHe+zuslfMqQEGRkzxS8tJq/I+8F0c6v3IKOveKJAfIvfqQ=="], + "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-dke++CTw26y+a2D1DdVuZ4+2TkgItdx6TeuE0zOl4lsqXGvTBUG4eaIZalt7ZOAW5ys2pbDOk1bPuh4opoD3pQ=="], - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@smithy/core": "^3.20.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-50vcHu96XakQnIvlKJ1UoltrFODjsq2KvtTgHiPFteUS884lQnK5VC/8xd1Msz/1ONpLMzdCVproCQqhDTtMPQ=="], + "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@smithy/core": "^3.20.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-RBEYVGgu/WeAt+H/qLrGc+t8LqAUkbyvh3wBfTiuAD+uBcWsKnvnB1iSBX75FearC0fmoxzXRUc0PMxMdqpjJQ=="], - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.958.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-/KuCcS8b5TpQXkYOrPLYytrgxBhv81+5pChkOlhegbeHttjM69pyUpQVJqyfDM/A7wPLnDrzCAnk4zaAOkY0Nw=="], + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.965.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.965.0", "@aws-sdk/middleware-host-header": "3.965.0", "@aws-sdk/middleware-logger": "3.965.0", "@aws-sdk/middleware-recursion-detection": "3.965.0", "@aws-sdk/middleware-user-agent": "3.965.0", "@aws-sdk/region-config-resolver": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@aws-sdk/util-user-agent-browser": "3.965.0", "@aws-sdk/util-user-agent-node": "3.965.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-muNVUjUEU+/KLFrLzQ8PMXyw4+a/MP6t4GIvwLtyx/kH0rpSy5s0YmqacMXheuIe6F/5QT8uksXGNAQenitkGQ=="], - "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A=="], + "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/config-resolver": "^4.4.5", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-RoMhu9ly2B0coxn8ctXosPP2WmDD0MkQlZGLjoYHQUOCBmty5qmCxOqBmBDa6wbWbB8xKtMQ/4VXloQOgzjHXg=="], - "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.962.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-format-url": "3.957.0", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-tyxsGfLY4NSohLrJsFGXbE3j8jguWK+hdGaUQSD1gJPvmC0B82qOyJ7WBIJLWgTabU3fiF/I9EGXjzR2rKr8jQ=="], + "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.965.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-format-url": "3.965.0", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-aQ9vvXjeoQsAaRHS18l8doY+E/6mmNMSDMU6eJsSUDgvgGRMHhsKjiVh7DJGbZRRogdrES4KAfx6raIB4kBz5Q=="], - "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.957.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-t6UfP1xMUigMMzHcb7vaZcjv7dA2DQkk9C/OAP1dKyrE0vb4lFGDaTApi17GN6Km9zFxJthEMUbBc7DL0hq1Bg=="], + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.965.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-hgbAThbsUrWtNpFBQxzXevIfd5Qgr4TLbXY1AIbmpSX9fPVC114pdieRMpopJ0fYaJ7v5/blTiS6wzVdXleZ/w=="], - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.958.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-UCj7lQXODduD1myNJQkV+LYcGYJ9iiMggR8ow8Hva1g3A/Na5imNXzz6O67k7DAee0TYpy+gkNw+SizC6min8Q=="], + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/nested-clients": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-aR0qxg0b8flkXJVE+CM1gzo7uJ57md50z2eyCwofC0QIz5Y0P7/7vvb9/dmUQt6eT9XRN5iRcUqq2IVxVDvJOw=="], - "@aws-sdk/types": ["@aws-sdk/types@3.957.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg=="], + "@aws-sdk/types": ["@aws-sdk/types@3.965.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-jvodoJdMavvg8faN7co58vVJRO5MVep4JFPRzUNCzpJ98BDqWDk/ad045aMJcmxkLzYLS2UAnUmqjJ/tUPNlzQ=="], - "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.957.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Aj6m+AyrhWyg8YQ4LDPg2/gIfGHCEcoQdBt5DeSFogN5k9mmJPOJ+IAmNSWmWRjpOxEy6eY813RNDI6qS97M0g=="], + "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.965.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-bNGKr5Tct28jGLkL8xIkGu7swpDgBpkTVbGaofhzr/X80iclbOv656RGxhMpDvmc4S9UuQnqLRXyceNFNF2V7Q=="], - "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-endpoints": "^3.2.7", "tslib": "^2.6.2" } }, "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw=="], + "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-endpoints": "^3.2.7", "tslib": "^2.6.2" } }, "sha512-WqSCB0XIsGUwZWvrYkuoofi2vzoVHqyeJ2kN+WyoOsxPLTiQSBIoqm/01R/qJvoxwK/gOOF7su9i84Vw2NQQpQ=="], - "@aws-sdk/util-format-url": ["@aws-sdk/util-format-url@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/querystring-builder": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-Yyo/tlc0iGFGTPPkuxub1uRAv6XrnVnvSNjslZh5jIYA8GZoeEFPgJa3Qdu0GUS/YwoK8GOLnnaL9h/eH5LDJQ=="], + "@aws-sdk/util-format-url": ["@aws-sdk/util-format-url@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/querystring-builder": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-KiplV4xYGXdNCcz5eRP8WfAejT5EkE2gQxC4IY6WsuxYprzQKsnGaAzEQ+giR5GgQLIRBkPaWT0xHEYkMiCQ1Q=="], - "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.957.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-nhmgKHnNV9K+i9daumaIz8JTLsIIML9PE/HUks5liyrjUzenjW/aHoc7WJ9/Td/gPZtayxFnXQSJRb/fDlBuJw=="], + "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-9LJFand4bIoOjOF4x3wx0UZYiFZRo4oUauxQSiEX2dVg+5qeBOJSjp2SeWykIE6+6frCZ5wvWm2fGLK8D32aJw=="], - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw=="], + "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-Xiza/zMntQGpkd2dETQeAK8So1pg5+STTzpcdGWxj5q0jGO5ayjqT/q1Q7BrsX5KIr6PvRkl9/V7lLCv04wGjQ=="], - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.957.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-ycbYCwqXk4gJGp0Oxkzf2KBeeGBdTxz559D41NJP8FlzSej1Gh7Rk40Zo6AyTfsNWkrl/kVi1t937OIzC5t+9Q=="], + "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.965.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-kokIHUfNT3/P55E4fUJJrFHuuA9BbjFKUIxoLrd3UaRfdafT0ScRfg2eaZie6arf60EuhlUIZH0yALxttMEjxQ=="], - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.957.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-Ai5iiQqS8kJ5PjzMhWcLKN0G2yasAkvpnPlq2EnqlIMdB48HsizElt62qcktdxp4neRMyGkFq4NzgmDbXnhRiA=="], + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.965.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-Tcod25/BTupraQwtb+Q+GX8bmEZfxIFjjJ/AvkhUZsZlkPeVluzq1uu3Oeqf145DCdMjzLIN6vab5MrykbDP+g=="], - "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.2", "", {}, "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg=="], + "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.3", "", {}, "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw=="], "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], @@ -700,21 +744,21 @@ "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.1", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg=="], - "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.7.13", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20251202.0" }, "optionalPeers": ["workerd"] }, "sha512-NulO1H8R/DzsJguLC0ndMuk4Ufv0KSlN+E54ay9rn9ZCQo0kpAPwwh3LhgpZ96a3Dr6L9LqW57M4CqC34iLOvw=="], + "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.8.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20251202.0" }, "optionalPeers": ["workerd"] }, "sha512-oIAu6EdQ4zJuPwwKr9odIEqd8AV96z1aqi3RBEA4iKaJ+Vd3fvuI6m5EDC7/QCv+oaPIhy1SkYBYxmD09N+oZg=="], - "@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.17.1", "", { "dependencies": { "@cloudflare/unenv-preset": "2.7.13", "@remix-run/node-fetch-server": "^0.8.0", "defu": "^6.1.4", "get-port": "^7.1.0", "miniflare": "4.20251210.0", "picocolors": "^1.1.1", "tinyglobby": "^0.2.12", "unenv": "2.0.0-rc.24", "wrangler": "4.54.0", "ws": "8.18.0" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0" } }, "sha512-QHxTDhvJakWCs4mu7Q6fB02CPT5MvZkyxufwX7dCIDqLfav5ohIQ7+wdTU7AYwPJ7tF8/a82dBpwnt7+wHooXg=="], + "@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.20.1", "", { "dependencies": { "@cloudflare/unenv-preset": "2.8.0", "@remix-run/node-fetch-server": "^0.8.0", "defu": "^6.1.4", "get-port": "^7.1.0", "miniflare": "4.20260107.0", "picocolors": "^1.1.1", "tinyglobby": "^0.2.12", "unenv": "2.0.0-rc.24", "wrangler": "4.58.0", "ws": "8.18.0" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0" } }, "sha512-hKe2ghXFAWG4s2c08LQZao5Ymt0HBC/XqrUINowHhru2ylnjGp3uuMnI/J1eKpkw1TBdR3weT/EvwT/XtS/b5A=="], - "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20251210.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Nn9X1moUDERA9xtFdCQ2XpQXgAS9pOjiCxvOT8sVx9UJLAiBLkfSCGbpsYdarODGybXCpjRlc77Yppuolvt7oQ=="], + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260107.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Srwe/IukVppkMU2qTndkFaKCmZBI7CnZoq4Y0U0gD/8158VGzMREHTqCii4IcCeHifwrtDqTWu8EcA1VBKI4mg=="], - "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20251210.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Mg8iYIZQFnbevq/ls9eW/eneWTk/EE13Pej1MwfkY5et0jVpdHnvOLywy/o+QtMJFef1AjsqXGULwAneYyBfHw=="], + "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260107.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-aAYwU7zXW+UZFh/a4vHP5cs1ulTOcDRLzwU9547yKad06RlZ6ioRm7ovjdYvdqdmbI8mPd99v4LN9gMmecazQw=="], - "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20251210.0", "", { "os": "linux", "cpu": "x64" }, "sha512-kjC2fCZhZ2Gkm1biwk2qByAYpGguK5Gf5ic8owzSCUw0FOUfQxTZUT9Lp3gApxsfTLbbnLBrX/xzWjywH9QR4g=="], + "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260107.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Wh7xWtFOkk6WY3CXe3lSqZ1anMkFcwy+qOGIjtmvQ/3nCOaG34vKNwPIE9iwryPupqkSuDmEqkosI1UUnSTh1A=="], - "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20251210.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-2IB37nXi7PZVQLa1OCuO7/6pNxqisRSO8DmCQ5x/3sezI5op1vwOxAcb1osAnuVsVN9bbvpw70HJvhKruFJTuA=="], + "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260107.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-NI0/5rdssdZZKYHxNG4umTmMzODByq86vSCEk8u4HQbGhRCQo7rV1eXn84ntSBdyWBzWdYGISCbeZMsgfIjSTg=="], - "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20251210.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Uaz6/9XE+D6E7pCY4OvkCuJHu7HcSDzeGcCGY1HLhojXhHd7yL52c3yfiyJdS8hPatiAa0nn5qSI/42+aTdDSw=="], + "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260107.1", "", { "os": "win32", "cpu": "x64" }, "sha512-gmBMqs606Gd/IhBEBPSL/hJAqy2L8IyPUjKtoqd/Ccy7GQxbSc0rYlRkxbQ9YzmqnuhrTVYvXuLscyWrpmAJkw=="], - "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260103.0", "", {}, "sha512-jANmoGpJcXARnwlkvrQOeWyjYD1quTfHcs+++Z544XRHOSfLc4XSlts7snIhbiIGgA5bo66zDhraF+9lKUr2hw=="], + "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260109.0", "", {}, "sha512-90vx2lVm+fhQyE8FKqNhT8JBI8GuY0biAwxTzvzeRIdWVo2ArCpUfYMYq4kzaGTfA6NwCmXmBFSgnqfG6OFxLw=="], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], @@ -722,11 +766,13 @@ "@deco/mcp": ["@jsr/deco__mcp@0.5.5", "https://npm.jsr.io/~/11/@jsr/deco__mcp/0.5.5.tgz", { "dependencies": { "@jsr/deco__deco": "^1.112.1", "@jsr/hono__hono": "^4.5.4", "@modelcontextprotocol/sdk": "^1.11.4", "fetch-to-node": "^2.1.0", "zod": "^3.24.2" } }, "sha512-46TaWGu7lbsPleHjCVrG6afhQjv3muBTNRFBkIhLrSzlQ+9d21UeukpYs19z0AGpOlmjSSK9qIRFTf8SlH2B6Q=="], - "@decocms/bindings": ["@decocms/bindings@1.0.7", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^4.0.0", "zod-from-json-schema": "^0.5.2" } }, "sha512-NPYv4+VpI6XQbfMewy307Q1jp9QZc8a6lsC2g9Z/DCewKqFOCqAKsRrhBSGaujKEzHqxNLSqXhFx8/Vn3ODVJA=="], + "@decocms/bindings": ["@decocms/bindings@1.0.8", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^4.0.0", "zod-from-json-schema": "^0.5.2" } }, "sha512-DDF4rA/+L8ELUyrMNxDc5MCBtLPXCkA45OWi85xG3XX5a+DqZ7+GJtVQBmyMbEc+02km/oKUgN5IS1ebnAMLlA=="], "@decocms/mcps-shared": ["@decocms/mcps-shared@workspace:shared"], - "@decocms/runtime": ["@decocms/runtime@1.1.1", "", { "dependencies": { "@ai-sdk/provider": "^3.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.7", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-rGyqX57JfNAguHYFgvdpTJU3Zfg0svqrBDCbizRSVO/IptGt0dph1EhdjRwlqyCaMNl70uk/hUsb8aMuOFj+KQ=="], + "@decocms/openrouter": ["@decocms/openrouter@workspace:openrouter"], + + "@decocms/runtime": ["@decocms/runtime@1.1.3", "", { "dependencies": { "@ai-sdk/provider": "^3.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "^1.0.7", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-pj6OccmpWulMjyOt9FHTNX41xHk800uzhmoYK/xq9h1f+DfDBMqyOZnt70Zmwrab7dMDO2w3VQD+NlgFKtrw1w=="], "@decocms/vite-plugin": ["@decocms/vite-plugin@1.0.0-alpha.1", "", { "dependencies": { "@cloudflare/vite-plugin": "^1.13.4", "vite": "7.2.0" } }, "sha512-DI9zNH49pVk8aQ+7rNYwqTZhjQ4RZDA+kA1t3ifwc4RLJsOtYv8LOXERRZnou7CcKVTdXPB06M8gbMWPpSaq8w=="], @@ -840,6 +886,10 @@ "@inquirer/figures": ["@inquirer/figures@1.0.15", "", {}, "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g=="], + "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], + + "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], "@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="], @@ -942,7 +992,7 @@ "@mastra/schema-compat": ["@mastra/schema-compat@0.11.9", "", { "dependencies": { "json-schema": "^0.4.0", "json-schema-to-zod": "^2.7.0", "zod-from-json-schema": "^0.5.0", "zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "ai": "^4.0.0 || ^5.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-LXEChx5n3bcuSFWQ5Wn9K2spLEpzHGf+DCnAeryuecpOo8VGLJ2QCK9Ugsnfjuc6hC0Ha73HvL1AD8zDhjmYOg=="], - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -962,9 +1012,9 @@ "@opentelemetry/auto-instrumentations-node": ["@opentelemetry/auto-instrumentations-node@0.62.2", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", "@opentelemetry/instrumentation-amqplib": "^0.50.0", "@opentelemetry/instrumentation-aws-lambda": "^0.54.1", "@opentelemetry/instrumentation-aws-sdk": "^0.58.0", "@opentelemetry/instrumentation-bunyan": "^0.49.0", "@opentelemetry/instrumentation-cassandra-driver": "^0.49.0", "@opentelemetry/instrumentation-connect": "^0.47.0", "@opentelemetry/instrumentation-cucumber": "^0.19.0", "@opentelemetry/instrumentation-dataloader": "^0.21.1", "@opentelemetry/instrumentation-dns": "^0.47.0", "@opentelemetry/instrumentation-express": "^0.52.0", "@opentelemetry/instrumentation-fastify": "^0.48.0", "@opentelemetry/instrumentation-fs": "^0.23.0", "@opentelemetry/instrumentation-generic-pool": "^0.47.0", "@opentelemetry/instrumentation-graphql": "^0.51.0", "@opentelemetry/instrumentation-grpc": "^0.203.0", "@opentelemetry/instrumentation-hapi": "^0.50.0", "@opentelemetry/instrumentation-http": "^0.203.0", "@opentelemetry/instrumentation-ioredis": "^0.51.0", "@opentelemetry/instrumentation-kafkajs": "^0.13.0", "@opentelemetry/instrumentation-knex": "^0.48.0", "@opentelemetry/instrumentation-koa": "^0.51.0", "@opentelemetry/instrumentation-lru-memoizer": "^0.48.0", "@opentelemetry/instrumentation-memcached": "^0.47.0", "@opentelemetry/instrumentation-mongodb": "^0.56.0", "@opentelemetry/instrumentation-mongoose": "^0.50.0", "@opentelemetry/instrumentation-mysql": "^0.49.0", "@opentelemetry/instrumentation-mysql2": "^0.50.0", "@opentelemetry/instrumentation-nestjs-core": "^0.49.0", "@opentelemetry/instrumentation-net": "^0.47.0", "@opentelemetry/instrumentation-oracledb": "^0.29.0", "@opentelemetry/instrumentation-pg": "^0.56.1", "@opentelemetry/instrumentation-pino": "^0.50.1", "@opentelemetry/instrumentation-redis": "^0.52.0", "@opentelemetry/instrumentation-restify": "^0.49.0", "@opentelemetry/instrumentation-router": "^0.48.0", "@opentelemetry/instrumentation-runtime-node": "^0.17.1", "@opentelemetry/instrumentation-socket.io": "^0.50.0", "@opentelemetry/instrumentation-tedious": "^0.22.0", "@opentelemetry/instrumentation-undici": "^0.14.0", "@opentelemetry/instrumentation-winston": "^0.48.1", "@opentelemetry/resource-detector-alibaba-cloud": "^0.31.3", "@opentelemetry/resource-detector-aws": "^2.3.0", "@opentelemetry/resource-detector-azure": "^0.10.0", "@opentelemetry/resource-detector-container": "^0.7.3", "@opentelemetry/resource-detector-gcp": "^0.37.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/sdk-node": "^0.203.0" }, "peerDependencies": { "@opentelemetry/api": "^1.4.1", "@opentelemetry/core": "^2.0.0" } }, "sha512-Ipe6X7ddrCiRsuewyTU83IvKiSFT4piqmv9z8Ovg1E7v98pdTj1pUE6sDrHV50zl7/ypd+cONBgt+EYSZu4u9Q=="], - "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.2.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ=="], + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.3.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-hGcsT0qDP7Il1L+qT3JFpiGl1dCjF794Bb4yCRCYdr7XC0NwHtOF3ngF86Gk6TUnsakbyQsDQ0E/S4CU0F4d4g=="], - "@opentelemetry/core": ["@opentelemetry/core@2.2.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw=="], + "@opentelemetry/core": ["@opentelemetry/core@2.3.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-PcmxJQzs31cfD0R2dE91YGFcLxOSN4Bxz7gez5UwSUjCai8BwH/GI5HchfVshHkWdTkUs0qcaPJgVHKXUp7I3A=="], "@opentelemetry/exporter-logs-otlp-grpc": ["@opentelemetry/exporter-logs-otlp-grpc@0.203.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-exporter-base": "0.203.0", "@opentelemetry/otlp-grpc-exporter-base": "0.203.0", "@opentelemetry/otlp-transformer": "0.203.0", "@opentelemetry/sdk-logs": "0.203.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-g/2Y2noc/l96zmM+g0LdeuyYKINyBwN6FJySoU15LHPLcMN/1a0wNk2SegwKcxrRdE7Xsm7fkIR5n6XFe3QpPw=="], @@ -1094,17 +1144,17 @@ "@opentelemetry/resource-detector-gcp": ["@opentelemetry/resource-detector-gcp@0.37.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0", "gcp-metadata": "^6.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-LGpJBECIMsVKhiulb4nxUw++m1oF4EiDDPmFGW2aqYaAF0oUvJNv8Z/55CAzcZ7SxvlTgUwzewXDBsuCup7iqw=="], - "@opentelemetry/resources": ["@opentelemetry/resources@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A=="], + "@opentelemetry/resources": ["@opentelemetry/resources@2.3.0", "", { "dependencies": { "@opentelemetry/core": "2.3.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-shlr2l5g+87J8wqYlsLyaUsgKVRO7RtX70Ckd5CtDOWtImZgaUDmf4Z2ozuSKQLM2wPDR0TE/3bPVBNJtRm/cQ=="], "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.203.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.203.0", "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw=="], - "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw=="], + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.3.0", "", { "dependencies": { "@opentelemetry/core": "2.3.0", "@opentelemetry/resources": "2.3.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-P+bYQgJHf6hRKgsR7xDnbNPDP+x1DwGtse6gHAPZ/iwMGbtQPVvhyFK1lseow5o3kLxNEaQv4lDqAF/vpRdXxA=="], "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.203.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.203.0", "@opentelemetry/core": "2.0.1", "@opentelemetry/exporter-logs-otlp-grpc": "0.203.0", "@opentelemetry/exporter-logs-otlp-http": "0.203.0", "@opentelemetry/exporter-logs-otlp-proto": "0.203.0", "@opentelemetry/exporter-metrics-otlp-grpc": "0.203.0", "@opentelemetry/exporter-metrics-otlp-http": "0.203.0", "@opentelemetry/exporter-metrics-otlp-proto": "0.203.0", "@opentelemetry/exporter-prometheus": "0.203.0", "@opentelemetry/exporter-trace-otlp-grpc": "0.203.0", "@opentelemetry/exporter-trace-otlp-http": "0.203.0", "@opentelemetry/exporter-trace-otlp-proto": "0.203.0", "@opentelemetry/exporter-zipkin": "2.0.1", "@opentelemetry/instrumentation": "0.203.0", "@opentelemetry/propagator-b3": "2.0.1", "@opentelemetry/propagator-jaeger": "2.0.1", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-logs": "0.203.0", "@opentelemetry/sdk-metrics": "2.0.1", "@opentelemetry/sdk-trace-base": "2.0.1", "@opentelemetry/sdk-trace-node": "2.0.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-zRMvrZGhGVMvAbbjiNQW3eKzW/073dlrSiAKPVWmkoQzah9wfynpVPeL55f9fVIm0GaBxTLcPeukWGy0/Wj7KQ=="], - "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.3.0", "", { "dependencies": { "@opentelemetry/core": "2.3.0", "@opentelemetry/resources": "2.3.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-B0TQ2e9h0ETjpI+eGmCz8Ojb+lnYms0SE3jFwEKrN/PK4aSVHU28AAmnOoBmfub+I3jfgPwvDJgomBA5a7QehQ=="], - "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.2.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.2.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/sdk-trace-base": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-+OaRja3f0IqGG2kptVeYsrZQK9nKRSpfFrKtRBq4uh6nIB8bTBgaGvYQrQoRrQWQMA5dK5yLhDMDc0dvYvCOIQ=="], + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.3.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.3.0", "@opentelemetry/core": "2.3.0", "@opentelemetry/sdk-trace-base": "2.3.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-oGsG3vIiC8zYjOWE4CgtS6d2gQhp4pT04AI9UL1wtJOxTSNVZiiIPgHnOp/qKJSwkD4YJHSohi6inSilPmGM2Q=="], "@opentelemetry/sdk-trace-web": ["@opentelemetry/sdk-trace-web@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SS6JaSkHngcBCNdWGthzcvaKGRnDw2AeP57HyTEileLToJ7WLMeV+064iRlVyoT4+e77MRp2T2dDSrmaUyxoNg=="], @@ -1290,7 +1340,7 @@ "@smithy/config-resolver": ["@smithy/config-resolver@4.4.5", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg=="], - "@smithy/core": ["@smithy/core@3.20.0", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.8", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-WsSHCPq/neD5G/MkK4csLI5Y5Pkd9c1NMfpYEKeghSGaD4Ja1qLIohRQf2D5c1Uy5aXp76DeKHkzWZ9KAlHroQ=="], + "@smithy/core": ["@smithy/core@3.20.1", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.8", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-wOboSEdQ85dbKAJ0zL+wQ6b0HTSBRhtGa0PYKysQXkRg+vK0tdCRRVruiFM2QMprkOQwSYOnwF4og96PAaEGag=="], "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.7", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA=="], @@ -1320,9 +1370,9 @@ "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.7", "", { "dependencies": { "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg=="], - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.4.1", "", { "dependencies": { "@smithy/core": "^3.20.0", "@smithy/middleware-serde": "^4.2.8", "@smithy/node-config-provider": "^4.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-gpLspUAoe6f1M6H0u4cVuFzxZBrsGZmjx2O9SigurTx4PbntYa4AJ+o0G0oGm1L2oSX6oBhcGHwrfJHup2JnJg=="], + "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.4.2", "", { "dependencies": { "@smithy/core": "^3.20.1", "@smithy/middleware-serde": "^4.2.8", "@smithy/node-config-provider": "^4.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-mqpAdux0BNmZu/SqkFhQEnod4fX23xxTvU2LUpmKp0JpSI+kPYCiHJMmzREr8yxbNxKL2/DU1UZm9i++ayU+2g=="], - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.17", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/service-error-classification": "^4.2.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg=="], + "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.18", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/service-error-classification": "^4.2.7", "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-E5hulijA59nBk/zvcwVMaS7FG7Y4l6hWA9vrW018r+8kiZef4/ETQaPI4oY+3zsy9f6KqDv3c4VKtO4DwwgpCg=="], "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.8", "", { "dependencies": { "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w=="], @@ -1346,7 +1396,7 @@ "@smithy/signature-v4": ["@smithy/signature-v4@5.3.7", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-uri-escape": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg=="], - "@smithy/smithy-client": ["@smithy/smithy-client@4.10.2", "", { "dependencies": { "@smithy/core": "^3.20.0", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-stack": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" } }, "sha512-D5z79xQWpgrGpAHb054Fn2CCTQZpog7JELbVQ6XAvXs5MNKWf28U9gzSBlJkOyMl9LA1TZEjRtwvGXfP0Sl90g=="], + "@smithy/smithy-client": ["@smithy/smithy-client@4.10.3", "", { "dependencies": { "@smithy/core": "^3.20.1", "@smithy/middleware-endpoint": "^4.4.2", "@smithy/middleware-stack": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" } }, "sha512-EfECiO/0fAfb590LBnUe7rI5ux7XfquQ8LBzTe7gxw0j9QW/q8UT/EHWHlxV/+jhQ3+Ssga9uUYXCQgImGMbNg=="], "@smithy/types": ["@smithy/types@4.11.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA=="], @@ -1362,9 +1412,9 @@ "@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q=="], - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.16", "", { "dependencies": { "@smithy/property-provider": "^4.2.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ=="], + "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.17", "", { "dependencies": { "@smithy/property-provider": "^4.2.7", "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-dwN4GmivYF1QphnP3xJESXKtHvkkvKHSZI8GrSKMVoENVSKW2cFPRYC4ZgstYjUHdR3zwaDkIaTDIp26JuY7Cw=="], - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.19", "", { "dependencies": { "@smithy/config-resolver": "^4.4.5", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA=="], + "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.20", "", { "dependencies": { "@smithy/config-resolver": "^4.4.5", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-VD/I4AEhF1lpB3B//pmOIMBNLMrtdMXwy9yCOfa2QkJGDr63vH3RqPbSAKzoGMov3iryCxTXCxSsyGmEB8PDpg=="], "@smithy/util-endpoints": ["@smithy/util-endpoints@3.2.7", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg=="], @@ -1388,21 +1438,21 @@ "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@supabase/auth-js": ["@supabase/auth-js@2.89.0", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-wiWZdz8WMad8LQdJMWYDZ2SJtZP5MwMqzQq3ehtW2ngiI3UTgbKiFrvMUUS3KADiVlk4LiGfODB2mrYx7w2f8w=="], + "@supabase/auth-js": ["@supabase/auth-js@2.90.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-vxb66dgo6h3yyPbR06735Ps+dK3hj0JwS8w9fdQPVZQmocSTlKUW5MfxSy99mN0XqCCuLMQ3jCEiIIUU23e9ng=="], - "@supabase/functions-js": ["@supabase/functions-js@2.89.0", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-XEueaC5gMe5NufNYfBh9kPwJlP5M2f+Ogr8rvhmRDAZNHgY6mI35RCkYDijd92pMcNM7g8pUUJov93UGUnqfyw=="], + "@supabase/functions-js": ["@supabase/functions-js@2.90.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-x9mV9dF1Lam9qL3zlpP6mSM5C9iqMPtF5B/tU1Jj/F0ufX5mjDf9ghVBaErVxmrQJRL4+iMKWKY2GnODkpS8tw=="], "@supabase/node-fetch": ["@supabase/node-fetch@2.6.15", "", { "dependencies": { "whatwg-url": "^5.0.0" } }, "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ=="], - "@supabase/postgrest-js": ["@supabase/postgrest-js@2.89.0", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-/b0fKrxV9i7RNOEXMno/I1862RsYhuUo+Q6m6z3ar1f4ulTMXnDfv0y4YYxK2POcgrOXQOgKYQx1eArybyNvtg=="], + "@supabase/postgrest-js": ["@supabase/postgrest-js@2.90.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-jh6vqzaYzoFn3raaC0hcFt9h+Bt+uxNRBSdc7PfToQeRGk7PDPoweHsbdiPWREtDVTGKfu+PyPW9e2jbK+BCgQ=="], - "@supabase/realtime-js": ["@supabase/realtime-js@2.89.0", "", { "dependencies": { "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "tslib": "2.8.1", "ws": "^8.18.2" } }, "sha512-aMOvfDb2a52u6PX6jrrjvACHXGV3zsOlWRzZsTIOAJa0hOVvRp01AwC1+nLTGUzxzezejrYeCX+KnnM1xHdl+w=="], + "@supabase/realtime-js": ["@supabase/realtime-js@2.90.1", "", { "dependencies": { "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "tslib": "2.8.1", "ws": "^8.18.2" } }, "sha512-PWbnEMkcQRuor8jhObp4+Snufkq8C6fBp+MchVp2qBPY1NXk/c3Iv3YyiFYVzo0Dzuw4nAlT4+ahuPggy4r32w=="], "@supabase/ssr": ["@supabase/ssr@0.6.1", "", { "dependencies": { "cookie": "^1.0.1" }, "peerDependencies": { "@supabase/supabase-js": "^2.43.4" } }, "sha512-QtQgEMvaDzr77Mk3vZ3jWg2/y+D8tExYF7vcJT+wQ8ysuvOeGGjYbZlvj5bHYsj/SpC0bihcisnwPrM4Gp5G4g=="], - "@supabase/storage-js": ["@supabase/storage-js@2.89.0", "", { "dependencies": { "iceberg-js": "^0.8.1", "tslib": "2.8.1" } }, "sha512-6zKcXofk/M/4Eato7iqpRh+B+vnxeiTumCIP+Tz26xEqIiywzD9JxHq+udRrDuv6hXE+pmetvJd8n5wcf4MFRQ=="], + "@supabase/storage-js": ["@supabase/storage-js@2.90.1", "", { "dependencies": { "iceberg-js": "^0.8.1", "tslib": "2.8.1" } }, "sha512-GHY+Ps/K/RBfRj7kwx+iVf2HIdqOS43rM2iDOIDpapyUnGA9CCBFzFV/XvfzznGykd//z2dkGZhlZZprsVFqGg=="], - "@supabase/supabase-js": ["@supabase/supabase-js@2.89.0", "", { "dependencies": { "@supabase/auth-js": "2.89.0", "@supabase/functions-js": "2.89.0", "@supabase/postgrest-js": "2.89.0", "@supabase/realtime-js": "2.89.0", "@supabase/storage-js": "2.89.0" } }, "sha512-KlaRwSfFA0fD73PYVMHj5/iXFtQGCcX7PSx0FdQwYEEw9b2wqM7GxadY+5YwcmuEhalmjFB/YvqaoNVF+sWUlg=="], + "@supabase/supabase-js": ["@supabase/supabase-js@2.90.1", "", { "dependencies": { "@supabase/auth-js": "2.90.1", "@supabase/functions-js": "2.90.1", "@supabase/postgrest-js": "2.90.1", "@supabase/realtime-js": "2.90.1", "@supabase/storage-js": "2.90.1" } }, "sha512-U8KaKGLUgTIFHtwEW1dgw1gK7XrdpvvYo7nzzqPx721GqPe8WZbAiLh/hmyKLGBYQ/mmQNr20vU9tWSDZpii3w=="], "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="], @@ -1440,19 +1490,19 @@ "@tanstack/react-query": ["@tanstack/react-query@5.90.16", "", { "dependencies": { "@tanstack/query-core": "5.90.16" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ=="], - "@tanstack/react-router": ["@tanstack/react-router@1.145.7", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/react-store": "^0.8.0", "@tanstack/router-core": "1.145.7", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-0O+a4TjJSPXd2BsvDPwDPBKRQKYqNIBg5TAg9NzCteqJ0NXRxwohyqCksHqCEEtJe/uItwqmHoqkK4q5MDhEsA=="], + "@tanstack/react-router": ["@tanstack/react-router@1.146.2", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/react-store": "^0.8.0", "@tanstack/router-core": "1.146.2", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-Oq/shGk5nCNyK/YhB9SGByeU3wgjNVzpGoDovuOvIacE9hsicZYOv9EnII1fEku8xavqWtN8D9wr21z2CDanjA=="], - "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.145.7", "", { "dependencies": { "@tanstack/router-devtools-core": "1.145.7" }, "peerDependencies": { "@tanstack/react-router": "^1.145.7", "@tanstack/router-core": "^1.145.7", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-crzHSQ/rcGX7RfuYsmm1XG5quurNMDTIApU7jfwDx5J9HnUxCOSJrbFX0L3w0o0VRCw5xhrL2EdCnW78Ic86hg=="], + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.146.2", "", { "dependencies": { "@tanstack/router-devtools-core": "1.146.2" }, "peerDependencies": { "@tanstack/react-router": "^1.146.2", "@tanstack/router-core": "^1.146.2", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-svUw0KM9e4SjpFtsNfYsFO5y9KqfZIc7r5cTdsfletx/gOb7cF3bekPPx/JUiAu2RU7vME9R8Rs1hlJ9kraJXA=="], "@tanstack/react-store": ["@tanstack/react-store@0.8.0", "", { "dependencies": { "@tanstack/store": "0.8.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow=="], - "@tanstack/router-core": ["@tanstack/router-core@1.145.7", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/store": "^0.8.0", "cookie-es": "^2.0.0", "seroval": "^1.4.1", "seroval-plugins": "^1.4.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-v6jx6JqVUBM0/FcBq1tX22xiPq8Ufc0PDEP582/4deYoq2/RYd+bZstANp3mGSsqdxE/luhoLYuuSQiwi/j1wA=="], + "@tanstack/router-core": ["@tanstack/router-core@1.146.2", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/store": "^0.8.0", "cookie-es": "^2.0.0", "seroval": "^1.4.1", "seroval-plugins": "^1.4.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-MmTDiT6fpe+WBWYAuhp8oyzULBJX4oblm1kCqHDngf9mK3qcnNm5nkKk4d3Fk80QZmHS4DcRNFaFHKbLUVlZog=="], - "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.145.7", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "@tanstack/router-core": "^1.145.7", "csstype": "^3.0.10", "solid-js": ">=1.9.5" }, "optionalPeers": ["csstype"] }, "sha512-oKeq/6QvN49THCh++FJyPv1X65i20qGS4aJHQTNsl4cu1piW1zWUhab2L3DZVr3G8C40FW3xb6hVw92N/fzZbQ=="], + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.146.2", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "@tanstack/router-core": "^1.146.2", "csstype": "^3.0.10", "solid-js": ">=1.9.5" }, "optionalPeers": ["csstype"] }, "sha512-rIo5TEyM6uex1Zr0kHtBZu9Mwo0Aj2A84hk+UaLIBLCRpqaen6tuzjxmgNDSZ4YrgZOmixfowLObdlsuMyXTsQ=="], "@tanstack/store": ["@tanstack/store@0.8.0", "", {}, "sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ=="], - "@ts-morph/common": ["@ts-morph/common@0.22.0", "", { "dependencies": { "fast-glob": "^3.3.2", "minimatch": "^9.0.3", "mkdirp": "^3.0.1", "path-browserify": "^1.0.1" } }, "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw=="], + "@ts-morph/common": ["@ts-morph/common@0.28.1", "", { "dependencies": { "minimatch": "^10.0.1", "path-browserify": "^1.0.1", "tinyglobby": "^0.2.14" } }, "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g=="], "@types/aws-lambda": ["@types/aws-lambda@8.10.152", "", {}, "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw=="], @@ -1518,7 +1568,7 @@ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], - "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], + "@types/send": ["@types/send@1.2.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ=="], "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="], @@ -1546,11 +1596,11 @@ "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], - "ai": ["ai@6.0.13", "", { "dependencies": { "@ai-sdk/gateway": "3.0.9", "@ai-sdk/provider": "3.0.2", "@ai-sdk/provider-utils": "4.0.4", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-xBP/OoYycUAVSF0h3BuU4/EcqAyKYIhu7LB2fPIogk+w5+b42LZXtm3rNtzt5YF0/gFScArLTxs6dhtLQuC48Q=="], + "ai": ["ai@6.0.23", "", { "dependencies": { "@ai-sdk/gateway": "3.0.10", "@ai-sdk/provider": "3.0.2", "@ai-sdk/provider-utils": "4.0.4", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-IV8hqp6sQvZ0XVlu8bCnFlwG7+2d40ff26RZ1k4yw/zVuk2F6SXlONURtTo9vwPOPYeF7auXvyPA+dMDoepWxg=="], "ai-v5": ["ai@5.0.97", "", { "dependencies": { "@ai-sdk/gateway": "2.0.12", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8zBx0b/owis4eJI2tAlV8a1Rv0BANmLxontcAelkLNwEHhgfgXeKpDkhNB6OgV+BJSwboIUDkgd9312DdJnCOQ=="], - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], @@ -1578,7 +1628,7 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.9.11", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.13", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ=="], "bidc": ["bidc@0.0.3", "", {}, "sha512-stoXSIDBnqJhquTf0fNNoEfz2JfFCVXADoIim9c5QjWB7CoK3353ZtnJSydPNfzTLoeYuV5/0QNuSz34nSRSag=="], @@ -1588,7 +1638,7 @@ "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], - "body-parser": ["body-parser@2.2.1", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw=="], + "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], "bowser": ["bowser@2.13.1", "", {}, "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw=="], @@ -1612,7 +1662,7 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "caniuse-lite": ["caniuse-lite@1.0.30001762", "", {}, "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001763", "", {}, "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ=="], "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], @@ -1638,7 +1688,7 @@ "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], - "code-block-writer": ["code-block-writer@12.0.0", "", {}, "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w=="], + "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="], "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], @@ -1658,6 +1708,8 @@ "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], + "content-scraper": ["content-scraper@workspace:content-scraper"], + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], @@ -1686,6 +1738,8 @@ "deco-cli": ["deco-cli@0.28.6", "", { "dependencies": { "@deco-cx/warp-node": "0.3.16", "@modelcontextprotocol/sdk": "1.25.1", "@supabase/ssr": "0.6.1", "@supabase/supabase-js": "2.50.0", "chalk": "^5.3.0", "commander": "^12.0.0", "glob": "^10.3.10", "ignore": "^7.0.5", "inquirer": "^9.2.15", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "jose": "^6.0.11", "json-schema-to-typescript": "^15.0.4", "object-hash": "^3.0.0", "prettier": "^3.6.2", "semver": "^7.6.0", "smol-toml": "^1.3.4", "zod": "^3.25.76" }, "bin": { "deco": "dist/cli.js", "deconfig": "dist/deconfig.js" } }, "sha512-IwdfHoZfrLVGTVULBJ2NRjEkD9dZafJSf3qYsZeer7CR5owQ1XLnDAKIwd/c6iwLZB6+2zrMjL4RNWhF2SzZbw=="], + "deco-llm": ["deco-llm@workspace:deco-llm"], + "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], @@ -1842,6 +1896,8 @@ "goober": ["goober@2.1.18", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw=="], + "google-big-query": ["google-big-query@workspace:google-big-query"], + "google-calendar": ["google-calendar@workspace:google-calendar"], "google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], @@ -1874,7 +1930,7 @@ "iceberg-js": ["iceberg-js@0.8.1", "", {}, "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA=="], - "iconv-lite": ["iconv-lite@0.7.1", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw=="], + "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], @@ -1942,7 +1998,7 @@ "json-schema-to-zod": ["json-schema-to-zod@2.7.0", "", { "bin": { "json-schema-to-zod": "dist/cjs/cli.js" } }, "sha512-eW59l3NQ6sa3HcB+Ahf7pP6iGU7MY4we5JsPqXQ2ZcIPF8QxSg/lkY8lN0Js/AG0NjMbk+nZGUfHlceiHF+bwQ=="], - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], @@ -1998,8 +2054,6 @@ "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - "mcp-content-scraper": ["mcp-content-scraper@workspace:content-scraper"], - "mcp-studio": ["mcp-studio@workspace:mcp-studio"], "mcp-template-minimal": ["mcp-template-minimal@workspace:template-minimal"], @@ -2026,7 +2080,7 @@ "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - "miniflare": ["miniflare@4.20251210.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20251210.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-k6kIoXwGVqlPZb0hcn+X7BmnK+8BjIIkusQPY22kCo2RaQJ/LzAjtxHQdGXerlHSnJyQivDQsL6BJHMpQfUFyw=="], + "miniflare": ["miniflare@4.20260107.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20260107.1", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "^3.25.76" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-X93sXczqbBq9ixoM6jnesmdTqp+4baVC/aM/DuPpRS0LK0XtcqaO75qPzNEvDEzBAHxwMAWRIum/9hg32YB8iA=="], "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], @@ -2076,8 +2130,6 @@ "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], - "openrouter": ["openrouter@workspace:openrouter"], - "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], @@ -2360,7 +2412,7 @@ "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], - "ts-morph": ["ts-morph@21.0.1", "", { "dependencies": { "@ts-morph/common": "~0.22.0", "code-block-writer": "^12.0.0" } }, "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg=="], + "ts-morph": ["ts-morph@27.0.2", "", { "dependencies": { "@ts-morph/common": "~0.28.1", "code-block-writer": "^13.0.3" } }, "sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -2420,9 +2472,9 @@ "whisper": ["whisper@workspace:whisper"], - "workerd": ["workerd@1.20251210.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20251210.0", "@cloudflare/workerd-darwin-arm64": "1.20251210.0", "@cloudflare/workerd-linux-64": "1.20251210.0", "@cloudflare/workerd-linux-arm64": "1.20251210.0", "@cloudflare/workerd-windows-64": "1.20251210.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-9MUUneP1BnRE9XAYi94FXxHmiLGbO75EHQZsgWqSiOXjoXSqJCw8aQbIEPxCy19TclEl/kHUFYce8ST2W+Qpjw=="], + "workerd": ["workerd@1.20260107.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260107.1", "@cloudflare/workerd-darwin-arm64": "1.20260107.1", "@cloudflare/workerd-linux-64": "1.20260107.1", "@cloudflare/workerd-linux-arm64": "1.20260107.1", "@cloudflare/workerd-windows-64": "1.20260107.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-4ylAQJDdJZdMAUl2SbJgTa77YHpa88l6qmhiuCLNactP933+rifs7I0w1DslhUIFgydArUX5dNLAZnZhT7Bh7g=="], - "wrangler": ["wrangler@4.54.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.1", "@cloudflare/unenv-preset": "2.7.13", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", "miniflare": "4.20251210.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20251210.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20251210.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-bANFsjDwJLbprYoBK+hUDZsVbUv2SqJd8QvArLIcZk+fPq4h/Ohtj5vkKXD3k0s2bD1DXLk08D+hYmeNH+xC6A=="], + "wrangler": ["wrangler@4.58.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.1", "@cloudflare/unenv-preset": "2.8.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", "miniflare": "4.20260107.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260107.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260107.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-Jm6EYtlt8iUcznOCPSMYC54DYkwrMNESzbH0Vh3GFHv/7XVw5gBC13YJAB+nWMRGJ+6B2dMzy/NVQS4ONL51Pw=="], "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], @@ -2452,7 +2504,7 @@ "zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + "zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], "zod-from-json-schema-v3": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], @@ -2514,16 +2566,10 @@ "@deco-cx/warp-node/undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="], - "@deco/mcp/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "@deco-cx/warp-node/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], "@deco/mcp/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@decocms/bindings/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - - "@decocms/bindings/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], - - "@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], @@ -2538,6 +2584,8 @@ "@jsr/deco__codemod-toolkit/@jsr/std__semver": ["@jsr/std__semver@1.0.7", "https://npm.jsr.io/~/11/@jsr/std__semver/1.0.7.tgz", {}, "sha512-/WpDSNegE6lI50L1+VnItLkuuQlZK8e8QbxrjV1sH+3YqiH+sQ/Tx3yYvewkKVVSwcidQUlqSIHSPrhay1zLCg=="], + "@jsr/deco__codemod-toolkit/ts-morph": ["ts-morph@21.0.1", "", { "dependencies": { "@ts-morph/common": "~0.22.0", "code-block-writer": "^12.0.0" } }, "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg=="], + "@jsr/deco__deco/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.52.1", "", { "dependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A=="], "@jsr/deco__deco/@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", "@opentelemetry/otlp-transformer": "0.52.1", "@opentelemetry/sdk-logs": "0.52.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA=="], @@ -2604,10 +2652,6 @@ "@mastra/schema-compat/ai": ["ai@5.0.97", "", { "dependencies": { "@ai-sdk/gateway": "2.0.12", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8zBx0b/owis4eJI2tAlV8a1Rv0BANmLxontcAelkLNwEHhgfgXeKpDkhNB6OgV+BJSwboIUDkgd9312DdJnCOQ=="], - "@mastra/schema-compat/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], - - "@modelcontextprotocol/sdk/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@openrouter/ai-sdk-provider/@openrouter/sdk": ["@openrouter/sdk@0.1.27", "", { "dependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ=="], "@openrouter/ai-sdk-provider/ai": ["ai@5.0.97", "", { "dependencies": { "@ai-sdk/gateway": "2.0.12", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8zBx0b/owis4eJI2tAlV8a1Rv0BANmLxontcAelkLNwEHhgfgXeKpDkhNB6OgV+BJSwboIUDkgd9312DdJnCOQ=="], @@ -2740,16 +2784,20 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@ts-morph/common/minimatch": ["minimatch@10.1.1", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="], + + "@types/serve-static/@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], + "ai-v5/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.12", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@vercel/oidc": "3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-W+cB1sOWvPcz9qiIsNtD+HxUrBUva2vWv2K1EFukuImX+HA0uZx3EyyOjhYQ9gtf/teqEG80M6OvJ7xx/VLV2A=="], "ai-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw=="], - "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "apify/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], + "apify/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "apify/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], @@ -2762,15 +2810,19 @@ "concurrently/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "content-scraper/deco-cli": ["deco-cli@0.26.0", "", { "dependencies": { "@deco-cx/warp-node": "0.3.16", "@modelcontextprotocol/sdk": "^1.19.1", "@supabase/ssr": "0.6.1", "@supabase/supabase-js": "2.50.0", "chalk": "^5.3.0", "commander": "^12.0.0", "glob": "^10.3.10", "ignore": "^7.0.5", "inquirer": "^9.2.15", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "jose": "^6.0.11", "json-schema-to-typescript": "^15.0.4", "object-hash": "^3.0.0", "prettier": "^3.6.2", "semver": "^7.6.0", "smol-toml": "^1.3.4", "ws": "^8.16.0", "zod": "^3.25.76" }, "bin": { "deco": "dist/cli.js", "deconfig": "dist/deconfig.js" } }, "sha512-fkYKYO81cK3NE4hb3zcPdMksKJiYM2mon0lKGBuvEOruVUfbhK0I7V777NZDrmaxVQXxDx0fa9i6fARjxT7muQ=="], + "data-for-seo/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], + "data-for-seo/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "data-for-seo/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "datajud/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], - "datajud/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "datajud/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], - "deco-cli/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "datajud/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], @@ -2790,15 +2842,9 @@ "gemini-pro-vision/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], - "gemini-pro-vision/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "google-calendar/@decocms/runtime": ["@decocms/runtime@1.1.0", "", { "dependencies": { "@ai-sdk/provider": "^2.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.3", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-+kacx94Oj1zNetWkg6aRDdAUaAIqXufP1T6j6JqnDRjRCpZeSkW8GU1Sp2mfCw4KDo/XbeB5jPzFKSHfUKH8JQ=="], + "gemini-pro-vision/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], - "google-calendar/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - - "google-tag-manager/@decocms/runtime": ["@decocms/runtime@1.1.0", "", { "dependencies": { "@ai-sdk/provider": "^2.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.3", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-+kacx94Oj1zNetWkg6aRDdAUaAIqXufP1T6j6JqnDRjRCpZeSkW8GU1Sp2mfCw4KDo/XbeB5jPzFKSHfUKH8JQ=="], - - "google-tag-manager/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "gemini-pro-vision/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "inquirer-search-checkbox/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], @@ -2810,56 +2856,54 @@ "log-symbols/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "mcp-content-scraper/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - - "mcp-content-scraper/deco-cli": ["deco-cli@0.26.0", "", { "dependencies": { "@deco-cx/warp-node": "0.3.16", "@modelcontextprotocol/sdk": "^1.19.1", "@supabase/ssr": "0.6.1", "@supabase/supabase-js": "2.50.0", "chalk": "^5.3.0", "commander": "^12.0.0", "glob": "^10.3.10", "ignore": "^7.0.5", "inquirer": "^9.2.15", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "jose": "^6.0.11", "json-schema-to-typescript": "^15.0.4", "object-hash": "^3.0.0", "prettier": "^3.6.2", "semver": "^7.6.0", "smol-toml": "^1.3.4", "ws": "^8.16.0", "zod": "^3.25.76" }, "bin": { "deco": "dist/cli.js", "deconfig": "dist/deconfig.js" } }, "sha512-fkYKYO81cK3NE4hb3zcPdMksKJiYM2mon0lKGBuvEOruVUfbhK0I7V777NZDrmaxVQXxDx0fa9i6fARjxT7muQ=="], - - "mcp-studio/@decocms/runtime": ["@decocms/runtime@1.1.0", "", { "dependencies": { "@ai-sdk/provider": "^2.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.3", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-+kacx94Oj1zNetWkg6aRDdAUaAIqXufP1T6j6JqnDRjRCpZeSkW8GU1Sp2mfCw4KDo/XbeB5jPzFKSHfUKH8JQ=="], - - "mcp-studio/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "mcp-template-minimal/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "mcp-template-minimal/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "mcp-template-minimal/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "mcp-template-with-view/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "mcp-template-with-view/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "mcp-template-with-view/lucide-react": ["lucide-react@0.476.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-x6cLTk8gahdUPje0hSgLN1/MgiJH+Xl90Xoxy9bkPAsMPOUiyRSKR4JCDPGVCEpyqnZXH3exFWNItcvra9WzUQ=="], "mcp-template-with-view/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "meta-ads/@decocms/runtime": ["@decocms/runtime@1.1.0", "", { "dependencies": { "@ai-sdk/provider": "^2.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.3", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-+kacx94Oj1zNetWkg6aRDdAUaAIqXufP1T6j6JqnDRjRCpZeSkW8GU1Sp2mfCw4KDo/XbeB5jPzFKSHfUKH8JQ=="], - - "meta-ads/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - "miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + "miniflare/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "nanobanana/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "nanobanana/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "nanobanana/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "object-storage/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "object-storage/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "object-storage/lucide-react": ["lucide-react@0.476.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-x6cLTk8gahdUPje0hSgLN1/MgiJH+Xl90Xoxy9bkPAsMPOUiyRSKR4JCDPGVCEpyqnZXH3exFWNItcvra9WzUQ=="], "object-storage/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "openrouter/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "ora/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "path-scurry/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], + "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "perplexity/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], + "perplexity/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "perplexity/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "pinecone/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "pinecone/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "pinecone/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "pino-pretty/pino-abstract-transport": ["pino-abstract-transport@3.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg=="], @@ -2868,24 +2912,22 @@ "readonly-sql/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "readonly-sql/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "readonly-sql/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "reddit/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], - "reddit/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "reddit/deco-cli": ["deco-cli@0.26.0", "", { "dependencies": { "@deco-cx/warp-node": "0.3.16", "@modelcontextprotocol/sdk": "^1.19.1", "@supabase/ssr": "0.6.1", "@supabase/supabase-js": "2.50.0", "chalk": "^5.3.0", "commander": "^12.0.0", "glob": "^10.3.10", "ignore": "^7.0.5", "inquirer": "^9.2.15", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "jose": "^6.0.11", "json-schema-to-typescript": "^15.0.4", "object-hash": "^3.0.0", "prettier": "^3.6.2", "semver": "^7.6.0", "smol-toml": "^1.3.4", "ws": "^8.16.0", "zod": "^3.25.76" }, "bin": { "deco": "dist/cli.js", "deconfig": "dist/deconfig.js" } }, "sha512-fkYKYO81cK3NE4hb3zcPdMksKJiYM2mon0lKGBuvEOruVUfbhK0I7V777NZDrmaxVQXxDx0fa9i6fARjxT7muQ=="], "reddit/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "registry/@decocms/runtime": ["@decocms/runtime@1.1.0", "", { "dependencies": { "@ai-sdk/provider": "^2.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.3", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-+kacx94Oj1zNetWkg6aRDdAUaAIqXufP1T6j6JqnDRjRCpZeSkW8GU1Sp2mfCw4KDo/XbeB5jPzFKSHfUKH8JQ=="], - - "registry/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "registry/@types/node": ["@types/node@22.19.3", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], "replicate/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "replicate/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "replicate/replicate": ["replicate@1.4.0", "", { "optionalDependencies": { "readable-stream": ">=4.0.0" } }, "sha512-1ufKejfUVz/azy+5TnzQP7U1+MHVWZ6psnQ06az8byUUnRhT+DZ/MvewzB1NQYBVMgNKR7xPDtTwlcP5nv/5+w=="], "replicate/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -2900,6 +2942,8 @@ "sora/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "sora/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "sora/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], @@ -2908,18 +2952,20 @@ "veo/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "veo/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "veo/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "whisper/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], + "whisper/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "whisper/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "wrangler/esbuild": ["esbuild@0.27.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.0", "@esbuild/android-arm": "0.27.0", "@esbuild/android-arm64": "0.27.0", "@esbuild/android-x64": "0.27.0", "@esbuild/darwin-arm64": "0.27.0", "@esbuild/darwin-x64": "0.27.0", "@esbuild/freebsd-arm64": "0.27.0", "@esbuild/freebsd-x64": "0.27.0", "@esbuild/linux-arm": "0.27.0", "@esbuild/linux-arm64": "0.27.0", "@esbuild/linux-ia32": "0.27.0", "@esbuild/linux-loong64": "0.27.0", "@esbuild/linux-mips64el": "0.27.0", "@esbuild/linux-ppc64": "0.27.0", "@esbuild/linux-riscv64": "0.27.0", "@esbuild/linux-s390x": "0.27.0", "@esbuild/linux-x64": "0.27.0", "@esbuild/netbsd-arm64": "0.27.0", "@esbuild/netbsd-x64": "0.27.0", "@esbuild/openbsd-arm64": "0.27.0", "@esbuild/openbsd-x64": "0.27.0", "@esbuild/openharmony-arm64": "0.27.0", "@esbuild/sunos-x64": "0.27.0", "@esbuild/win32-arm64": "0.27.0", "@esbuild/win32-ia32": "0.27.0", "@esbuild/win32-x64": "0.27.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA=="], "youch/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], - "zod-from-json-schema/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "zod-from-json-schema-v3/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "@a2a-js/sdk/express/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], @@ -2958,20 +3004,16 @@ "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "@deco/mcp/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "@deco/mcp/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - - "@decocms/bindings/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "@jsr/deco__codemod-toolkit/ts-morph/@ts-morph/common": ["@ts-morph/common@0.22.0", "", { "dependencies": { "fast-glob": "^3.3.2", "minimatch": "^9.0.3", "mkdirp": "^3.0.1", "path-browserify": "^1.0.1" } }, "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw=="], + + "@jsr/deco__codemod-toolkit/ts-morph/code-block-writer": ["code-block-writer@12.0.0", "", {}, "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w=="], + "@jsr/deco__deco/@opentelemetry/exporter-logs-otlp-http/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], "@jsr/deco__deco/@opentelemetry/exporter-logs-otlp-http/@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-logs": "0.52.1", "@opentelemetry/sdk-metrics": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg=="], @@ -3048,27 +3090,39 @@ "ai-v5/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.0.5", "", {}, "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw=="], - "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "apify/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "apify/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "apify/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "apify/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "cloudflare/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], "concurrently/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "content-scraper/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], + + "content-scraper/deco-cli/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + + "content-scraper/deco-cli/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "data-for-seo/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "data-for-seo/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "data-for-seo/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "datajud/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "datajud/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "deco-cli/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "datajud/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], - "deco-cli/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "datajud/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "deco-cli/@supabase/supabase-js/@supabase/auth-js": ["@supabase/auth-js@2.70.0", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg=="], @@ -3084,17 +3138,9 @@ "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "google-calendar/@decocms/runtime/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "google-calendar/@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.3", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5" } }, "sha512-0qGrAcH74Td9Ruhx7SI31o9mvKlMeQGtiRf5BzDcSgG0cvgJhaMMSvz72tvbUVl77GLu93v02NlKupui8yeiMw=="], - - "google-calendar/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "google-tag-manager/@decocms/runtime/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], + "gemini-pro-vision/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], - "google-tag-manager/@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.3", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5" } }, "sha512-0qGrAcH74Td9Ruhx7SI31o9mvKlMeQGtiRf5BzDcSgG0cvgJhaMMSvz72tvbUVl77GLu93v02NlKupui8yeiMw=="], - - "google-tag-manager/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "gemini-pro-vision/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "inquirer-search-checkbox/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], @@ -3138,41 +3184,37 @@ "log-symbols/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "mcp-content-scraper/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], - - "mcp-content-scraper/deco-cli/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "mcp-studio/@decocms/runtime/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "mcp-studio/@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.3", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5" } }, "sha512-0qGrAcH74Td9Ruhx7SI31o9mvKlMeQGtiRf5BzDcSgG0cvgJhaMMSvz72tvbUVl77GLu93v02NlKupui8yeiMw=="], - - "mcp-studio/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "mcp-template-minimal/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "mcp-template-minimal/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "mcp-template-minimal/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "mcp-template-with-view/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "meta-ads/@decocms/runtime/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "meta-ads/@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.3", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5" } }, "sha512-0qGrAcH74Td9Ruhx7SI31o9mvKlMeQGtiRf5BzDcSgG0cvgJhaMMSvz72tvbUVl77GLu93v02NlKupui8yeiMw=="], + "mcp-template-with-view/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], - "meta-ads/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "mcp-template-with-view/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "nanobanana/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "nanobanana/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "nanobanana/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "object-storage/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "object-storage/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "openrouter/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "object-storage/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "object-storage/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "ora/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -3180,27 +3222,33 @@ "perplexity/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "perplexity/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "perplexity/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "pinecone/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "pinecone/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "pinecone/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "pinecone/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "readonly-sql/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "reddit/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - - "reddit/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "readonly-sql/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], - "reddit/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "readonly-sql/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - "reddit/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], + "reddit/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "registry/@decocms/runtime/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], + "reddit/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], - "registry/@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.3", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5" } }, "sha512-0qGrAcH74Td9Ruhx7SI31o9mvKlMeQGtiRf5BzDcSgG0cvgJhaMMSvz72tvbUVl77GLu93v02NlKupui8yeiMw=="], + "reddit/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], - "registry/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "reddit/deco-cli/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], "registry/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], @@ -3208,18 +3256,34 @@ "replicate/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "replicate/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "replicate/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "sora/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "sora/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "sora/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "sora/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "veo/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "veo/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "veo/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "veo/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "whisper/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], "whisper/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "whisper/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "whisper/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A=="], "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.0", "", { "os": "android", "cpu": "arm" }, "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ=="], @@ -3294,12 +3358,6 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - "@deco/mcp/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "@decocms/bindings/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "@mastra/schema-compat/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.0.5", "", {}, "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw=="], "@openrouter/ai-sdk-provider-v5/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.0.5", "", {}, "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw=="], @@ -3330,10 +3388,20 @@ "apify/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "apify/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "apify/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "apify/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/auth-js": ["@supabase/auth-js@2.70.0", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg=="], + + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/functions-js": ["@supabase/functions-js@2.4.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA=="], + + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/postgrest-js": ["@supabase/postgrest-js@1.19.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw=="], + + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/realtime-js": ["@supabase/realtime-js@2.11.10", "", { "dependencies": { "@supabase/node-fetch": "^2.6.13", "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "ws": "^8.18.2" } }, "sha512-SJKVa7EejnuyfImrbzx+HaD9i6T784khuw1zP+MBD7BmJYChegGxYigPzkKX8CK8nGuDntmeSD3fvriaH0EGZA=="], + + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/storage-js": ["@supabase/storage-js@2.7.1", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA=="], + "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3358,10 +3426,10 @@ "data-for-seo/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "data-for-seo/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "datajud/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "datajud/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3386,11 +3454,9 @@ "datajud/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "datajud/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "datajud/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "deco-cli/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "datajud/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], @@ -3418,17 +3484,9 @@ "gemini-pro-vision/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "google-calendar/@decocms/runtime/@decocms/bindings/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "google-calendar/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "google-tag-manager/@decocms/runtime/@decocms/bindings/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "google-tag-manager/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "gemini-pro-vision/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "inquirer-search-checkbox/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], @@ -3450,22 +3508,6 @@ "inquirer-search-list/inquirer/strip-ansi/ansi-regex": ["ansi-regex@3.0.1", "", {}, "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="], - "mcp-content-scraper/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/auth-js": ["@supabase/auth-js@2.70.0", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/functions-js": ["@supabase/functions-js@2.4.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/postgrest-js": ["@supabase/postgrest-js@1.19.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/realtime-js": ["@supabase/realtime-js@2.11.10", "", { "dependencies": { "@supabase/node-fetch": "^2.6.13", "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "ws": "^8.18.2" } }, "sha512-SJKVa7EejnuyfImrbzx+HaD9i6T784khuw1zP+MBD7BmJYChegGxYigPzkKX8CK8nGuDntmeSD3fvriaH0EGZA=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/storage-js": ["@supabase/storage-js@2.7.1", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA=="], - - "mcp-studio/@decocms/runtime/@decocms/bindings/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "mcp-studio/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "mcp-template-minimal/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "mcp-template-minimal/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3490,10 +3532,10 @@ "mcp-template-minimal/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "mcp-template-minimal/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "mcp-template-with-view/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "mcp-template-with-view/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3518,13 +3560,9 @@ "mcp-template-with-view/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "meta-ads/@decocms/runtime/@decocms/bindings/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "meta-ads/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "mcp-template-with-view/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "nanobanana/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], @@ -3550,10 +3588,10 @@ "nanobanana/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "nanobanana/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "object-storage/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "object-storage/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3578,11 +3616,9 @@ "object-storage/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "object-storage/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "object-storage/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "openrouter/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "object-storage/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "perplexity/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], @@ -3608,10 +3644,10 @@ "perplexity/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "perplexity/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "perplexity/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "perplexity/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "pinecone/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "pinecone/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3636,10 +3672,10 @@ "pinecone/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "pinecone/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "pinecone/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "pinecone/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "readonly-sql/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "readonly-sql/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3664,10 +3700,10 @@ "readonly-sql/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "readonly-sql/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "reddit/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "reddit/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3692,8 +3728,6 @@ "reddit/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "reddit/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "reddit/deco-cli/@supabase/supabase-js/@supabase/auth-js": ["@supabase/auth-js@2.70.0", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg=="], "reddit/deco-cli/@supabase/supabase-js/@supabase/functions-js": ["@supabase/functions-js@2.4.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA=="], @@ -3704,10 +3738,6 @@ "reddit/deco-cli/@supabase/supabase-js/@supabase/storage-js": ["@supabase/storage-js@2.7.1", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA=="], - "registry/@decocms/runtime/@decocms/bindings/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "registry/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "replicate/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3732,10 +3762,10 @@ "replicate/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "replicate/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "replicate/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "replicate/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "sora/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "sora/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3760,10 +3790,10 @@ "sora/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "sora/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "sora/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "sora/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "veo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "veo/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3788,10 +3818,10 @@ "veo/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "veo/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "veo/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "veo/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "whisper/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "whisper/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3816,10 +3846,10 @@ "whisper/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "whisper/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "whisper/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "whisper/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "apify/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "apify/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -3854,8 +3884,6 @@ "apify/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "apify/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -3890,8 +3918,6 @@ "data-for-seo/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "datajud/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "datajud/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -3926,8 +3952,6 @@ "datajud/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "datajud/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "gemini-pro-vision/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "gemini-pro-vision/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -3962,8 +3986,6 @@ "gemini-pro-vision/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "inquirer-search-checkbox/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], "inquirer-search-checkbox/inquirer/cli-cursor/restore-cursor/onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], @@ -3976,8 +3998,6 @@ "inquirer-search-list/inquirer/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - "mcp-template-minimal/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "mcp-template-minimal/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4012,8 +4032,6 @@ "mcp-template-minimal/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "mcp-template-with-view/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "mcp-template-with-view/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4048,8 +4066,6 @@ "mcp-template-with-view/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "nanobanana/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "nanobanana/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4084,8 +4100,6 @@ "nanobanana/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "object-storage/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "object-storage/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4120,8 +4134,6 @@ "object-storage/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "object-storage/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "perplexity/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "perplexity/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4156,8 +4168,6 @@ "perplexity/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "perplexity/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "pinecone/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "pinecone/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4192,8 +4202,6 @@ "pinecone/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "pinecone/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "readonly-sql/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "readonly-sql/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4228,8 +4236,6 @@ "readonly-sql/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "reddit/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "reddit/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4264,8 +4270,6 @@ "reddit/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "reddit/deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4300,8 +4304,6 @@ "replicate/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "replicate/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "sora/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "sora/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4336,8 +4338,6 @@ "sora/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "sora/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "veo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "veo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4372,8 +4372,6 @@ "veo/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "veo/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "whisper/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "whisper/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4408,8 +4406,6 @@ "whisper/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "whisper/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "apify/@decocms/runtime/@mastra/core/@mastra/schema-compat/zod-from-json-schema/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], "apify/@decocms/runtime/@mastra/core/@openrouter/ai-sdk-provider-v5/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.12", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@vercel/oidc": "3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-W+cB1sOWvPcz9qiIsNtD+HxUrBUva2vWv2K1EFukuImX+HA0uZx3EyyOjhYQ9gtf/teqEG80M6OvJ7xx/VLV2A=="], diff --git a/cloudflare-docs/README.md b/cloudflare-docs/README.md new file mode 100644 index 00000000..c91c2b79 --- /dev/null +++ b/cloudflare-docs/README.md @@ -0,0 +1,43 @@ +# Cloudflare Docs MCP Server Official + +This is the **official Cloudflare Docs MCP Server**, provided directly by the Cloudflare team for accessing documentation. + +## About Cloudflare Docs + +Cloudflare Docs provides comprehensive documentation for all Cloudflare products and services. With this official MCP, you can: + +- 📚 **Search Documentation** - Find documentation through natural language queries +- 💡 **Get Help** - Get instant answers about Cloudflare products +- 🔍 **API Reference** - Access API documentation and examples +- 📖 **Guides & Tutorials** - Find step-by-step guides +- 🛠️ **Troubleshooting** - Get help resolving issues +- 🤝 **Official Integration** - Direct support and features maintained by the Cloudflare team + +## Connection + +This MCP connects to the official Cloudflare Docs server at: + +``` +https://docs.mcp.cloudflare.com/sse +``` + +## How to Use + +1. Install this MCP through the registry +2. Start asking questions about Cloudflare products +3. Get instant access to documentation and examples + +## Official Resources + +- 🌐 Website: [developers.cloudflare.com](https://developers.cloudflare.com) +- 📚 Documentation: [developers.cloudflare.com/docs](https://developers.cloudflare.com/docs) +- 🆘 Support: Contact through official Cloudflare support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Cloudflare team. + +--- + +*This MCP provides public access to Cloudflare documentation.* + diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json new file mode 100644 index 00000000..dff529ea --- /dev/null +++ b/cloudflare-docs/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "cloudflare", + "name": "cloudflare-docs-mcp", + "friendlyName": "Cloudflare Docs", + "connection": { + "type": "HTTP", + "url": "https://docs.mcp.cloudflare.com/sse" + }, + "description": "Access Cloudflare's comprehensive documentation through natural language. Search, query, and get help with Cloudflare products and APIs instantly.", + "icon": "https://www.cloudflare.com/favicon.ico", + "unlisted": false, + "metadata": { + "categories": ["Documentation"], + "official": true, + "mesh_unlisted": true, + "tags": ["documentation", "api-reference", "guides", "tutorials", "cloudflare", "learning", "support", "knowledge-base"], + "short_description": "Access Cloudflare's comprehensive documentation through natural language", + "mesh_description": "Cloudflare Docs MCP provides intelligent access to Cloudflare's extensive documentation covering all products and services. This official documentation assistant helps you find information about Workers, Pages, R2 Storage, D1 Database, Queues, Durable Objects, KV, Stream, Images, CDN, DNS, SSL/TLS, WAF, DDoS Protection, Load Balancing, Argo, Spectrum, Magic Transit, and more. Search through detailed API references with code examples in multiple languages, step-by-step tutorials for common use cases, best practices guides, troubleshooting documentation, and architectural patterns. The MCP uses semantic search to understand your questions and provide contextually relevant answers, combining information from multiple documentation pages when needed. Get instant access to product limits, pricing details, feature comparisons, migration guides, security recommendations, and performance optimization tips. Perfect for developers building on Cloudflare's platform, the MCP can explain complex concepts, suggest solutions to problems, and guide you through configuration steps with clear, actionable information." + } +} diff --git a/cloudflare-observability/README.md b/cloudflare-observability/README.md new file mode 100644 index 00000000..2420c64f --- /dev/null +++ b/cloudflare-observability/README.md @@ -0,0 +1,43 @@ +# Cloudflare Observability MCP Server Official + +This is the **official Cloudflare Observability MCP Server**, provided directly by the Cloudflare team for monitoring and analytics. + +## About Cloudflare Observability + +Cloudflare Observability provides comprehensive monitoring and analytics for your Cloudflare services. With this official MCP, you can: + +- 📊 **Analytics** - Access real-time analytics and insights +- 📝 **Logs** - Query and analyze logs from Workers, WAF, and other services +- 📈 **Metrics** - Monitor performance metrics and trends +- 🔍 **Traces** - Analyze request traces and performance +- ⚠️ **Alerts** - Configure and manage alerting +- 🤝 **Official Integration** - Direct support and features maintained by the Cloudflare team + +## Connection + +This MCP connects to the official Cloudflare Observability server at: + +``` +https://observability.mcp.cloudflare.com/sse +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Cloudflare API credentials when prompted +3. Start monitoring your services with AI assistance + +## Official Resources + +- 🌐 Website: [cloudflare.com/products/cloudflare-logs](https://www.cloudflare.com/products/cloudflare-logs) +- 📚 Documentation: [developers.cloudflare.com/analytics](https://developers.cloudflare.com/analytics) +- 🆘 Support: Contact through official Cloudflare support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Cloudflare team. + +--- + +*This MCP requires an active Cloudflare account to function.* + diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json new file mode 100644 index 00000000..c042a14f --- /dev/null +++ b/cloudflare-observability/app.json @@ -0,0 +1,21 @@ +{ + "scopeName": "cloudflare", + "name": "cloudflare-observability-mcp", + "friendlyName": "Cloudflare Observability", + "connection": { + "type": "HTTP", + "url": "https://observability.mcp.cloudflare.com/sse" + }, + "description": "Monitor and analyze your Cloudflare services with comprehensive observability tools. Access logs, metrics, analytics, and traces through natural language.", + "icon": "https://www.cloudflare.com/favicon.ico", + "unlisted": false, + "metadata": { + "categories": ["Observability"], + "official": true, + "mesh_unlisted": true, + "tags": ["monitoring", "logs", "analytics", "metrics", "tracing", "cloudflare", "observability", "performance", "debugging"], + "short_description": "Monitor and analyze your Cloudflare services with comprehensive observability tools", + "mesh_description": "Cloudflare Observability provides enterprise-grade monitoring and analytics for all Cloudflare services including Workers, CDN, WAF, and Load Balancers. This official MCP enables you to access real-time logs from Workers, HTTP requests, firewall events, and DDoS attacks. Query and analyze performance metrics such as request latency, bandwidth usage, error rates, and cache hit ratios across global data centers. The platform offers distributed tracing capabilities to track requests across your entire application stack, helping identify bottlenecks and optimize performance. Access Web Analytics for visitor insights, GraphQL Analytics API for custom queries, and Logpush integration for streaming logs to external systems. Use natural language to configure alerting rules, create custom dashboards, analyze traffic patterns, investigate security incidents, and generate compliance reports. The MCP simplifies complex queries and provides AI-powered insights to help you understand your application's behavior and user experience." + } +} + diff --git a/cloudflare-workers/README.md b/cloudflare-workers/README.md new file mode 100644 index 00000000..0a97035b --- /dev/null +++ b/cloudflare-workers/README.md @@ -0,0 +1,43 @@ +# Cloudflare Workers MCP Server Official + +This is the **official Cloudflare Workers MCP Server**, provided directly by the Cloudflare team for integration with Cloudflare Workers platform. + +## About Cloudflare Workers + +Cloudflare Workers is a serverless platform that lets you deploy code instantly across the globe. With this official MCP, you can: + +- ⚡ **Deploy Functions** - Deploy and manage serverless functions at the edge +- 🗄️ **KV Management** - Interact with Workers KV key-value storage +- 🔄 **Durable Objects** - Manage stateful objects and coordination +- 🔗 **Bindings** - Configure and manage Workers bindings +- 📊 **Monitor Performance** - Check metrics and logs +- 🤝 **Official Integration** - Direct support and features maintained by the Cloudflare team + +## Connection + +This MCP connects to the official Cloudflare Workers server at: + +``` +https://bindings.mcp.cloudflare.com/sse +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Cloudflare API credentials when prompted +3. Start managing your Workers with AI assistance + +## Official Resources + +- 🌐 Website: [workers.cloudflare.com](https://workers.cloudflare.com) +- 📚 Documentation: [developers.cloudflare.com/workers](https://developers.cloudflare.com/workers) +- 🆘 Support: Contact through official Cloudflare support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Cloudflare team. + +--- + +*This MCP requires an active Cloudflare account to function.* + diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json new file mode 100644 index 00000000..89fe2c5e --- /dev/null +++ b/cloudflare-workers/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "cloudflare", + "name": "cloudflare-workers-mcp", + "friendlyName": "Cloudflare Workers", + "connection": { + "type": "HTTP", + "url": "https://bindings.mcp.cloudflare.com/sse" + }, + "description": "Deploy and manage serverless functions at the edge with Cloudflare Workers. Interact with Workers, KV, Durable Objects, and bindings through natural language.", + "icon": "https://www.cloudflare.com/favicon.ico", + "unlisted": false, + "metadata": { + "categories": ["Software Development"], + "official": true, + "mesh_unlisted": true, + "tags": ["serverless", "edge-computing", "javascript", "workers", "kv", "durable-objects", "cloudflare", "deployment", "functions"], + "short_description": "Deploy and manage serverless functions at the edge with Cloudflare Workers", + "mesh_description": "Cloudflare Workers is a serverless platform that enables developers to deploy and run code at the edge, across Cloudflare's global network of data centers. With this official MCP, you can manage Workers, interact with Workers KV (key-value storage), configure Durable Objects for stateful applications, and manage bindings between different Cloudflare services. The platform supports JavaScript, TypeScript, Python, and Rust, allowing you to build highly scalable and performant applications that run close to your users. Workers can handle millions of requests per second with sub-millisecond latency, making them ideal for API gateways, middleware, authentication, A/B testing, and edge rendering. The MCP provides natural language access to deployment workflows, environment variables, routes configuration, and real-time monitoring of your Workers performance and usage metrics." + } +} diff --git a/content-scraper/app.json b/content-scraper/app.json index 40daaa31..9237c9ff 100644 --- a/content-scraper/app.json +++ b/content-scraper/app.json @@ -8,5 +8,12 @@ }, "description": "Scrape web content from URLs using n8n workflow automation.", "icon": "https://assets.decocache.com/mcp/content-scraper-icon.svg", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": ["Data Extraction"], + "official": false, + "tags": ["scraping", "web-scraping", "content-extraction", "automation", "n8n", "data-collection"], + "short_description": "Scrape web content from URLs using n8n workflow automation.", + "mesh_description": "The Content Scraper MCP provides powerful web scraping capabilities powered by n8n workflow automation, enabling AI agents to extract structured and unstructured content from websites. This MCP supports scraping HTML content, extracting specific elements using CSS selectors or XPath, handling JavaScript-rendered pages, following pagination, and processing dynamic content. It includes built-in features for rate limiting, user-agent rotation, proxy support, and anti-bot detection bypass. The integration leverages n8n's workflow engine for complex scraping scenarios including multi-step extraction, data transformation, and conditional logic. Perfect for market research, competitive intelligence, content aggregation, price monitoring, lead generation, or any application requiring automated web data collection. Supports various output formats and can handle single-page scraping or bulk URL processing. Ideal for building data pipelines, research tools, or content monitoring systems." + } } diff --git a/content-scraper/package.json b/content-scraper/package.json index b88de3b6..c0641cd6 100644 --- a/content-scraper/package.json +++ b/content-scraper/package.json @@ -14,7 +14,7 @@ "build": "bun run build:server" }, "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.3", "@supabase/supabase-js": "^2.49.0", "zod": "^4.0.0" }, diff --git a/deco-llm/.gitignore b/deco-llm/.gitignore new file mode 100644 index 00000000..babca1bb --- /dev/null +++ b/deco-llm/.gitignore @@ -0,0 +1 @@ +.dev.vars diff --git a/deco-llm/app.json b/deco-llm/app.json new file mode 100644 index 00000000..55f2f1f2 --- /dev/null +++ b/deco-llm/app.json @@ -0,0 +1,12 @@ +{ + "scopeName": "deco", + "name": "llm", + "friendlyName": "Deco AI Gateway", + "connection": { + "type": "HTTP", + "url": "https://sites-deco-llm.decocache.com/mcp" + }, + "description": "Deco LLM App Connection for LLM uses.", + "icon": "https://assets.decocache.com/mcp/6e1418f7-c962-406b-aceb-137197902709/ai-gateway.png", + "unlisted": false +} \ No newline at end of file diff --git a/deco-llm/package.json b/deco-llm/package.json new file mode 100644 index 00000000..470fae4f --- /dev/null +++ b/deco-llm/package.json @@ -0,0 +1,40 @@ +{ + "name": "deco-llm", + "version": "1.0.0", + "description": "Deco LLM App Connection for LLM uses.", + "private": true, + "type": "module", + "scripts": { + "dev": "bun run --hot server/main.ts", + "build:server": "NODE_ENV=production bun build server/main.ts --target=bun --outfile=dist/server/main.js", + "build": "bun run build:server", + "publish": "cat app.json | deco registry publish -w /shared/deco -y", + "check": "tsc --noEmit" + }, + "dependencies": { + "@ai-sdk/provider": "^3.0.2", + "@ai-sdk/provider-utils": "^4.0.4", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.3", + "@openrouter/ai-sdk-provider": "^1.5.4", + "@openrouter/sdk": "^0.3.11", + "ai": "^6.0.3", + "zod": "^4.0.0" + }, + "devDependencies": { + "@cloudflare/vite-plugin": "^1.13.4", + "@cloudflare/workers-types": "^4.20251014.0", + "@decocms/mcps-shared": "1.0.0", + "@decocms/openrouter": "1.0.0", + "@mastra/core": "^0.24.0", + "@modelcontextprotocol/sdk": "1.25.1", + "@types/mime-db": "^1.43.6", + "deco-cli": "^0.28.0", + "typescript": "^5.7.2", + "vite": "7.2.0", + "wrangler": "^4.28.0" + }, + "engines": { + "node": ">=22.0.0" + } +} \ No newline at end of file diff --git a/deco-llm/server/main.ts b/deco-llm/server/main.ts new file mode 100644 index 00000000..82fabc2e --- /dev/null +++ b/deco-llm/server/main.ts @@ -0,0 +1,104 @@ +/** + * OpenRouter MCP Server + * + * This MCP provides tools for interacting with OpenRouter's API, + * including model discovery, comparison, and AI chat completions. + * + * OpenRouter offers a unified API for accessing hundreds of AI models + * with built-in fallback mechanisms, cost optimization, and provider routing. + */ +import type { Registry } from "@decocms/mcps-shared/registry"; +import { serve } from "@decocms/mcps-shared/serve"; +import { tools } from "@decocms/openrouter/tools"; +import { BindingOf, type DefaultEnv, withRuntime } from "@decocms/runtime"; +import { z } from "zod"; +import { calculatePreAuthAmount, toMicrodollars } from "./usage"; + +export const StateSchema = z.object({ + WALLET: BindingOf("@deco/wallet"), +}); + +/** + * Environment type combining Deco bindings and Cloudflare Workers context + */ +export type Env = DefaultEnv; + +interface OpenRouterUsageReport { + providerMetadata: { + openrouter: { + usage: { + cost: number; + }; + }; + }; +} +const isOpenRouterUsageReport = ( + usage: unknown | OpenRouterUsageReport, +): usage is OpenRouterUsageReport => { + return ( + typeof usage === "object" && + usage !== null && + "providerMetadata" in usage && + typeof usage.providerMetadata === "object" && + usage.providerMetadata !== null && + "openrouter" in usage.providerMetadata && + typeof usage.providerMetadata.openrouter === "object" && + usage.providerMetadata.openrouter !== null && + "usage" in usage.providerMetadata.openrouter && + typeof usage.providerMetadata.openrouter.usage === "object" && + usage.providerMetadata.openrouter.usage !== null && + "cost" in usage.providerMetadata.openrouter.usage + ); +}; + +const runtime = withRuntime< + DefaultEnv, + typeof StateSchema, + Registry +>({ + tools: (env) => { + return tools(env, { + start: async (modelInfo, params) => { + const amount = calculatePreAuthAmount(modelInfo, params); + + const { id } = + await env.MESH_REQUEST_CONTEXT.state.WALLET.PRE_AUTHORIZE_AMOUNT({ + amount, + metadata: { + modelId: modelInfo.id, + params: params, + }, + }); + return { + end: async (usage) => { + if (!isOpenRouterUsageReport(usage)) { + throw new Error("Usage cost not found"); + } + const vendorId = process.env.WALLET_VENDOR_ID ?? "deco"; + await env.MESH_REQUEST_CONTEXT.state.WALLET.COMMIT_PRE_AUTHORIZED_AMOUNT( + { + identifier: id, + contractId: + env.MESH_REQUEST_CONTEXT.connectionId ?? + env.MESH_REQUEST_CONTEXT.state.WALLET.value, + vendorId, + amount: toMicrodollars( + usage.providerMetadata.openrouter.usage.cost, + ), + }, + ); + }, + }; + }, + }); + }, + configuration: { + state: StateSchema, + scopes: [ + "WALLET::PRE_AUTHORIZE_AMOUNT", + "WALLET::COMMIT_PRE_AUTHORIZED_AMOUNT", + ], + }, +}); + +serve(runtime.fetch); diff --git a/deco-llm/server/usage.ts b/deco-llm/server/usage.ts new file mode 100644 index 00000000..93274ee7 --- /dev/null +++ b/deco-llm/server/usage.ts @@ -0,0 +1,44 @@ +import type { LanguageModelInputSchema } from "@decocms/bindings/llm"; +import type { ModelInfo } from "@decocms/openrouter/types"; +import type { z } from "zod"; + +export interface GenerationContext { + model: ModelInfo; +} + +const DEFAULT_MAX_COMPLETION_TOKENS = 1000000; + +export const toMicrodollars = (amount: number): string => { + return Math.round(amount * 1_000_000).toString(); +}; +/** + * + * @param model - The model to calculate the pre-auth amount for + * @param params - The parameters for the language model + * @returns The pre-auth amount in microdollars + */ +export const calculatePreAuthAmount = ( + model: ModelInfo, + params: z.infer, +): string => { + const maxContextLength = Math.min( + JSON.stringify({ + ...params.callOptions.prompt, + ...params.callOptions.tools, + }).length, + model.context_length, + ); + + const maxCompletionTokens = + params.callOptions.maxOutputTokens ?? + model.top_provider?.max_completion_tokens ?? + DEFAULT_MAX_COMPLETION_TOKENS; + + const constPerCompletionToken = parseFloat(model.pricing.completion); + const constPerPromptToken = parseFloat(model.pricing.prompt); + + const amountUsd = + maxContextLength * constPerPromptToken + + maxCompletionTokens * constPerCompletionToken; + return toMicrodollars(amountUsd); +}; diff --git a/deco-llm/tsconfig.json b/deco-llm/tsconfig.json new file mode 100644 index 00000000..63f6f70b --- /dev/null +++ b/deco-llm/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2023", "ES2024", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "allowJs": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + + /* Path Aliases */ + "baseUrl": ".", + "paths": { + "shared/*": ["./shared/*"], + "server/*": ["./server/*"], + "worker/*": ["./worker/*"] + }, + + /* Types */ + "types": ["@cloudflare/workers-types"] + }, + "include": [ + "server", + "shared", + "vite.config.ts" + ] +} diff --git a/digitalocean-apps/README.md b/digitalocean-apps/README.md new file mode 100644 index 00000000..99530b7b --- /dev/null +++ b/digitalocean-apps/README.md @@ -0,0 +1,44 @@ +# DigitalOcean Apps MCP Server Official + +This is the **official DigitalOcean Apps MCP Server**, provided directly by the DigitalOcean team for integration with the DigitalOcean App Platform. + +## About DigitalOcean Apps + +DigitalOcean App Platform is a Platform as a Service (PaaS) that enables developers to build, deploy, and scale apps quickly. With this official MCP, you can: + +- 🚀 **Deploy Applications** - Deploy and manage your apps through natural language +- 📊 **Monitor Performance** - Check app status, metrics, and logs +- ⚡ **Scale Resources** - Adjust app resources and configurations +- 🔄 **Manage Deployments** - Control deployment workflows and rollbacks +- 🛠️ **App Configuration** - Update environment variables and settings +- 🤝 **Official Integration** - Direct support and features maintained by the DigitalOcean team + +## Connection + +This MCP connects to the official DigitalOcean Apps server at: + +``` +https://apps.mcp.digitalocean.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your DigitalOcean API token when prompted +3. Start managing your apps with AI assistance + +## Official Resources + +- 🌐 Website: [digitalocean.com/products/app-platform](https://www.digitalocean.com/products/app-platform) +- 📚 Documentation: [docs.digitalocean.com/products/app-platform](https://docs.digitalocean.com/products/app-platform) +- 📖 MCP Announcement: [digitalocean.com/blog/remote-mcp-server](https://www.digitalocean.com/blog/remote-mcp-server) +- 🆘 Support: Contact through official DigitalOcean support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the DigitalOcean team. + +--- + +*This MCP requires an active DigitalOcean account and API token to function.* + diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json new file mode 100644 index 00000000..f23b406f --- /dev/null +++ b/digitalocean-apps/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "digitalocean", + "name": "digitalocean-apps-mcp", + "friendlyName": "DigitalOcean Apps", + "connection": { + "type": "HTTP", + "url": "https://apps.mcp.digitalocean.com/mcp" + }, + "description": "Deploy and manage applications on DigitalOcean App Platform. Deploy, monitor, and scale your apps with AI assistance through natural language.", + "icon": "https://www.digitalocean.com/_next/static/media/logo.0f4b57fd.svg", + "unlisted": false, + "metadata": { + "categories": ["Software Development"], + "official": true, + "mesh_unlisted": true, + "tags": ["deployment", "paas", "containers", "hosting", "digitalocean", "ci-cd", "scaling", "app-platform", "devops"], + "short_description": "Deploy and manage applications on DigitalOcean App Platform", + "mesh_description": "DigitalOcean App Platform is a fully managed Platform as a Service (PaaS) that simplifies deploying and scaling applications. This official MCP enables you to deploy apps directly from GitHub, GitLab, or container registries with automatic builds and deployments. Manage containerized applications, static sites, and backend services with zero infrastructure management. The platform automatically provisions SSL certificates, provides built-in CDN, handles horizontal and vertical scaling, and offers zero-downtime deployments with automatic rollback capabilities. Configure environment variables, secrets, and build parameters through natural language commands. Monitor your applications with real-time metrics, access logs, and performance insights. Set up custom domains with automatic DNS configuration, manage deployment regions across multiple data centers, and configure health checks and alerts. The MCP supports Node.js, Python, Go, PHP, Ruby, and Docker-based applications, with built-in support for popular frameworks like Next.js, Django, Rails, and Laravel. Perfect for developers who want to focus on code rather than infrastructure management." + } +} diff --git a/digitalocean-databases/README.md b/digitalocean-databases/README.md new file mode 100644 index 00000000..3a0d7f14 --- /dev/null +++ b/digitalocean-databases/README.md @@ -0,0 +1,52 @@ +# DigitalOcean Databases MCP Server Official + +This is the **official DigitalOcean Databases MCP Server**, provided directly by the DigitalOcean team for integration with DigitalOcean Managed Databases. + +## About DigitalOcean Managed Databases + +DigitalOcean Managed Databases provide fully managed database solutions for PostgreSQL, MySQL, Redis, and MongoDB. With this official MCP, you can: + +- 🗄️ **Database Management** - Create and manage database clusters through natural language +- 📊 **Monitor Performance** - Check database metrics, connections, and health +- 🔧 **Configuration** - Update database settings and configurations +- 👥 **User Management** - Manage database users and permissions +- 💾 **Backup & Recovery** - Control backup schedules and restore operations +- 🔒 **Security** - Manage firewall rules and trusted sources +- 🤝 **Official Integration** - Direct support and features maintained by the DigitalOcean team + +## Supported Databases + +- PostgreSQL +- MySQL +- Redis +- MongoDB + +## Connection + +This MCP connects to the official DigitalOcean Databases server at: + +``` +https://databases.mcp.digitalocean.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your DigitalOcean API token when prompted +3. Start managing your databases with AI assistance + +## Official Resources + +- 🌐 Website: [digitalocean.com/products/managed-databases](https://www.digitalocean.com/products/managed-databases) +- 📚 Documentation: [docs.digitalocean.com/products/databases](https://docs.digitalocean.com/products/databases) +- 📖 MCP Announcement: [digitalocean.com/blog/remote-mcp-server](https://www.digitalocean.com/blog/remote-mcp-server) +- 🆘 Support: Contact through official DigitalOcean support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the DigitalOcean team. + +--- + +*This MCP requires an active DigitalOcean account and API token to function.* + diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json new file mode 100644 index 00000000..c7415e4c --- /dev/null +++ b/digitalocean-databases/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "digitalocean", + "name": "digitalocean-databases-mcp", + "friendlyName": "DigitalOcean Databases", + "connection": { + "type": "HTTP", + "url": "https://databases.mcp.digitalocean.com/mcp" + }, + "description": "Manage DigitalOcean managed databases through natural language. Create, configure, and monitor PostgreSQL, MySQL, Redis, and MongoDB databases with AI assistance.", + "icon": "https://www.digitalocean.com/_next/static/media/logo.0f4b57fd.svg", + "unlisted": false, + "metadata": { + "categories": ["Database"], + "official": true, + "mesh_unlisted": true, + "tags": ["database", "postgresql", "mysql", "redis", "mongodb", "managed-database", "digitalocean", "backup", "scaling"], + "short_description": "Manage DigitalOcean managed databases through natural language", + "mesh_description": "DigitalOcean Managed Databases provide fully managed, highly available database solutions for PostgreSQL, MySQL, Redis, MongoDB, and OpenSearch. This official MCP allows you to create and manage database clusters with automatic failover, daily backups, and point-in-time recovery. Scale vertically by adjusting CPU and RAM, or horizontally by adding read replicas for improved read performance. The platform handles maintenance windows, security patches, and minor version upgrades automatically. Configure connection pooling for PostgreSQL to optimize connection management, set up trusted sources and firewall rules for security, and enable SSL/TLS encryption for data in transit. Monitor database performance with real-time metrics including CPU usage, memory consumption, disk I/O, connection count, and query performance. Manage database users and permissions, configure replication lag monitoring, and set up automated backup schedules with retention policies. The MCP supports database migrations, schema changes, and provides query optimization suggestions. Access advanced features like PostgreSQL extensions, MySQL custom parameters, Redis persistence modes, and MongoDB sharding configuration through intuitive natural language commands." + } +} diff --git a/exa-search/README.md b/exa-search/README.md new file mode 100644 index 00000000..747f89d4 --- /dev/null +++ b/exa-search/README.md @@ -0,0 +1,43 @@ +# Exa Search MCP Server Official + +This is the **official Exa Search MCP Server**, provided directly by the Exa team for integration with Exa's AI-powered search engine. + +## About Exa Search + +Exa is an AI-powered search engine designed to find high-quality, relevant content. With this official MCP, you can: + +- 🔍 **Semantic Search** - Search with natural language understanding +- 📊 **Content Discovery** - Find high-quality articles, papers, and resources +- 🎯 **Precise Results** - Get accurate, relevant search results +- 🌐 **Web Crawling** - Access comprehensive web data +- 💡 **AI-Powered** - Leverage AI for better search understanding +- 🤝 **Official Integration** - Direct support and features maintained by the Exa team + +## Connection + +This MCP connects to the official Exa Search server at: + +``` +https://mcp.exa.ai/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Exa API key when prompted +3. Start searching with AI-powered semantic understanding + +## Official Resources + +- 🌐 Website: [exa.ai](https://exa.ai) +- 📚 Documentation: [docs.exa.ai](https://docs.exa.ai) +- 🆘 Support: Contact through official Exa support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Exa team. + +--- + +*This MCP requires an active Exa API key to function.* + diff --git a/exa-search/app.json b/exa-search/app.json new file mode 100644 index 00000000..5d48a75d --- /dev/null +++ b/exa-search/app.json @@ -0,0 +1,19 @@ +{ + "scopeName": "exa", + "name": "exa-search-mcp", + "friendlyName": "Exa Search", + "connection": { + "type": "HTTP", + "url": "https://mcp.exa.ai/mcp" + }, + "description": "AI-powered semantic search engine for finding high-quality content. Search the web with natural language understanding and get relevant results instantly.", + "icon": "https://assets.decocache.com/decocms/3638f940-f5b8-463f-8724-f092c82d1f4c/exa.jpeg", + "unlisted": false, + "metadata": { + "categories": ["Search"], + "official": true, + "tags": ["search", "ai-search", "semantic-search", "web-search", "research", "exa", "knowledge", "discovery", "nlp"], + "short_description": "AI-powered semantic search engine for finding high-quality content", + "mesh_description": "Exa is an AI-powered search engine designed specifically for LLMs and AI applications, providing semantic search capabilities that understand the meaning and context of queries rather than just matching keywords. This official MCP enables you to search the web using natural language queries that understand intent, find similar content based on examples, and discover high-quality articles, research papers, and authoritative sources. Unlike traditional search engines, Exa uses neural embeddings to understand semantic relationships between concepts, allowing you to find content even when the exact keywords don't match. Search by similarity - provide a URL or text sample and find similar content across the web. Filter results by domain, publication date, content type, and authority scores. Access cleaned, structured content without ads, popups, or irrelevant information. Use Exa for research tasks like competitive analysis, market research, academic literature review, and trend discovery. Find expert opinions, technical documentation, case studies, and data-driven articles. The search engine is optimized for factual accuracy and source reliability, making it ideal for AI applications that need trustworthy information. Perfect for building RAG systems, research assistants, content discovery tools, and knowledge management applications that require high-quality web content with semantic understanding." + } +} diff --git a/github-mcp-server/README.md b/github-mcp-server/README.md new file mode 100644 index 00000000..28c60584 --- /dev/null +++ b/github-mcp-server/README.md @@ -0,0 +1,43 @@ +# GitHub MCP Server Official + +This is the **official GitHub MCP Server**, provided directly by the GitHub team for integration with the GitHub platform through Model Context Protocol. + +## About GitHub MCP Server + +GitHub MCP Server is the official Model Context Protocol server from GitHub that allows AI tools, agents, and assistants to interact directly with the GitHub platform. With this official MCP, you can: + +- 📂 **Repository Management** - Read and interact with GitHub repositories +- 🐛 **Issues & Pull Requests** - Manage issues and pull requests through natural language +- 🔍 **Code Analysis** - Analyze code and repository structure +- ⚙️ **Workflow Automation** - Automate GitHub workflows and actions +- 💬 **Natural Language Interface** - Interact with GitHub using natural language +- 🤝 **Official Integration** - Direct support and features maintained by the GitHub team + +## Connection + +This MCP connects to the official GitHub MCP server at: + +``` +https://api.githubcopilot.com/mcp/ +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your GitHub credentials when prompted +3. Start using the tools provided by GitHub MCP Server + +## Official Resources + +- 🌐 GitHub: [github.com/github/github-mcp-server](https://github.com/github/github-mcp-server) +- 📚 Documentation: [docs.github.com](https://docs.github.com) +- 🆘 Support: Contact through official GitHub support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the GitHub team. + +--- + +*This MCP requires an active GitHub account to function.* + diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json new file mode 100644 index 00000000..93d6c42a --- /dev/null +++ b/github-mcp-server/app.json @@ -0,0 +1,19 @@ +{ + "scopeName": "github", + "name": "github-mcp-server", + "friendlyName": "GitHub", + "connection": { + "type": "HTTP", + "url": "https://api.githubcopilot.com/mcp/" + }, + "description": "Interact with GitHub platform through natural language. Manage repositories, issues, pull requests, analyze code, and automate workflows with AI assistance.", + "icon": "https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png", + "unlisted": false, + "metadata": { + "categories": ["Developer Tools"], + "official": true, + "tags": ["version-control", "git", "github", "repositories", "code-review", "ci-cd", "collaboration", "open-source", "devops"], + "short_description": "Interact with GitHub platform through natural language", + "mesh_description": "GitHub is the world's leading software development platform with over 100 million developers collaborating on open source and private projects. This official MCP Server enables natural language interaction with GitHub's comprehensive features including repository management, code hosting, and version control. Create and manage repositories with README files, .gitignore templates, and licenses. Handle issues and bugs with labels, milestones, assignees, and project boards for agile workflows. Review and merge pull requests with inline comments, suggested changes, code reviews, and automated checks. Manage branches, tags, and releases with semantic versioning and release notes. Configure GitHub Actions for CI/CD pipelines with automated testing, building, and deployment workflows. Set up branch protection rules, required reviews, and status checks for code quality. Use GitHub Projects for kanban boards and roadmap planning. Manage team access with organizations, teams, and granular repository permissions. Access code search to find specific functions, patterns, or files across repositories. Use GitHub Packages for hosting and managing Docker containers and software packages. Configure webhooks and integrations with third-party services. Access GitHub API for advanced automation and custom integrations. Perfect for development teams managing codebases, coordinating releases, and maintaining high code quality through collaborative workflows." +} +} diff --git a/google-ads/.gitignore b/google-ads/.gitignore new file mode 100644 index 00000000..9cd80b03 --- /dev/null +++ b/google-ads/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +.env +.dev.vars + diff --git a/google-ads/README.md b/google-ads/README.md new file mode 100644 index 00000000..45716f53 --- /dev/null +++ b/google-ads/README.md @@ -0,0 +1,253 @@ +# Google Ads MCP + +MCP (Model Context Protocol) server for Google Ads API v18. Manage campaigns, ad groups, ads, keywords, and get performance reports. + +## Features + +- **Account Management**: List accessible customers, get customer details +- **Campaign Management**: List, create, update, pause, and enable campaigns +- **Ad Group Management**: List, create, update, pause, and enable ad groups +- **Ad Management**: List, create responsive search ads, pause, and enable ads +- **Keyword Management**: List, create, update, pause, enable, and remove keywords (including negative keywords) +- **Performance Reports**: Account, campaign, ad group, and keyword performance metrics + +## Authentication + +This MCP uses OAuth 2.0 with PKCE for authentication. Users will be redirected to Google to authorize access to their Google Ads accounts. + +### Required OAuth Scope + +``` +https://www.googleapis.com/auth/adwords +``` + +### Environment Variables + +```bash +GOOGLE_CLIENT_ID=your_google_client_id +GOOGLE_CLIENT_SECRET=your_google_client_secret +``` + +## Tools + +### Account Tools + +| Tool | Description | +|------|-------------| +| `list_accessible_customers` | List all Google Ads customer accounts accessible by the authenticated user | +| `get_customer` | Get detailed information about a specific customer account | + +### Campaign Tools + +| Tool | Description | +|------|-------------| +| `list_campaigns` | List all campaigns for a customer account (optionally filter by status) | +| `get_campaign` | Get detailed information about a specific campaign | +| `create_campaign` | Create a new campaign with budget | +| `update_campaign` | Update campaign settings (name, dates, network settings) | +| `pause_campaign` | Pause a campaign | +| `enable_campaign` | Enable a campaign | + +### Ad Group Tools + +| Tool | Description | +|------|-------------| +| `list_ad_groups` | List ad groups (optionally filter by campaign) | +| `get_ad_group` | Get detailed information about a specific ad group | +| `create_ad_group` | Create a new ad group in a campaign | +| `update_ad_group` | Update ad group settings (name, bids) | +| `pause_ad_group` | Pause an ad group | +| `enable_ad_group` | Enable an ad group | + +### Ad Tools + +| Tool | Description | +|------|-------------| +| `list_ads` | List ads (optionally filter by ad group) | +| `get_ad` | Get detailed information about a specific ad | +| `create_responsive_search_ad` | Create a new Responsive Search Ad (RSA) | +| `pause_ad` | Pause an ad | +| `enable_ad` | Enable an ad | + +### Keyword Tools + +| Tool | Description | +|------|-------------| +| `list_keywords` | List keywords (optionally filter by ad group) | +| `get_keyword` | Get detailed information about a specific keyword | +| `create_keyword` | Add a new keyword to an ad group | +| `create_negative_keyword` | Add a negative keyword to block certain searches | +| `update_keyword` | Update keyword settings (status, bid, URLs) | +| `pause_keyword` | Pause a keyword | +| `enable_keyword` | Enable a keyword | +| `remove_keyword` | Permanently remove a keyword | + +### Report Tools + +| Tool | Description | +|------|-------------| +| `get_account_performance` | Get overall account performance metrics | +| `get_campaign_performance` | Get campaign performance with daily breakdown | +| `get_ad_group_performance` | Get ad group performance metrics | +| `get_keyword_performance` | Get keyword performance metrics | + +## Usage Examples + +### List accessible customers + +```json +{ + "tool": "list_accessible_customers", + "input": {} +} +``` + +### Create a Search campaign + +```json +{ + "tool": "create_campaign", + "input": { + "customerId": "1234567890", + "name": "My Search Campaign", + "advertisingChannelType": "SEARCH", + "budgetAmountMicros": "10000000", + "status": "PAUSED", + "targetGoogleSearch": true, + "targetSearchNetwork": true + } +} +``` + +### Create an ad group + +```json +{ + "tool": "create_ad_group", + "input": { + "customerId": "1234567890", + "campaignResourceName": "customers/1234567890/campaigns/9876543210", + "name": "Brand Keywords", + "cpcBidMicros": "1000000" + } +} +``` + +### Create a Responsive Search Ad + +```json +{ + "tool": "create_responsive_search_ad", + "input": { + "customerId": "1234567890", + "adGroupResourceName": "customers/1234567890/adGroups/1111111111", + "finalUrls": ["https://example.com/landing-page"], + "headlines": [ + "Buy Running Shoes", + "Free Shipping Available", + "Top Brands on Sale" + ], + "descriptions": [ + "Shop our wide selection of running shoes. Free returns.", + "Get the best deals on athletic footwear. Order now!" + ], + "path1": "shoes", + "path2": "running" + } +} +``` + +### Add a keyword + +```json +{ + "tool": "create_keyword", + "input": { + "customerId": "1234567890", + "adGroupResourceName": "customers/1234567890/adGroups/1111111111", + "text": "running shoes", + "matchType": "PHRASE", + "cpcBidMicros": "500000" + } +} +``` + +### Get campaign performance + +```json +{ + "tool": "get_campaign_performance", + "input": { + "customerId": "1234567890", + "dateRange": "LAST_30_DAYS" + } +} +``` + +## Date Range Presets + +For reports, you can use the following date range presets: + +- `TODAY` +- `YESTERDAY` +- `LAST_7_DAYS` +- `LAST_14_DAYS` +- `LAST_30_DAYS` +- `LAST_90_DAYS` +- `THIS_WEEK_SUN_TODAY` +- `THIS_WEEK_MON_TODAY` +- `LAST_WEEK_SUN_SAT` +- `LAST_WEEK_MON_SUN` +- `THIS_MONTH` +- `LAST_MONTH` +- `ALL_TIME` + +## Money Values + +All monetary values in Google Ads API are in **micros** (1/1,000,000 of the currency unit): + +- $1.00 = 1,000,000 micros +- $0.50 = 500,000 micros +- $10.00 = 10,000,000 micros + +## Resource Names + +Google Ads uses resource names to identify entities: + +- Customer: `customers/1234567890` +- Campaign: `customers/1234567890/campaigns/9876543210` +- Campaign Budget: `customers/1234567890/campaignBudgets/1111111111` +- Ad Group: `customers/1234567890/adGroups/2222222222` +- Ad Group Ad: `customers/1234567890/adGroupAds/2222222222~3333333333` +- Ad Group Criterion (Keyword): `customers/1234567890/adGroupCriteria/2222222222~4444444444` + +## Development + +### Install dependencies + +```bash +bun install +``` + +### Run locally + +```bash +bun run dev +``` + +### Build + +```bash +bun run build +``` + +### Type check + +```bash +bun run check +``` + +## License + +MIT + diff --git a/google-ads/app.json b/google-ads/app.json new file mode 100644 index 00000000..46438a07 --- /dev/null +++ b/google-ads/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "deco", + "name": "google-ads", + "friendlyName": "Google Ads", + "connection": { + "type": "HTTP", + "url": "https://sites-google-ads.decocache.com/mcp" + }, + "description": "Manage Google Ads campaigns, ad groups, ads, keywords, and get performance reports via API.", + "icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Google_Ads_logo.svg/1200px-Google_Ads_logo.svg.png", + "unlisted": false, + "metadata": { + "categories": ["Advertising"], + "official": false, + "tags": ["google", "ads", "advertising", "ppc", "campaigns", "marketing", "sem"], + "short_description": "Manage Google Ads campaigns, ad groups, ads, keywords, and get performance reports via API.", + "mesh_description": "The Google Ads MCP provides comprehensive integration with Google Ads API, enabling programmatic management of advertising campaigns at scale. This MCP allows AI agents and automation systems to create, read, update, and manage Google Ads resources including campaigns, ad groups, ads, keywords, and bidding strategies. It supports complete campaign management workflows, from creating new campaigns with targeting settings to monitoring performance with detailed reporting. The integration enables automated campaign optimization, bulk ad operations, keyword research and management, budget allocation, and performance analytics. Perfect for marketing agencies, advertisers, and businesses who need to manage advertising at scale, automate campaign operations across multiple accounts, or integrate Google Ads management into their marketing automation workflows. Supports all major Google Ads resource types and enables advanced automation scenarios for campaign optimization, A/B testing, and ROI tracking." + } +} + diff --git a/google-ads/package.json b/google-ads/package.json new file mode 100644 index 00000000..35343088 --- /dev/null +++ b/google-ads/package.json @@ -0,0 +1,28 @@ +{ + "name": "google-ads", + "version": "1.0.0", + "description": "Google Ads MCP Server - Manage campaigns, ad groups, ads, keywords, and get performance reports", + "private": true, + "type": "module", + "scripts": { + "dev": "bun run --hot server/main.ts", + "build:server": "NODE_ENV=production bun build server/main.ts --target=bun --outfile=dist/server/main.js", + "build": "bun run build:server", + "publish": "cat app.json | deco registry publish -w /shared/deco -y", + "check": "tsc --noEmit" + }, + "dependencies": { + "@decocms/runtime": "^1.1.0", + "zod": "^4.0.0" + }, + "devDependencies": { + "@decocms/mcps-shared": "workspace:*", + "@modelcontextprotocol/sdk": "1.25.1", + "deco-cli": "^0.28.0", + "typescript": "^5.7.2" + }, + "engines": { + "node": ">=22.0.0" + } +} + diff --git a/google-ads/server/constants.ts b/google-ads/server/constants.ts new file mode 100644 index 00000000..b8a764ee --- /dev/null +++ b/google-ads/server/constants.ts @@ -0,0 +1,443 @@ +/** + * Google Ads API constants and configuration + */ + +/** + * Google Ads API version + */ +export const GOOGLE_ADS_API_VERSION = "v18" as const; + +/** + * Google Ads API base URL + */ +export const GOOGLE_ADS_API_BASE = + `https://googleads.googleapis.com/${GOOGLE_ADS_API_VERSION}` as const; + +/** + * API Endpoints for Google Ads + */ +export const ENDPOINTS = { + /** + * List accessible customers for the authenticated user + * GET https://googleads.googleapis.com/v18/customers:listAccessibleCustomers + */ + LIST_ACCESSIBLE_CUSTOMERS: `${GOOGLE_ADS_API_BASE}/customers:listAccessibleCustomers`, + + /** + * Get customer details + * @param customerId - The customer ID (e.g., "1234567890") + */ + CUSTOMER: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}`, + + /** + * Search with GAQL query + * POST https://googleads.googleapis.com/v18/customers/{customerId}/googleAds:search + * @param customerId - The customer ID + */ + SEARCH: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/googleAds:search`, + + /** + * Search stream with GAQL query (for large result sets) + * POST https://googleads.googleapis.com/v18/customers/{customerId}/googleAds:searchStream + * @param customerId - The customer ID + */ + SEARCH_STREAM: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/googleAds:searchStream`, + + /** + * Mutate campaigns + * POST https://googleads.googleapis.com/v18/customers/{customerId}/campaigns:mutate + * @param customerId - The customer ID + */ + CAMPAIGNS_MUTATE: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/campaigns:mutate`, + + /** + * Mutate campaign budgets + * POST https://googleads.googleapis.com/v18/customers/{customerId}/campaignBudgets:mutate + * @param customerId - The customer ID + */ + CAMPAIGN_BUDGETS_MUTATE: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/campaignBudgets:mutate`, + + /** + * Mutate ad groups + * POST https://googleads.googleapis.com/v18/customers/{customerId}/adGroups:mutate + * @param customerId - The customer ID + */ + AD_GROUPS_MUTATE: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/adGroups:mutate`, + + /** + * Mutate ad group ads + * POST https://googleads.googleapis.com/v18/customers/{customerId}/adGroupAds:mutate + * @param customerId - The customer ID + */ + AD_GROUP_ADS_MUTATE: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/adGroupAds:mutate`, + + /** + * Mutate ad group criteria (keywords, etc.) + * POST https://googleads.googleapis.com/v18/customers/{customerId}/adGroupCriteria:mutate + * @param customerId - The customer ID + */ + AD_GROUP_CRITERIA_MUTATE: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/adGroupCriteria:mutate`, +}; + +/** + * Default page size for queries + */ +export const DEFAULT_PAGE_SIZE = 1000 as const; + +/** + * Campaign status values + */ +export const CAMPAIGN_STATUS = { + ENABLED: "ENABLED", + PAUSED: "PAUSED", + REMOVED: "REMOVED", +} as const; + +/** Type for campaign status values */ +export type CampaignStatusValue = + (typeof CAMPAIGN_STATUS)[keyof typeof CAMPAIGN_STATUS]; + +/** + * Ad group status values + */ +export const AD_GROUP_STATUS = { + ENABLED: "ENABLED", + PAUSED: "PAUSED", + REMOVED: "REMOVED", +} as const; + +/** Type for ad group status values */ +export type AdGroupStatusValue = + (typeof AD_GROUP_STATUS)[keyof typeof AD_GROUP_STATUS]; + +/** + * Ad status values + */ +export const AD_STATUS = { + ENABLED: "ENABLED", + PAUSED: "PAUSED", + REMOVED: "REMOVED", +} as const; + +/** Type for ad status values */ +export type AdStatusValue = (typeof AD_STATUS)[keyof typeof AD_STATUS]; + +/** + * Keyword match types + */ +export const KEYWORD_MATCH_TYPE = { + EXACT: "EXACT", + PHRASE: "PHRASE", + BROAD: "BROAD", +} as const; + +/** Type for keyword match type values */ +export type KeywordMatchTypeValue = + (typeof KEYWORD_MATCH_TYPE)[keyof typeof KEYWORD_MATCH_TYPE]; + +/** + * Advertising channel types + */ +export const ADVERTISING_CHANNEL_TYPE = { + SEARCH: "SEARCH", + DISPLAY: "DISPLAY", + SHOPPING: "SHOPPING", + VIDEO: "VIDEO", + PERFORMANCE_MAX: "PERFORMANCE_MAX", + DEMAND_GEN: "DEMAND_GEN", + LOCAL: "LOCAL", + SMART: "SMART", + HOTEL: "HOTEL", + LOCAL_SERVICES: "LOCAL_SERVICES", + TRAVEL: "TRAVEL", + DISCOVERY: "DISCOVERY", +} as const; + +/** Type for advertising channel type values */ +export type AdvertisingChannelTypeValue = + (typeof ADVERTISING_CHANNEL_TYPE)[keyof typeof ADVERTISING_CHANNEL_TYPE]; + +/** + * Bidding strategy types + */ +export const BIDDING_STRATEGY_TYPE = { + MANUAL_CPC: "MANUAL_CPC", + MANUAL_CPM: "MANUAL_CPM", + MANUAL_CPV: "MANUAL_CPV", + MAXIMIZE_CONVERSIONS: "MAXIMIZE_CONVERSIONS", + MAXIMIZE_CONVERSION_VALUE: "MAXIMIZE_CONVERSION_VALUE", + TARGET_CPA: "TARGET_CPA", + TARGET_ROAS: "TARGET_ROAS", + TARGET_SPEND: "TARGET_SPEND", + TARGET_IMPRESSION_SHARE: "TARGET_IMPRESSION_SHARE", + ENHANCED_CPC: "ENHANCED_CPC", +} as const; + +/** Type for bidding strategy type values */ +export type BiddingStrategyTypeValue = + (typeof BIDDING_STRATEGY_TYPE)[keyof typeof BIDDING_STRATEGY_TYPE]; + +/** + * Budget delivery methods + */ +export const BUDGET_DELIVERY_METHOD = { + STANDARD: "STANDARD", + ACCELERATED: "ACCELERATED", +} as const; + +/** Type for budget delivery method values */ +export type BudgetDeliveryMethodValue = + (typeof BUDGET_DELIVERY_METHOD)[keyof typeof BUDGET_DELIVERY_METHOD]; + +/** + * Ad group types + */ +export const AD_GROUP_TYPE = { + SEARCH_STANDARD: "SEARCH_STANDARD", + DISPLAY_STANDARD: "DISPLAY_STANDARD", + SHOPPING_PRODUCT_ADS: "SHOPPING_PRODUCT_ADS", + VIDEO_TRUE_VIEW_IN_STREAM: "VIDEO_TRUE_VIEW_IN_STREAM", + VIDEO_BUMPER: "VIDEO_BUMPER", + VIDEO_RESPONSIVE: "VIDEO_RESPONSIVE", +} as const; + +/** Type for ad group type values */ +export type AdGroupTypeValue = + (typeof AD_GROUP_TYPE)[keyof typeof AD_GROUP_TYPE]; + +/** + * Common GAQL queries + */ +export const GAQL_QUERIES = { + /** + * List all campaigns with basic info + */ + LIST_CAMPAIGNS: ` + SELECT + campaign.id, + campaign.name, + campaign.status, + campaign.advertising_channel_type, + campaign.advertising_channel_sub_type, + campaign.bidding_strategy_type, + campaign.start_date, + campaign.end_date, + campaign.campaign_budget, + campaign.serving_status + FROM campaign + ORDER BY campaign.name + `, + + /** + * List campaigns with performance metrics + */ + LIST_CAMPAIGNS_WITH_METRICS: ` + SELECT + campaign.id, + campaign.name, + campaign.status, + campaign.advertising_channel_type, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.ctr, + metrics.average_cpc + FROM campaign + WHERE segments.date DURING LAST_30_DAYS + ORDER BY campaign.name + `, + + /** + * List all ad groups with basic info + */ + LIST_AD_GROUPS: ` + SELECT + ad_group.id, + ad_group.name, + ad_group.campaign, + ad_group.status, + ad_group.type, + ad_group.cpc_bid_micros + FROM ad_group + ORDER BY ad_group.name + `, + + /** + * List ad groups for a specific campaign + */ + LIST_AD_GROUPS_BY_CAMPAIGN: (campaignId: string) => ` + SELECT + ad_group.id, + ad_group.name, + ad_group.campaign, + ad_group.status, + ad_group.type, + ad_group.cpc_bid_micros + FROM ad_group + WHERE campaign.id = ${campaignId} + ORDER BY ad_group.name + `, + + /** + * List all ads with basic info + */ + LIST_ADS: ` + SELECT + ad_group_ad.ad.id, + ad_group_ad.ad.name, + ad_group_ad.ad.type, + ad_group_ad.ad.final_urls, + ad_group_ad.ad_group, + ad_group_ad.status, + ad_group_ad.policy_summary.approval_status + FROM ad_group_ad + ORDER BY ad_group_ad.ad.id + `, + + /** + * List ads for a specific ad group + */ + LIST_ADS_BY_AD_GROUP: (adGroupId: string) => ` + SELECT + ad_group_ad.ad.id, + ad_group_ad.ad.name, + ad_group_ad.ad.type, + ad_group_ad.ad.final_urls, + ad_group_ad.ad_group, + ad_group_ad.status, + ad_group_ad.policy_summary.approval_status + FROM ad_group_ad + WHERE ad_group.id = ${adGroupId} + ORDER BY ad_group_ad.ad.id + `, + + /** + * List keywords for an ad group + */ + LIST_KEYWORDS: ` + SELECT + ad_group_criterion.criterion_id, + ad_group_criterion.ad_group, + ad_group_criterion.keyword.text, + ad_group_criterion.keyword.match_type, + ad_group_criterion.status, + ad_group_criterion.cpc_bid_micros, + ad_group_criterion.negative + FROM ad_group_criterion + WHERE ad_group_criterion.type = 'KEYWORD' + ORDER BY ad_group_criterion.keyword.text + `, + + /** + * List keywords for a specific ad group + */ + LIST_KEYWORDS_BY_AD_GROUP: (adGroupId: string) => ` + SELECT + ad_group_criterion.criterion_id, + ad_group_criterion.ad_group, + ad_group_criterion.keyword.text, + ad_group_criterion.keyword.match_type, + ad_group_criterion.status, + ad_group_criterion.cpc_bid_micros, + ad_group_criterion.negative, + ad_group_criterion.quality_info.quality_score + FROM ad_group_criterion + WHERE ad_group.id = ${adGroupId} + AND ad_group_criterion.type = 'KEYWORD' + ORDER BY ad_group_criterion.keyword.text + `, + + /** + * Get account performance report + */ + ACCOUNT_PERFORMANCE_REPORT: (dateRange: string) => ` + SELECT + customer.id, + customer.descriptive_name, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.conversions_value, + metrics.ctr, + metrics.average_cpc, + metrics.average_cpm + FROM customer + WHERE segments.date DURING ${dateRange} + `, + + /** + * Get campaign performance report + */ + CAMPAIGN_PERFORMANCE_REPORT: (dateRange: string) => ` + SELECT + campaign.id, + campaign.name, + campaign.status, + segments.date, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.conversions_value, + metrics.ctr, + metrics.average_cpc + FROM campaign + WHERE segments.date DURING ${dateRange} + ORDER BY segments.date DESC + `, + + /** + * Get customer (account) details + */ + GET_CUSTOMER: ` + SELECT + customer.id, + customer.descriptive_name, + customer.currency_code, + customer.time_zone, + customer.tracking_url_template, + customer.auto_tagging_enabled, + customer.manager, + customer.test_account + FROM customer + LIMIT 1 + `, +} as const; + +/** + * Date range presets for reports + */ +export const DATE_RANGE_PRESETS = { + TODAY: "TODAY", + YESTERDAY: "YESTERDAY", + LAST_7_DAYS: "LAST_7_DAYS", + LAST_14_DAYS: "LAST_14_DAYS", + LAST_30_DAYS: "LAST_30_DAYS", + LAST_90_DAYS: "LAST_90_DAYS", + THIS_WEEK_SUN_TODAY: "THIS_WEEK_SUN_TODAY", + THIS_WEEK_MON_TODAY: "THIS_WEEK_MON_TODAY", + LAST_WEEK_SUN_SAT: "LAST_WEEK_SUN_SAT", + LAST_WEEK_MON_SUN: "LAST_WEEK_MON_SUN", + THIS_MONTH: "THIS_MONTH", + LAST_MONTH: "LAST_MONTH", + ALL_TIME: "ALL_TIME", +} as const; + +/** Type for date range preset values */ +export type DateRangePresetValue = + (typeof DATE_RANGE_PRESETS)[keyof typeof DATE_RANGE_PRESETS]; + +/** Array of all valid date range preset keys for use in Zod schemas */ +export const DATE_RANGE_PRESET_VALUES = Object.values( + DATE_RANGE_PRESETS, +) as DateRangePresetValue[]; diff --git a/google-ads/server/lib/env.ts b/google-ads/server/lib/env.ts new file mode 100644 index 00000000..59d68762 --- /dev/null +++ b/google-ads/server/lib/env.ts @@ -0,0 +1,52 @@ +import type { Env } from "../../shared/deco.gen.ts"; +import { GoogleAdsClient } from "./google-ads-client.ts"; +import { GoogleAdsAuthError, GoogleAdsConfigError } from "./types.ts"; + +/** + * Get Google OAuth access token from environment context + * @param env - The environment containing the mesh request context + * @returns The OAuth access token + * @throws GoogleAdsAuthError if not authenticated + */ +export const getGoogleAccessToken = (env: Env): string => { + const authorization = env.MESH_REQUEST_CONTEXT?.authorization; + if (!authorization) { + throw new GoogleAdsAuthError( + "Not authenticated. Please authorize with Google Ads first.", + ); + } + return authorization; +}; + +/** + * Get Google Ads Developer Token from environment context or process env + * @param env - The environment containing the mesh request context + * @returns The developer token + * @throws GoogleAdsConfigError if developer token is not configured + */ +export const getDeveloperToken = (env: Env): string => { + const developerToken = + env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN; + + if (!developerToken) { + throw new GoogleAdsConfigError( + "Developer token not configured. Please set the developerToken in state or GOOGLE_ADS_DEVELOPER_TOKEN environment variable.", + ); + } + return developerToken; +}; + +/** + * Create a configured GoogleAdsClient instance + * @param env - The environment containing auth and configuration + * @returns A configured GoogleAdsClient instance + * @throws GoogleAdsAuthError if not authenticated + * @throws GoogleAdsConfigError if developer token is not configured + */ +export const createGoogleAdsClient = (env: Env): GoogleAdsClient => { + return new GoogleAdsClient({ + accessToken: getGoogleAccessToken(env), + developerToken: getDeveloperToken(env), + }); +}; diff --git a/google-ads/server/lib/google-ads-client.ts b/google-ads/server/lib/google-ads-client.ts new file mode 100644 index 00000000..65b2cbad --- /dev/null +++ b/google-ads/server/lib/google-ads-client.ts @@ -0,0 +1,1039 @@ +/** + * Google Ads API client + * Handles all communication with the Google Ads API v18 + */ + +import { ENDPOINTS, DEFAULT_PAGE_SIZE, GAQL_QUERIES } from "../constants.ts"; +import { + GoogleAdsApiError, + type Customer, + type Campaign, + type AdGroup, + type AdGroupAd, + type AdGroupCriterion, + type ListAccessibleCustomersResponse, + type SearchGoogleAdsResponse, + type SearchGoogleAdsStreamResponse, + type GoogleAdsRow, + type MutateCampaignsResponse, + type MutateCampaignBudgetsResponse, + type MutateAdGroupsResponse, + type MutateAdGroupAdsResponse, + type MutateAdGroupCriteriaResponse, + type CreateCampaignInput, + type UpdateCampaignInput, + type CreateCampaignBudgetInput, + type CreateAdGroupInput, + type UpdateAdGroupInput, + type CreateResponsiveSearchAdInput, + type UpdateAdGroupAdInput, + type CreateKeywordInput, + type UpdateKeywordInput, + type ApiErrorResponse, + type GoogleAdsError, + type CampaignStatus, + type AdGroupStatus, + type AdGroupAdStatus, + type AdGroupCriterionStatus, +} from "./types.ts"; + +export interface GoogleAdsClientConfig { + accessToken: string; + developerToken: string; +} + +/** + * Google Ads API Client + * Provides typed methods for interacting with Google Ads resources + */ +export class GoogleAdsClient { + private accessToken: string; + private developerToken: string; + + constructor(config: GoogleAdsClientConfig) { + this.accessToken = config.accessToken; + this.developerToken = config.developerToken; + } + + /** + * Make a request to the Google Ads API + * @throws GoogleAdsApiError on API errors with details + */ + private async request(url: string, options: RequestInit = {}): Promise { + const response = await fetch(url, { + ...options, + headers: { + Authorization: `Bearer ${this.accessToken}`, + "developer-token": this.developerToken, + "Content-Type": "application/json", + ...options.headers, + }, + }); + + if (!response.ok) { + const errorText = await response.text(); + let errorMessage = `Google Ads API error: ${response.status}`; + let errorDetails: GoogleAdsError | undefined; + + try { + const errorData = JSON.parse(errorText) as ApiErrorResponse; + errorMessage = errorData.error?.message || errorMessage; + + // Extract detailed error information if available + if (errorData.error?.details) { + const googleAdsDetails = errorData.error.details.find( + (d) => d["@type"]?.includes("GoogleAdsFailure") && d.errors, + ); + if (googleAdsDetails?.errors) { + errorDetails = { errors: googleAdsDetails.errors }; + } + } + } catch { + errorMessage = `${errorMessage} - ${errorText}`; + } + + throw new GoogleAdsApiError( + errorMessage, + response.status, + response.statusText, + errorDetails, + ); + } + + // Handle 204 No Content + if (response.status === 204) { + return {} as T; + } + + return (await response.json()) as T; + } + + /** + * Execute a GAQL query using the search endpoint + * @param customerId - Customer ID (without hyphens) + * @param query - GAQL query string + * @param pageToken - Optional page token for pagination + * @param pageSize - Optional page size (default: 1000) + */ + async search( + customerId: string, + query: string, + pageToken?: string, + pageSize: number = DEFAULT_PAGE_SIZE, + ): Promise { + const body: Record = { + query: query.trim(), + pageSize, + }; + + if (pageToken) { + body.pageToken = pageToken; + } + + return this.request(ENDPOINTS.SEARCH(customerId), { + method: "POST", + body: JSON.stringify(body), + }); + } + + /** + * Execute a GAQL query using the search stream endpoint + * Returns all results without pagination + * @param customerId - Customer ID (without hyphens) + * @param query - GAQL query string + */ + async searchStream( + customerId: string, + query: string, + ): Promise { + // searchStream returns array of response objects, we need to combine them + const responses = await this.request( + ENDPOINTS.SEARCH_STREAM(customerId), + { + method: "POST", + body: JSON.stringify({ + query: query.trim(), + }), + }, + ); + + // Combine all results from the stream + const combinedResults: GoogleAdsRow[] = []; + let fieldMask: string | undefined; + let requestId: string | undefined; + + if (Array.isArray(responses)) { + for (const response of responses) { + if (response.results) { + combinedResults.push(...response.results); + } + if (response.fieldMask) { + fieldMask = response.fieldMask; + } + if (response.requestId) { + requestId = response.requestId; + } + } + } + + return { + results: combinedResults, + fieldMask, + requestId, + }; + } + + // ==================== Account Methods ==================== + + /** + * List all accessible customers for the authenticated user + */ + async listAccessibleCustomers(): Promise { + return this.request( + ENDPOINTS.LIST_ACCESSIBLE_CUSTOMERS, + ); + } + + /** + * Get customer details using GAQL + * @param customerId - Customer ID (without hyphens) + */ + async getCustomer(customerId: string): Promise { + const response = await this.search(customerId, GAQL_QUERIES.GET_CUSTOMER); + return response.results?.[0]?.customer || null; + } + + // ==================== Campaign Methods ==================== + + /** + * List all campaigns for a customer + * @param customerId - Customer ID + * @param statusFilter - Optional status filter + */ + async listCampaigns( + customerId: string, + statusFilter?: CampaignStatus, + ): Promise { + const query = statusFilter + ? ` + SELECT + campaign.id, + campaign.name, + campaign.status, + campaign.advertising_channel_type, + campaign.advertising_channel_sub_type, + campaign.bidding_strategy_type, + campaign.start_date, + campaign.end_date, + campaign.campaign_budget, + campaign.serving_status + FROM campaign + WHERE campaign.status = '${statusFilter}' + ORDER BY campaign.name + ` + : GAQL_QUERIES.LIST_CAMPAIGNS; + + const response = await this.searchStream(customerId, query); + return response.results + .filter( + (row): row is GoogleAdsRow & { campaign: Campaign } => !!row.campaign, + ) + .map((row) => row.campaign); + } + + /** + * Get a specific campaign by ID + * @param customerId - Customer ID + * @param campaignId - Campaign ID + */ + async getCampaign( + customerId: string, + campaignId: string, + ): Promise { + const query = ` + SELECT + campaign.id, + campaign.name, + campaign.status, + campaign.advertising_channel_type, + campaign.advertising_channel_sub_type, + campaign.bidding_strategy_type, + campaign.start_date, + campaign.end_date, + campaign.campaign_budget, + campaign.serving_status, + campaign.network_settings.target_google_search, + campaign.network_settings.target_search_network, + campaign.network_settings.target_content_network + FROM campaign + WHERE campaign.id = ${campaignId} + `; + + const response = await this.search(customerId, query); + return response.results?.[0]?.campaign || null; + } + + /** + * Create a campaign budget + * @param customerId - Customer ID + * @param input - Budget creation input + */ + async createCampaignBudget( + customerId: string, + input: CreateCampaignBudgetInput, + ): Promise { + const operation = { + create: { + name: input.name, + amountMicros: input.amountMicros, + deliveryMethod: input.deliveryMethod || "STANDARD", + explicitlyShared: input.explicitlyShared ?? false, + }, + }; + + return this.request( + ENDPOINTS.CAMPAIGN_BUDGETS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [operation], + }), + }, + ); + } + + /** + * Create a new campaign + * @param customerId - Customer ID + * @param input - Campaign creation input + */ + async createCampaign( + customerId: string, + input: CreateCampaignInput, + ): Promise { + const campaign: Record = { + name: input.name, + advertisingChannelType: input.advertisingChannelType, + status: input.status || "PAUSED", + campaignBudget: input.campaignBudget, + }; + + if (input.startDate) { + campaign.startDate = input.startDate; + } + if (input.endDate) { + campaign.endDate = input.endDate; + } + if (input.networkSettings) { + campaign.networkSettings = input.networkSettings; + } + if (input.manualCpc) { + campaign.manualCpc = input.manualCpc; + } + if (input.targetCpaMicros) { + campaign.targetCpa = { targetCpaMicros: input.targetCpaMicros }; + } + if (input.targetRoas) { + campaign.targetRoas = { targetRoas: input.targetRoas }; + } + + return this.request( + ENDPOINTS.CAMPAIGNS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [{ create: campaign }], + }), + }, + ); + } + + /** + * Update an existing campaign + * @param customerId - Customer ID + * @param input - Campaign update input + */ + async updateCampaign( + customerId: string, + input: UpdateCampaignInput, + ): Promise { + const campaign: Record = { + resourceName: input.resourceName, + }; + const updateMask: string[] = []; + + if (input.name !== undefined) { + campaign.name = input.name; + updateMask.push("name"); + } + if (input.status !== undefined) { + campaign.status = input.status; + updateMask.push("status"); + } + if (input.startDate !== undefined) { + campaign.startDate = input.startDate; + updateMask.push("start_date"); + } + if (input.endDate !== undefined) { + campaign.endDate = input.endDate; + updateMask.push("end_date"); + } + if (input.networkSettings !== undefined) { + campaign.networkSettings = input.networkSettings; + updateMask.push("network_settings"); + } + if (input.targetCpaMicros !== undefined) { + campaign.targetCpa = { targetCpaMicros: input.targetCpaMicros }; + updateMask.push("target_cpa.target_cpa_micros"); + } + if (input.targetRoas !== undefined) { + campaign.targetRoas = { targetRoas: input.targetRoas }; + updateMask.push("target_roas.target_roas"); + } + + return this.request( + ENDPOINTS.CAMPAIGNS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [ + { + update: campaign, + updateMask: updateMask.join(","), + }, + ], + }), + }, + ); + } + + /** + * Update campaign status (pause, enable, remove) + * @param customerId - Customer ID + * @param campaignResourceName - Campaign resource name + * @param status - New status + */ + async updateCampaignStatus( + customerId: string, + campaignResourceName: string, + status: CampaignStatus, + ): Promise { + return this.updateCampaign(customerId, { + resourceName: campaignResourceName, + status, + }); + } + + // ==================== Ad Group Methods ==================== + + /** + * List ad groups for a customer + * @param customerId - Customer ID + * @param campaignId - Optional campaign ID to filter by + */ + async listAdGroups( + customerId: string, + campaignId?: string, + ): Promise { + const query = campaignId + ? GAQL_QUERIES.LIST_AD_GROUPS_BY_CAMPAIGN(campaignId) + : GAQL_QUERIES.LIST_AD_GROUPS; + + const response = await this.searchStream(customerId, query); + return response.results + .filter( + (row): row is GoogleAdsRow & { adGroup: AdGroup } => !!row.adGroup, + ) + .map((row) => row.adGroup); + } + + /** + * Get a specific ad group by ID + * @param customerId - Customer ID + * @param adGroupId - Ad group ID + */ + async getAdGroup( + customerId: string, + adGroupId: string, + ): Promise { + const query = ` + SELECT + ad_group.id, + ad_group.name, + ad_group.campaign, + ad_group.status, + ad_group.type, + ad_group.cpc_bid_micros, + ad_group.cpm_bid_micros, + ad_group.target_cpa_micros + FROM ad_group + WHERE ad_group.id = ${adGroupId} + `; + + const response = await this.search(customerId, query); + return response.results?.[0]?.adGroup || null; + } + + /** + * Create a new ad group + * @param customerId - Customer ID + * @param input - Ad group creation input + */ + async createAdGroup( + customerId: string, + input: CreateAdGroupInput, + ): Promise { + const adGroup: Record = { + name: input.name, + campaign: input.campaign, + status: input.status || "PAUSED", + }; + + if (input.type) { + adGroup.type = input.type; + } + if (input.cpcBidMicros) { + adGroup.cpcBidMicros = input.cpcBidMicros; + } + if (input.cpmBidMicros) { + adGroup.cpmBidMicros = input.cpmBidMicros; + } + if (input.targetCpaMicros) { + adGroup.targetCpaMicros = input.targetCpaMicros; + } + + return this.request( + ENDPOINTS.AD_GROUPS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [{ create: adGroup }], + }), + }, + ); + } + + /** + * Update an existing ad group + * @param customerId - Customer ID + * @param input - Ad group update input + */ + async updateAdGroup( + customerId: string, + input: UpdateAdGroupInput, + ): Promise { + const adGroup: Record = { + resourceName: input.resourceName, + }; + const updateMask: string[] = []; + + if (input.name !== undefined) { + adGroup.name = input.name; + updateMask.push("name"); + } + if (input.status !== undefined) { + adGroup.status = input.status; + updateMask.push("status"); + } + if (input.cpcBidMicros !== undefined) { + adGroup.cpcBidMicros = input.cpcBidMicros; + updateMask.push("cpc_bid_micros"); + } + if (input.cpmBidMicros !== undefined) { + adGroup.cpmBidMicros = input.cpmBidMicros; + updateMask.push("cpm_bid_micros"); + } + if (input.targetCpaMicros !== undefined) { + adGroup.targetCpaMicros = input.targetCpaMicros; + updateMask.push("target_cpa_micros"); + } + + return this.request( + ENDPOINTS.AD_GROUPS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [ + { + update: adGroup, + updateMask: updateMask.join(","), + }, + ], + }), + }, + ); + } + + /** + * Update ad group status + * @param customerId - Customer ID + * @param adGroupResourceName - Ad group resource name + * @param status - New status + */ + async updateAdGroupStatus( + customerId: string, + adGroupResourceName: string, + status: AdGroupStatus, + ): Promise { + return this.updateAdGroup(customerId, { + resourceName: adGroupResourceName, + status, + }); + } + + // ==================== Ad Methods ==================== + + /** + * List ads for a customer + * @param customerId - Customer ID + * @param adGroupId - Optional ad group ID to filter by + */ + async listAds(customerId: string, adGroupId?: string): Promise { + const query = adGroupId + ? GAQL_QUERIES.LIST_ADS_BY_AD_GROUP(adGroupId) + : GAQL_QUERIES.LIST_ADS; + + const response = await this.searchStream(customerId, query); + return response.results + .filter( + (row): row is GoogleAdsRow & { adGroupAd: AdGroupAd } => + !!row.adGroupAd, + ) + .map((row) => row.adGroupAd); + } + + /** + * Get a specific ad by ID + * @param customerId - Customer ID + * @param adGroupId - Ad group ID + * @param adId - Ad ID + */ + async getAd( + customerId: string, + adGroupId: string, + adId: string, + ): Promise { + const query = ` + SELECT + ad_group_ad.ad.id, + ad_group_ad.ad.name, + ad_group_ad.ad.type, + ad_group_ad.ad.final_urls, + ad_group_ad.ad.display_url, + ad_group_ad.ad_group, + ad_group_ad.status, + ad_group_ad.policy_summary.approval_status, + ad_group_ad.ad.responsive_search_ad.headlines, + ad_group_ad.ad.responsive_search_ad.descriptions, + ad_group_ad.ad.responsive_search_ad.path1, + ad_group_ad.ad.responsive_search_ad.path2 + FROM ad_group_ad + WHERE ad_group.id = ${adGroupId} + AND ad_group_ad.ad.id = ${adId} + `; + + const response = await this.search(customerId, query); + return response.results?.[0]?.adGroupAd || null; + } + + /** + * Create a responsive search ad + * @param customerId - Customer ID + * @param input - Ad creation input + */ + async createResponsiveSearchAd( + customerId: string, + input: CreateResponsiveSearchAdInput, + ): Promise { + const adGroupAd = { + adGroup: input.adGroup, + status: input.status || "PAUSED", + ad: { + finalUrls: input.finalUrls, + responsiveSearchAd: { + headlines: input.headlines, + descriptions: input.descriptions, + path1: input.path1, + path2: input.path2, + }, + }, + }; + + return this.request( + ENDPOINTS.AD_GROUP_ADS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [{ create: adGroupAd }], + }), + }, + ); + } + + /** + * Update an ad (mainly status changes) + * @param customerId - Customer ID + * @param input - Ad update input + */ + async updateAdGroupAd( + customerId: string, + input: UpdateAdGroupAdInput, + ): Promise { + const adGroupAd: Record = { + resourceName: input.resourceName, + }; + const updateMask: string[] = []; + + if (input.status !== undefined) { + adGroupAd.status = input.status; + updateMask.push("status"); + } + + return this.request( + ENDPOINTS.AD_GROUP_ADS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [ + { + update: adGroupAd, + updateMask: updateMask.join(","), + }, + ], + }), + }, + ); + } + + /** + * Update ad status + * @param customerId - Customer ID + * @param adResourceName - Ad resource name + * @param status - New status + */ + async updateAdStatus( + customerId: string, + adResourceName: string, + status: AdGroupAdStatus, + ): Promise { + return this.updateAdGroupAd(customerId, { + resourceName: adResourceName, + status, + }); + } + + // ==================== Keyword Methods ==================== + + /** + * List keywords for a customer + * @param customerId - Customer ID + * @param adGroupId - Optional ad group ID to filter by + */ + async listKeywords( + customerId: string, + adGroupId?: string, + ): Promise { + const query = adGroupId + ? GAQL_QUERIES.LIST_KEYWORDS_BY_AD_GROUP(adGroupId) + : GAQL_QUERIES.LIST_KEYWORDS; + + const response = await this.searchStream(customerId, query); + return response.results + .filter( + (row): row is GoogleAdsRow & { adGroupCriterion: AdGroupCriterion } => + !!row.adGroupCriterion, + ) + .map((row) => row.adGroupCriterion); + } + + /** + * Get a specific keyword by criterion ID + * @param customerId - Customer ID + * @param adGroupId - Ad group ID + * @param criterionId - Criterion ID + */ + async getKeyword( + customerId: string, + adGroupId: string, + criterionId: string, + ): Promise { + const query = ` + SELECT + ad_group_criterion.criterion_id, + ad_group_criterion.ad_group, + ad_group_criterion.keyword.text, + ad_group_criterion.keyword.match_type, + ad_group_criterion.status, + ad_group_criterion.cpc_bid_micros, + ad_group_criterion.negative, + ad_group_criterion.quality_info.quality_score, + ad_group_criterion.position_estimates.first_page_cpc_micros, + ad_group_criterion.position_estimates.top_of_page_cpc_micros + FROM ad_group_criterion + WHERE ad_group.id = ${adGroupId} + AND ad_group_criterion.criterion_id = ${criterionId} + AND ad_group_criterion.type = 'KEYWORD' + `; + + const response = await this.search(customerId, query); + return response.results?.[0]?.adGroupCriterion || null; + } + + /** + * Create a new keyword + * @param customerId - Customer ID + * @param input - Keyword creation input + */ + async createKeyword( + customerId: string, + input: CreateKeywordInput, + ): Promise { + const criterion: Record = { + adGroup: input.adGroup, + status: input.status || "ENABLED", + keyword: { + text: input.keyword.text, + matchType: input.keyword.matchType, + }, + }; + + if (input.cpcBidMicros) { + criterion.cpcBidMicros = input.cpcBidMicros; + } + if (input.finalUrls) { + criterion.finalUrls = input.finalUrls; + } + if (input.negative !== undefined) { + criterion.negative = input.negative; + } + + return this.request( + ENDPOINTS.AD_GROUP_CRITERIA_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [{ create: criterion }], + }), + }, + ); + } + + /** + * Update an existing keyword + * @param customerId - Customer ID + * @param input - Keyword update input + */ + async updateKeyword( + customerId: string, + input: UpdateKeywordInput, + ): Promise { + const criterion: Record = { + resourceName: input.resourceName, + }; + const updateMask: string[] = []; + + if (input.status !== undefined) { + criterion.status = input.status; + updateMask.push("status"); + } + if (input.cpcBidMicros !== undefined) { + criterion.cpcBidMicros = input.cpcBidMicros; + updateMask.push("cpc_bid_micros"); + } + if (input.finalUrls !== undefined) { + criterion.finalUrls = input.finalUrls; + updateMask.push("final_urls"); + } + + return this.request( + ENDPOINTS.AD_GROUP_CRITERIA_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [ + { + update: criterion, + updateMask: updateMask.join(","), + }, + ], + }), + }, + ); + } + + /** + * Update keyword status + * @param customerId - Customer ID + * @param keywordResourceName - Keyword resource name + * @param status - New status + */ + async updateKeywordStatus( + customerId: string, + keywordResourceName: string, + status: AdGroupCriterionStatus, + ): Promise { + return this.updateKeyword(customerId, { + resourceName: keywordResourceName, + status, + }); + } + + /** + * Remove a keyword + * @param customerId - Customer ID + * @param keywordResourceName - Keyword resource name + */ + async removeKeyword( + customerId: string, + keywordResourceName: string, + ): Promise { + return this.request( + ENDPOINTS.AD_GROUP_CRITERIA_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [{ remove: keywordResourceName }], + }), + }, + ); + } + + // ==================== Report Methods ==================== + + /** + * Get account performance report + * @param customerId - Customer ID + * @param dateRange - Date range preset (e.g., LAST_30_DAYS) + */ + async getAccountPerformance( + customerId: string, + dateRange: string, + ): Promise { + const query = GAQL_QUERIES.ACCOUNT_PERFORMANCE_REPORT(dateRange); + const response = await this.search(customerId, query); + return response.results || []; + } + + /** + * Get campaign performance report + * @param customerId - Customer ID + * @param dateRange - Date range preset + * @param campaignId - Optional campaign ID to filter + */ + async getCampaignPerformance( + customerId: string, + dateRange: string, + campaignId?: string, + ): Promise { + let query = GAQL_QUERIES.CAMPAIGN_PERFORMANCE_REPORT(dateRange); + + if (campaignId) { + query = ` + SELECT + campaign.id, + campaign.name, + campaign.status, + segments.date, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.conversions_value, + metrics.ctr, + metrics.average_cpc + FROM campaign + WHERE campaign.id = ${campaignId} + AND segments.date DURING ${dateRange} + ORDER BY segments.date DESC + `; + } + + const response = await this.searchStream(customerId, query); + return response.results || []; + } + + /** + * Get ad group performance report + * @param customerId - Customer ID + * @param dateRange - Date range preset + * @param campaignId - Optional campaign ID to filter + */ + async getAdGroupPerformance( + customerId: string, + dateRange: string, + campaignId?: string, + ): Promise { + let whereClause = `segments.date DURING ${dateRange}`; + if (campaignId) { + whereClause += ` AND campaign.id = ${campaignId}`; + } + + const query = ` + SELECT + ad_group.id, + ad_group.name, + ad_group.campaign, + ad_group.status, + segments.date, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.ctr, + metrics.average_cpc + FROM ad_group + WHERE ${whereClause} + ORDER BY segments.date DESC + `; + + const response = await this.searchStream(customerId, query); + return response.results || []; + } + + /** + * Get keyword performance report + * @param customerId - Customer ID + * @param dateRange - Date range preset + * @param adGroupId - Optional ad group ID to filter + */ + async getKeywordPerformance( + customerId: string, + dateRange: string, + adGroupId?: string, + ): Promise { + let whereClause = `ad_group_criterion.type = 'KEYWORD' AND segments.date DURING ${dateRange}`; + if (adGroupId) { + whereClause += ` AND ad_group.id = ${adGroupId}`; + } + + const query = ` + SELECT + ad_group_criterion.criterion_id, + ad_group_criterion.keyword.text, + ad_group_criterion.keyword.match_type, + ad_group_criterion.status, + ad_group.name, + segments.date, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.ctr, + metrics.average_cpc, + ad_group_criterion.quality_info.quality_score + FROM ad_group_criterion + WHERE ${whereClause} + ORDER BY metrics.impressions DESC + `; + + const response = await this.searchStream(customerId, query); + return response.results || []; + } +} + +// Re-export helpers from env.ts for convenience +export { + getGoogleAccessToken as getAccessToken, + getDeveloperToken, + createGoogleAdsClient, +} from "./env.ts"; diff --git a/google-ads/server/lib/types.ts b/google-ads/server/lib/types.ts new file mode 100644 index 00000000..fb7beeef --- /dev/null +++ b/google-ads/server/lib/types.ts @@ -0,0 +1,974 @@ +/** + * Google Ads API types + * Based on Google Ads API v18 specification + */ + +// ============================================================================ +// Date Range Type +// ============================================================================ + +/** + * Date range presets for reports + */ +export type DateRangePreset = + | "TODAY" + | "YESTERDAY" + | "LAST_7_DAYS" + | "LAST_14_DAYS" + | "LAST_30_DAYS" + | "LAST_90_DAYS" + | "THIS_WEEK_SUN_TODAY" + | "THIS_WEEK_MON_TODAY" + | "LAST_WEEK_SUN_SAT" + | "LAST_WEEK_MON_SUN" + | "THIS_MONTH" + | "LAST_MONTH" + | "ALL_TIME"; + +// ============================================================================ +// Enums and Status Types +// ============================================================================ + +/** + * Campaign status + */ +export type CampaignStatus = + | "UNSPECIFIED" + | "UNKNOWN" + | "ENABLED" + | "PAUSED" + | "REMOVED"; + +/** + * Ad group status + */ +export type AdGroupStatus = + | "UNSPECIFIED" + | "UNKNOWN" + | "ENABLED" + | "PAUSED" + | "REMOVED"; + +/** + * Ad group ad status + */ +export type AdGroupAdStatus = + | "UNSPECIFIED" + | "UNKNOWN" + | "ENABLED" + | "PAUSED" + | "REMOVED"; + +/** + * Keyword match type + */ +export type KeywordMatchType = + | "UNSPECIFIED" + | "UNKNOWN" + | "EXACT" + | "PHRASE" + | "BROAD"; + +/** + * Keyword status + */ +export type AdGroupCriterionStatus = + | "UNSPECIFIED" + | "UNKNOWN" + | "ENABLED" + | "PAUSED" + | "REMOVED"; + +/** + * Advertising channel type + */ +export type AdvertisingChannelType = + | "UNSPECIFIED" + | "UNKNOWN" + | "SEARCH" + | "DISPLAY" + | "SHOPPING" + | "HOTEL" + | "VIDEO" + | "MULTI_CHANNEL" + | "LOCAL" + | "SMART" + | "PERFORMANCE_MAX" + | "LOCAL_SERVICES" + | "DISCOVERY" + | "TRAVEL" + | "DEMAND_GEN"; + +/** + * Advertising channel sub type + */ +export type AdvertisingChannelSubType = + | "UNSPECIFIED" + | "UNKNOWN" + | "SEARCH_MOBILE_APP" + | "DISPLAY_MOBILE_APP" + | "SEARCH_EXPRESS" + | "DISPLAY_EXPRESS" + | "SHOPPING_SMART_ADS" + | "DISPLAY_GMAIL_AD" + | "DISPLAY_SMART_CAMPAIGN" + | "VIDEO_OUTSTREAM" + | "VIDEO_ACTION" + | "VIDEO_NON_SKIPPABLE" + | "APP_CAMPAIGN" + | "APP_CAMPAIGN_FOR_ENGAGEMENT" + | "LOCAL_CAMPAIGN" + | "SHOPPING_COMPARISON_LISTING_ADS" + | "SMART_CAMPAIGN" + | "VIDEO_SEQUENCE" + | "APP_CAMPAIGN_FOR_PRE_REGISTRATION" + | "VIDEO_REACH_TARGET_FREQUENCY" + | "TRAVEL_ACTIVITIES" + | "SOCIAL"; + +/** + * Bidding strategy type + */ +export type BiddingStrategyType = + | "UNSPECIFIED" + | "UNKNOWN" + | "COMMISSION" + | "ENHANCED_CPC" + | "INVALID" + | "MANUAL_CPA" + | "MANUAL_CPC" + | "MANUAL_CPM" + | "MANUAL_CPV" + | "MAXIMIZE_CONVERSIONS" + | "MAXIMIZE_CONVERSION_VALUE" + | "PAGE_ONE_PROMOTED" + | "PERCENT_CPC" + | "TARGET_CPA" + | "TARGET_CPM" + | "TARGET_IMPRESSION_SHARE" + | "TARGET_OUTRANK_SHARE" + | "TARGET_ROAS" + | "TARGET_SPEND"; + +/** + * Ad type + */ +export type AdType = + | "UNSPECIFIED" + | "UNKNOWN" + | "TEXT_AD" + | "EXPANDED_TEXT_AD" + | "CALL_ONLY_AD" + | "EXPANDED_DYNAMIC_SEARCH_AD" + | "HOTEL_AD" + | "SHOPPING_SMART_AD" + | "SHOPPING_PRODUCT_AD" + | "VIDEO_AD" + | "GMAIL_AD" + | "IMAGE_AD" + | "RESPONSIVE_SEARCH_AD" + | "LEGACY_RESPONSIVE_DISPLAY_AD" + | "APP_AD" + | "LEGACY_APP_INSTALL_AD" + | "RESPONSIVE_DISPLAY_AD" + | "LOCAL_AD" + | "HTML5_UPLOAD_AD" + | "DYNAMIC_HTML5_AD" + | "APP_ENGAGEMENT_AD" + | "SHOPPING_COMPARISON_LISTING_AD" + | "VIDEO_BUMPER_AD" + | "VIDEO_NON_SKIPPABLE_IN_STREAM_AD" + | "VIDEO_OUTSTREAM_AD" + | "VIDEO_TRUEVIEW_DISCOVERY_AD" + | "VIDEO_TRUEVIEW_IN_STREAM_AD" + | "VIDEO_RESPONSIVE_AD" + | "SMART_CAMPAIGN_AD" + | "APP_PRE_REGISTRATION_AD" + | "DISCOVERY_MULTI_ASSET_AD" + | "DISCOVERY_CAROUSEL_AD" + | "DISCOVERY_VIDEO_RESPONSIVE_AD" + | "TRAVEL_AD" + | "DEMAND_GEN_PRODUCT_AD" + | "DEMAND_GEN_MULTI_ASSET_AD" + | "DEMAND_GEN_CAROUSEL_AD" + | "DEMAND_GEN_VIDEO_RESPONSIVE_AD"; + +/** + * Budget delivery method + */ +export type BudgetDeliveryMethod = + | "UNSPECIFIED" + | "UNKNOWN" + | "STANDARD" + | "ACCELERATED"; + +/** + * Campaign serving status + */ +export type CampaignServingStatus = + | "UNSPECIFIED" + | "UNKNOWN" + | "SERVING" + | "NONE" + | "ENDED" + | "PENDING" + | "SUSPENDED"; + +// ============================================================================ +// Resource Types +// ============================================================================ + +/** + * Customer account + */ +export interface Customer { + resourceName: string; + id: string; + descriptiveName: string; + currencyCode: string; + timeZone: string; + trackingUrlTemplate?: string; + finalUrlSuffix?: string; + autoTaggingEnabled?: boolean; + hasPartnersBadge?: boolean; + manager?: boolean; + testAccount?: boolean; + conversionTrackingId?: string; + remarketingId?: string; +} + +/** + * Accessible customer (for list accessible customers) + */ +export interface AccessibleCustomer { + resourceName: string; +} + +/** + * Campaign budget + */ +export interface CampaignBudget { + resourceName: string; + id: string; + name: string; + amountMicros: string; + deliveryMethod: BudgetDeliveryMethod; + explicitlyShared?: boolean; + referenceCount?: string; + totalAmountMicros?: string; + status?: "UNSPECIFIED" | "UNKNOWN" | "ENABLED" | "REMOVED"; +} + +/** + * Campaign + */ +export interface Campaign { + resourceName: string; + id: string; + name: string; + status: CampaignStatus; + servingStatus?: CampaignServingStatus; + advertisingChannelType: AdvertisingChannelType; + advertisingChannelSubType?: AdvertisingChannelSubType; + biddingStrategyType?: BiddingStrategyType; + startDate?: string; + endDate?: string; + campaignBudget?: string; + targetCpa?: { + targetCpaMicros?: string; + cpcBidCeilingMicros?: string; + cpcBidFloorMicros?: string; + }; + targetRoas?: { + targetRoas?: number; + cpcBidCeilingMicros?: string; + cpcBidFloorMicros?: string; + }; + maximizeConversions?: { + targetCpaMicros?: string; + cpcBidCeilingMicros?: string; + cpcBidFloorMicros?: string; + }; + maximizeConversionValue?: { + targetRoas?: number; + cpcBidCeilingMicros?: string; + cpcBidFloorMicros?: string; + }; + manualCpc?: { + enhancedCpcEnabled?: boolean; + }; + manualCpm?: Record; + targetSpend?: { + targetSpendMicros?: string; + cpcBidCeilingMicros?: string; + }; + networkSettings?: { + targetGoogleSearch?: boolean; + targetSearchNetwork?: boolean; + targetContentNetwork?: boolean; + targetPartnerSearchNetwork?: boolean; + }; + geoTargetTypeSetting?: { + positiveGeoTargetType?: string; + negativeGeoTargetType?: string; + }; + urlCustomParameters?: Array<{ + key: string; + value: string; + }>; + trackingUrlTemplate?: string; + finalUrlSuffix?: string; + labels?: string[]; +} + +/** + * Ad group + */ +export interface AdGroup { + resourceName: string; + id: string; + name: string; + campaign: string; + status: AdGroupStatus; + type?: AdGroupType; + cpcBidMicros?: string; + cpmBidMicros?: string; + targetCpaMicros?: string; + targetRoas?: number; + percentCpcBidMicros?: string; + effectiveTargetCpaMicros?: string; + effectiveTargetRoas?: number; + labels?: string[]; + trackingUrlTemplate?: string; + urlCustomParameters?: Array<{ + key: string; + value: string; + }>; + finalUrlSuffix?: string; +} + +/** + * Ad group type + */ +export type AdGroupType = + | "UNSPECIFIED" + | "UNKNOWN" + | "SEARCH_STANDARD" + | "DISPLAY_STANDARD" + | "SHOPPING_PRODUCT_ADS" + | "HOTEL_ADS" + | "SHOPPING_SMART_ADS" + | "VIDEO_BUMPER" + | "VIDEO_TRUE_VIEW_IN_STREAM" + | "VIDEO_TRUE_VIEW_IN_DISPLAY" + | "VIDEO_NON_SKIPPABLE_IN_STREAM" + | "VIDEO_OUTSTREAM" + | "SEARCH_DYNAMIC_ADS" + | "SHOPPING_COMPARISON_LISTING_ADS" + | "PROMOTED_HOTEL_ADS" + | "VIDEO_RESPONSIVE" + | "VIDEO_EFFICIENT_REACH" + | "SMART_CAMPAIGN_ADS" + | "TRAVEL_ADS"; + +/** + * Ad - containing the ad details + */ +export interface Ad { + resourceName: string; + id: string; + type: AdType; + finalUrls?: string[]; + finalMobileUrls?: string[]; + displayUrl?: string; + trackingUrlTemplate?: string; + urlCustomParameters?: Array<{ + key: string; + value: string; + }>; + finalUrlSuffix?: string; + name?: string; + responsiveSearchAd?: ResponsiveSearchAd; + responsiveDisplayAd?: ResponsiveDisplayAd; + expandedTextAd?: ExpandedTextAd; +} + +/** + * Responsive search ad + */ +export interface ResponsiveSearchAd { + headlines: Array<{ + text: string; + pinnedField?: + | "UNSPECIFIED" + | "UNKNOWN" + | "HEADLINE_1" + | "HEADLINE_2" + | "HEADLINE_3"; + }>; + descriptions: Array<{ + text: string; + pinnedField?: "UNSPECIFIED" | "UNKNOWN" | "DESCRIPTION_1" | "DESCRIPTION_2"; + }>; + path1?: string; + path2?: string; +} + +/** + * Responsive display ad + */ +export interface ResponsiveDisplayAd { + marketingImages?: Array<{ + asset: string; + }>; + squareMarketingImages?: Array<{ + asset: string; + }>; + logoImages?: Array<{ + asset: string; + }>; + squareLogoImages?: Array<{ + asset: string; + }>; + headlines: Array<{ + text: string; + }>; + longHeadline: { + text: string; + }; + descriptions: Array<{ + text: string; + }>; + businessName: string; + callToActionText?: string; + mainColor?: string; + accentColor?: string; +} + +/** + * Expanded text ad (legacy) + */ +export interface ExpandedTextAd { + headlinePart1: string; + headlinePart2: string; + headlinePart3?: string; + description: string; + description2?: string; + path1?: string; + path2?: string; +} + +/** + * Ad group ad (combination of ad group and ad) + */ +export interface AdGroupAd { + resourceName: string; + adGroup: string; + ad: Ad; + status: AdGroupAdStatus; + policySummary?: { + approvalStatus?: string; + policyTopicEntries?: Array<{ + topic?: string; + type?: string; + }>; + reviewStatus?: string; + }; + labels?: string[]; +} + +/** + * Keyword criterion + */ +export interface KeywordInfo { + text: string; + matchType: KeywordMatchType; +} + +/** + * Ad group criterion (includes keywords) + */ +export interface AdGroupCriterion { + resourceName: string; + criterionId: string; + adGroup: string; + status: AdGroupCriterionStatus; + type?: + | "UNSPECIFIED" + | "UNKNOWN" + | "KEYWORD" + | "PLACEMENT" + | "MOBILE_APP_CATEGORY" + | "MOBILE_APPLICATION" + | "DEVICE" + | "LOCATION" + | "LISTING_GROUP" + | "AD_SCHEDULE" + | "AGE_RANGE" + | "GENDER" + | "INCOME_RANGE" + | "PARENTAL_STATUS" + | "YOUTUBE_VIDEO" + | "YOUTUBE_CHANNEL" + | "USER_LIST" + | "PROXIMITY" + | "TOPIC" + | "LISTING_SCOPE" + | "LANGUAGE" + | "IP_BLOCK" + | "CONTENT_LABEL" + | "CARRIER" + | "USER_INTEREST" + | "WEBPAGE" + | "OPERATING_SYSTEM_VERSION" + | "APP_PAYMENT_MODEL" + | "MOBILE_DEVICE" + | "CUSTOM_AFFINITY" + | "CUSTOM_INTENT" + | "LOCATION_GROUP" + | "CUSTOM_AUDIENCE" + | "COMBINED_AUDIENCE" + | "KEYWORD_THEME" + | "AUDIENCE" + | "LOCAL_SERVICE_ID" + | "BRAND" + | "BRAND_LIST" + | "LIFE_EVENT" + | "SEARCH_THEME"; + keyword?: KeywordInfo; + bidModifier?: number; + cpcBidMicros?: string; + effectiveCpcBidMicros?: string; + qualityInfo?: { + qualityScore?: number; + creativenessScore?: + | "UNSPECIFIED" + | "UNKNOWN" + | "BELOW_AVERAGE" + | "AVERAGE" + | "ABOVE_AVERAGE"; + postClickQualityScore?: + | "UNSPECIFIED" + | "UNKNOWN" + | "BELOW_AVERAGE" + | "AVERAGE" + | "ABOVE_AVERAGE"; + searchPredictedCtr?: + | "UNSPECIFIED" + | "UNKNOWN" + | "BELOW_AVERAGE" + | "AVERAGE" + | "ABOVE_AVERAGE"; + }; + positionEstimates?: { + firstPageCpcMicros?: string; + firstPositionCpcMicros?: string; + topOfPageCpcMicros?: string; + }; + finalUrls?: string[]; + finalMobileUrls?: string[]; + trackingUrlTemplate?: string; + urlCustomParameters?: Array<{ + key: string; + value: string; + }>; + finalUrlSuffix?: string; + labels?: string[]; + negative?: boolean; +} + +// ============================================================================ +// API Response Types +// ============================================================================ + +/** + * List accessible customers response + */ +export interface ListAccessibleCustomersResponse { + resourceNames: string[]; +} + +/** + * Search stream response row (contains selected resources) + */ +export interface GoogleAdsRow { + customer?: Customer; + campaign?: Campaign; + campaignBudget?: CampaignBudget; + adGroup?: AdGroup; + adGroupAd?: AdGroupAd; + adGroupCriterion?: AdGroupCriterion; + metrics?: Metrics; + segments?: Segments; +} + +/** + * Search response + */ +export interface SearchGoogleAdsResponse { + results: GoogleAdsRow[]; + nextPageToken?: string; + totalResultsCount?: string; + fieldMask?: string; +} + +/** + * Search stream response + */ +export interface SearchGoogleAdsStreamResponse { + results: GoogleAdsRow[]; + fieldMask?: string; + requestId?: string; +} + +// ============================================================================ +// Metrics Types +// ============================================================================ + +/** + * Metrics (performance data) + */ +export interface Metrics { + impressions?: string; + clicks?: string; + costMicros?: string; + conversions?: number; + conversionsValue?: number; + ctr?: number; + averageCpc?: number; + averageCpm?: number; + averageCost?: number; + allConversions?: number; + allConversionsValue?: number; + viewThroughConversions?: string; + interactionRate?: number; + interactions?: string; + engagementRate?: number; + engagements?: string; + videoViews?: string; + videoViewRate?: number; + averageCpv?: number; + absoluteTopImpressionPercentage?: number; + topImpressionPercentage?: number; + searchImpressionShare?: number; + searchRankLostImpressionShare?: number; + searchBudgetLostImpressionShare?: number; + contentImpressionShare?: number; + contentRankLostImpressionShare?: number; + contentBudgetLostImpressionShare?: number; +} + +/** + * Segments (for breakdown) + */ +export interface Segments { + date?: string; + dayOfWeek?: + | "UNSPECIFIED" + | "UNKNOWN" + | "MONDAY" + | "TUESDAY" + | "WEDNESDAY" + | "THURSDAY" + | "FRIDAY" + | "SATURDAY" + | "SUNDAY"; + device?: + | "UNSPECIFIED" + | "UNKNOWN" + | "MOBILE" + | "TABLET" + | "DESKTOP" + | "CONNECTED_TV" + | "OTHER"; + hour?: number; + month?: string; + quarter?: string; + week?: string; + year?: number; + adNetworkType?: + | "UNSPECIFIED" + | "UNKNOWN" + | "SEARCH" + | "SEARCH_PARTNERS" + | "CONTENT" + | "YOUTUBE_SEARCH" + | "YOUTUBE_WATCH" + | "MIXED" + | "GOOGLE_TV"; + conversionAction?: string; + conversionActionCategory?: string; + conversionActionName?: string; + geoTargetCity?: string; + geoTargetCountry?: string; + geoTargetMetro?: string; + geoTargetRegion?: string; +} + +// ============================================================================ +// Input Types (for mutations) +// ============================================================================ + +/** + * Input for creating a campaign budget + */ +export interface CreateCampaignBudgetInput { + name: string; + amountMicros: string; + deliveryMethod?: BudgetDeliveryMethod; + explicitlyShared?: boolean; +} + +/** + * Input for creating a campaign + */ +export interface CreateCampaignInput { + name: string; + advertisingChannelType: AdvertisingChannelType; + status?: CampaignStatus; + campaignBudget: string; + startDate?: string; + endDate?: string; + biddingStrategyType?: BiddingStrategyType; + targetCpaMicros?: string; + targetRoas?: number; + manualCpc?: { + enhancedCpcEnabled?: boolean; + }; + networkSettings?: { + targetGoogleSearch?: boolean; + targetSearchNetwork?: boolean; + targetContentNetwork?: boolean; + targetPartnerSearchNetwork?: boolean; + }; +} + +/** + * Input for updating a campaign + */ +export interface UpdateCampaignInput { + resourceName: string; + name?: string; + status?: CampaignStatus; + startDate?: string; + endDate?: string; + targetCpaMicros?: string; + targetRoas?: number; + networkSettings?: { + targetGoogleSearch?: boolean; + targetSearchNetwork?: boolean; + targetContentNetwork?: boolean; + targetPartnerSearchNetwork?: boolean; + }; +} + +/** + * Input for creating an ad group + */ +export interface CreateAdGroupInput { + name: string; + campaign: string; + status?: AdGroupStatus; + type?: AdGroupType; + cpcBidMicros?: string; + cpmBidMicros?: string; + targetCpaMicros?: string; +} + +/** + * Input for updating an ad group + */ +export interface UpdateAdGroupInput { + resourceName: string; + name?: string; + status?: AdGroupStatus; + cpcBidMicros?: string; + cpmBidMicros?: string; + targetCpaMicros?: string; +} + +/** + * Input for creating a responsive search ad + */ +export interface CreateResponsiveSearchAdInput { + adGroup: string; + status?: AdGroupAdStatus; + finalUrls: string[]; + headlines: Array<{ + text: string; + }>; + descriptions: Array<{ + text: string; + }>; + path1?: string; + path2?: string; +} + +/** + * Input for updating an ad + */ +export interface UpdateAdGroupAdInput { + resourceName: string; + status?: AdGroupAdStatus; +} + +/** + * Input for creating a keyword + */ +export interface CreateKeywordInput { + adGroup: string; + status?: AdGroupCriterionStatus; + keyword: { + text: string; + matchType: KeywordMatchType; + }; + cpcBidMicros?: string; + finalUrls?: string[]; + negative?: boolean; +} + +/** + * Input for updating a keyword + */ +export interface UpdateKeywordInput { + resourceName: string; + status?: AdGroupCriterionStatus; + cpcBidMicros?: string; + finalUrls?: string[]; +} + +// ============================================================================ +// Mutation Response Types +// ============================================================================ + +/** + * Mutate operation result + */ +export interface MutateOperationResult { + resourceName: string; +} + +/** + * Mutate campaign response + */ +export interface MutateCampaignsResponse { + results: MutateOperationResult[]; + partialFailureError?: GoogleAdsError; +} + +/** + * Mutate campaign budgets response + */ +export interface MutateCampaignBudgetsResponse { + results: MutateOperationResult[]; + partialFailureError?: GoogleAdsError; +} + +/** + * Mutate ad groups response + */ +export interface MutateAdGroupsResponse { + results: MutateOperationResult[]; + partialFailureError?: GoogleAdsError; +} + +/** + * Mutate ad group ads response + */ +export interface MutateAdGroupAdsResponse { + results: MutateOperationResult[]; + partialFailureError?: GoogleAdsError; +} + +/** + * Mutate ad group criteria response + */ +export interface MutateAdGroupCriteriaResponse { + results: MutateOperationResult[]; + partialFailureError?: GoogleAdsError; +} + +// ============================================================================ +// Error Types +// ============================================================================ + +/** + * Google Ads API error + */ +export interface GoogleAdsError { + errors: Array<{ + errorCode?: Record; + message?: string; + trigger?: { + stringValue?: string; + }; + location?: { + fieldPathElements?: Array<{ + fieldName?: string; + index?: number; + }>; + }; + }>; + message?: string; +} + +/** + * API error response + */ +export interface ApiErrorResponse { + error: { + code: number; + message: string; + status: string; + details?: Array<{ + "@type": string; + errors?: GoogleAdsError["errors"]; + }>; + }; +} + +// ============================================================================ +// Custom Error Classes +// ============================================================================ + +/** + * Base error for Google Ads API errors + */ +export class GoogleAdsApiError extends Error { + public readonly code: number; + public readonly status: string; + public readonly details?: GoogleAdsError; + + constructor( + message: string, + code: number, + status: string, + details?: GoogleAdsError, + ) { + super(message); + this.name = "GoogleAdsApiError"; + this.code = code; + this.status = status; + this.details = details; + } +} + +/** + * Error for authentication issues + */ +export class GoogleAdsAuthError extends Error { + constructor(message: string) { + super(message); + this.name = "GoogleAdsAuthError"; + } +} + +/** + * Error for configuration issues + */ +export class GoogleAdsConfigError extends Error { + constructor(message: string) { + super(message); + this.name = "GoogleAdsConfigError"; + } +} diff --git a/google-ads/server/main.ts b/google-ads/server/main.ts new file mode 100644 index 00000000..eebfb495 --- /dev/null +++ b/google-ads/server/main.ts @@ -0,0 +1,125 @@ +/** + * Google Ads MCP Server + * + * This MCP provides tools for interacting with Google Ads API v18, + * including campaign, ad group, ad, and keyword management, + * as well as performance reporting. + */ +import { withRuntime } from "@decocms/runtime"; +import { serve } from "@decocms/mcps-shared/serve"; + +import { tools } from "./tools/index.ts"; +import type { Env } from "../shared/deco.gen.ts"; + +export type { Env }; + +const GOOGLE_ADS_SCOPES = ["https://www.googleapis.com/auth/adwords"].join(" "); + +// Store the last used redirect_uri for token exchange +let lastRedirectUri: string | null = null; + +interface OAuthTokenResponse { + access_token: string; + refresh_token?: string; + expires_in?: number; + token_type: string; +} + +interface ExchangeCodeParams { + code: string; + code_verifier?: string; + code_challenge_method?: string; +} + +const runtime = withRuntime({ + tools: (env: Env) => tools.map((createTool) => createTool(env)), + oauth: { + mode: "PKCE", + // Used in protected resource metadata to point to the auth server + authorizationServer: "https://accounts.google.com", + + // Generates the URL to redirect users to for authorization + authorizationUrl: (callbackUrl) => { + // Parse the callback URL to extract base URL and state parameter + // Google OAuth doesn't allow 'state' inside redirect_uri + const callbackUrlObj = new URL(callbackUrl); + const state = callbackUrlObj.searchParams.get("state"); + + // Remove state from redirect_uri (Google requires clean redirect_uri) + callbackUrlObj.searchParams.delete("state"); + const cleanRedirectUri = callbackUrlObj.toString(); + + // Store for later use in exchangeCode + lastRedirectUri = cleanRedirectUri; + + const url = new URL("https://accounts.google.com/o/oauth2/v2/auth"); + url.searchParams.set("redirect_uri", cleanRedirectUri); + url.searchParams.set("client_id", process.env.GOOGLE_CLIENT_ID!); + url.searchParams.set("response_type", "code"); + url.searchParams.set("scope", GOOGLE_ADS_SCOPES); + url.searchParams.set("access_type", "offline"); + url.searchParams.set("prompt", "consent"); + + // Pass state as a separate OAuth parameter (Google will return it in the callback) + if (state) { + url.searchParams.set("state", state); + } + + return url.toString(); + }, + + // Exchanges the authorization code for access token + exchangeCode: async ({ + code, + code_verifier, + code_challenge_method, + }: ExchangeCodeParams) => { + // Use the stored redirect_uri from authorizationUrl + const cleanRedirectUri = lastRedirectUri; + + if (!cleanRedirectUri) { + throw new Error( + "redirect_uri is required for Google OAuth token exchange", + ); + } + + const params = new URLSearchParams({ + code, + client_id: process.env.GOOGLE_CLIENT_ID!, + client_secret: process.env.GOOGLE_CLIENT_SECRET!, + grant_type: "authorization_code", + redirect_uri: cleanRedirectUri, + }); + + // Add PKCE verifier if provided + if (code_verifier) { + params.set("code_verifier", code_verifier); + } + if (code_challenge_method) { + params.set("code_challenge_method", code_challenge_method); + } + + const response = await fetch("https://oauth2.googleapis.com/token", { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: params, + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`Google OAuth failed: ${response.status} - ${error}`); + } + + const data = (await response.json()) as OAuthTokenResponse; + + return { + access_token: data.access_token, + refresh_token: data.refresh_token, + token_type: data.token_type || "Bearer", + expires_in: data.expires_in, + }; + }, + }, +}); + +serve(runtime.fetch); diff --git a/google-ads/server/tools/accounts.ts b/google-ads/server/tools/accounts.ts new file mode 100644 index 00000000..06efcea9 --- /dev/null +++ b/google-ads/server/tools/accounts.ts @@ -0,0 +1,115 @@ +/** + * Account Management Tools + * + * Tools for listing and getting Google Ads customer accounts + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; + +// ============================================================================ +// List Accessible Customers Tool +// ============================================================================ + +export const createListAccessibleCustomersTool = (env: Env) => + createPrivateTool({ + id: "list_accessible_customers", + description: + "List all Google Ads customer accounts accessible by the authenticated user. Returns customer resource names that can be used to get customer details.", + inputSchema: z.object({}), + outputSchema: z.object({ + customers: z.array( + z.object({ + resourceName: z + .string() + .describe("Customer resource name (e.g., 'customers/1234567890')"), + customerId: z.string().describe("Extracted customer ID"), + }), + ), + count: z.number().describe("Number of accessible customers"), + }), + execute: async () => { + const client = createGoogleAdsClient(env); + const response = await client.listAccessibleCustomers(); + + const customers = (response.resourceNames || []).map((resourceName) => { + // Extract customer ID from resource name (e.g., 'customers/1234567890' -> '1234567890') + const customerId = resourceName.replace("customers/", ""); + return { + resourceName, + customerId, + }; + }); + + return { + customers, + count: customers.length, + }; + }, + }); + +// ============================================================================ +// Get Customer Tool +// ============================================================================ + +export const createGetCustomerTool = (env: Env) => + createPrivateTool({ + id: "get_customer", + description: + "Get detailed information about a specific Google Ads customer account including name, currency, timezone, and settings.", + inputSchema: z.object({ + customerId: z + .string() + .describe( + "Google Ads customer ID (e.g., '1234567890', without hyphens)", + ), + }), + outputSchema: z.object({ + customer: z + .object({ + resourceName: z.string(), + id: z.string(), + descriptiveName: z.string(), + currencyCode: z.string(), + timeZone: z.string(), + trackingUrlTemplate: z.string().optional(), + autoTaggingEnabled: z.boolean().optional(), + manager: z.boolean().optional(), + testAccount: z.boolean().optional(), + }) + .nullable(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const customer = await client.getCustomer(context.customerId); + + if (!customer) { + return { customer: null }; + } + + return { + customer: { + resourceName: customer.resourceName, + id: customer.id, + descriptiveName: customer.descriptiveName, + currencyCode: customer.currencyCode, + timeZone: customer.timeZone, + trackingUrlTemplate: customer.trackingUrlTemplate, + autoTaggingEnabled: customer.autoTaggingEnabled, + manager: customer.manager, + testAccount: customer.testAccount, + }, + }; + }, + }); + +// ============================================================================ +// Export all account tools +// ============================================================================ + +export const accountTools = [ + createListAccessibleCustomersTool, + createGetCustomerTool, +]; diff --git a/google-ads/server/tools/ad-groups.ts b/google-ads/server/tools/ad-groups.ts new file mode 100644 index 00000000..306363de --- /dev/null +++ b/google-ads/server/tools/ad-groups.ts @@ -0,0 +1,348 @@ +/** + * Ad Group Management Tools + * + * Tools for listing, creating, updating, and managing Google Ads ad groups + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; +import type { AdGroupStatus, AdGroupType } from "../lib/types.ts"; + +// ============================================================================ +// List Ad Groups Tool +// ============================================================================ + +export const createListAdGroupsTool = (env: Env) => + createPrivateTool({ + id: "list_ad_groups", + description: + "List ad groups for a Google Ads customer account. Can optionally filter by campaign.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignId: z + .string() + .optional() + .describe("Optional campaign ID to filter ad groups"), + }), + outputSchema: z.object({ + adGroups: z.array( + z.object({ + resourceName: z.string(), + id: z.string(), + name: z.string(), + campaign: z.string(), + status: z.string(), + type: z.string().optional(), + cpcBidMicros: z.string().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const adGroups = await client.listAdGroups( + context.customerId, + context.campaignId, + ); + + return { + adGroups: adGroups.map((adGroup) => ({ + resourceName: adGroup.resourceName, + id: adGroup.id, + name: adGroup.name, + campaign: adGroup.campaign, + status: adGroup.status, + type: adGroup.type, + cpcBidMicros: adGroup.cpcBidMicros, + })), + count: adGroups.length, + }; + }, + }); + +// ============================================================================ +// Get Ad Group Tool +// ============================================================================ + +export const createGetAdGroupTool = (env: Env) => + createPrivateTool({ + id: "get_ad_group", + description: + "Get detailed information about a specific Google Ads ad group.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z.string().describe("Ad group ID"), + }), + outputSchema: z.object({ + adGroup: z + .object({ + resourceName: z.string(), + id: z.string(), + name: z.string(), + campaign: z.string(), + status: z.string(), + type: z.string().optional(), + cpcBidMicros: z.string().optional(), + cpmBidMicros: z.string().optional(), + targetCpaMicros: z.string().optional(), + }) + .nullable(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const adGroup = await client.getAdGroup( + context.customerId, + context.adGroupId, + ); + + if (!adGroup) { + return { adGroup: null }; + } + + return { + adGroup: { + resourceName: adGroup.resourceName, + id: adGroup.id, + name: adGroup.name, + campaign: adGroup.campaign, + status: adGroup.status, + type: adGroup.type, + cpcBidMicros: adGroup.cpcBidMicros, + cpmBidMicros: adGroup.cpmBidMicros, + targetCpaMicros: adGroup.targetCpaMicros, + }, + }; + }, + }); + +// ============================================================================ +// Create Ad Group Tool +// ============================================================================ + +export const createCreateAdGroupTool = (env: Env) => + createPrivateTool({ + id: "create_ad_group", + description: + "Create a new ad group in a Google Ads campaign. Ad groups contain ads and keywords.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignResourceName: z + .string() + .describe( + "Campaign resource name (e.g., 'customers/123/campaigns/456')", + ), + name: z.string().describe("Ad group name"), + status: z + .enum(["ENABLED", "PAUSED"]) + .optional() + .default("PAUSED") + .describe("Initial ad group status (default: PAUSED)"), + type: z + .enum([ + "SEARCH_STANDARD", + "DISPLAY_STANDARD", + "SHOPPING_PRODUCT_ADS", + "VIDEO_TRUE_VIEW_IN_STREAM", + "VIDEO_BUMPER", + "VIDEO_RESPONSIVE", + ]) + .optional() + .describe("Ad group type (inferred from campaign if not specified)"), + cpcBidMicros: z + .string() + .optional() + .describe( + "Default CPC bid in micros (1 dollar = 1,000,000 micros). E.g., '1000000' for $1", + ), + cpmBidMicros: z + .string() + .optional() + .describe("Default CPM bid in micros (for display/video campaigns)"), + targetCpaMicros: z + .string() + .optional() + .describe("Target CPA in micros (for Target CPA bidding)"), + }), + outputSchema: z.object({ + resourceName: z.string().describe("Created ad group resource name"), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const response = await client.createAdGroup(context.customerId, { + name: context.name, + campaign: context.campaignResourceName, + status: (context.status || "PAUSED") as AdGroupStatus, + type: context.type as AdGroupType | undefined, + cpcBidMicros: context.cpcBidMicros, + cpmBidMicros: context.cpmBidMicros, + targetCpaMicros: context.targetCpaMicros, + }); + + const resourceName = response.results[0]?.resourceName; + if (!resourceName) { + throw new Error("Failed to create ad group"); + } + + return { + resourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Update Ad Group Tool +// ============================================================================ + +export const createUpdateAdGroupTool = (env: Env) => + createPrivateTool({ + id: "update_ad_group", + description: + "Update an existing Google Ads ad group. Can change name, status, and bidding settings.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + name: z.string().optional().describe("New ad group name"), + status: z + .enum(["ENABLED", "PAUSED", "REMOVED"]) + .optional() + .describe("New ad group status"), + cpcBidMicros: z + .string() + .optional() + .describe("New default CPC bid in micros"), + cpmBidMicros: z + .string() + .optional() + .describe("New default CPM bid in micros"), + targetCpaMicros: z + .string() + .optional() + .describe("New target CPA in micros"), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const response = await client.updateAdGroup(context.customerId, { + resourceName: context.adGroupResourceName, + name: context.name, + status: context.status as AdGroupStatus | undefined, + cpcBidMicros: context.cpcBidMicros, + cpmBidMicros: context.cpmBidMicros, + targetCpaMicros: context.targetCpaMicros, + }); + + return { + resourceName: + response.results[0]?.resourceName || context.adGroupResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Pause Ad Group Tool +// ============================================================================ + +export const createPauseAdGroupTool = (env: Env) => + createPrivateTool({ + id: "pause_ad_group", + description: + "Pause a Google Ads ad group. Sets the ad group status to PAUSED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + await client.updateAdGroupStatus( + context.customerId, + context.adGroupResourceName, + "PAUSED", + ); + + return { + resourceName: context.adGroupResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Enable Ad Group Tool +// ============================================================================ + +export const createEnableAdGroupTool = (env: Env) => + createPrivateTool({ + id: "enable_ad_group", + description: + "Enable a Google Ads ad group. Sets the ad group status to ENABLED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + await client.updateAdGroupStatus( + context.customerId, + context.adGroupResourceName, + "ENABLED", + ); + + return { + resourceName: context.adGroupResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Export all ad group tools +// ============================================================================ + +export const adGroupTools = [ + createListAdGroupsTool, + createGetAdGroupTool, + createCreateAdGroupTool, + createUpdateAdGroupTool, + createPauseAdGroupTool, + createEnableAdGroupTool, +]; diff --git a/google-ads/server/tools/ads.ts b/google-ads/server/tools/ads.ts new file mode 100644 index 00000000..9e28cdfe --- /dev/null +++ b/google-ads/server/tools/ads.ts @@ -0,0 +1,294 @@ +/** + * Ad Management Tools + * + * Tools for listing, creating, updating, and managing Google Ads ads + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; +import type { AdGroupAdStatus } from "../lib/types.ts"; + +// ============================================================================ +// List Ads Tool +// ============================================================================ + +export const createListAdsTool = (env: Env) => + createPrivateTool({ + id: "list_ads", + description: + "List ads for a Google Ads customer account. Can optionally filter by ad group.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z + .string() + .optional() + .describe("Optional ad group ID to filter ads"), + }), + outputSchema: z.object({ + ads: z.array( + z.object({ + resourceName: z.string(), + adId: z.string(), + adName: z.string().optional(), + adType: z.string(), + adGroup: z.string(), + status: z.string(), + finalUrls: z.array(z.string()).optional(), + approvalStatus: z.string().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const ads = await client.listAds(context.customerId, context.adGroupId); + + return { + ads: ads.map((adGroupAd) => ({ + resourceName: adGroupAd.resourceName, + adId: adGroupAd.ad.id, + adName: adGroupAd.ad.name, + adType: adGroupAd.ad.type, + adGroup: adGroupAd.adGroup, + status: adGroupAd.status, + finalUrls: adGroupAd.ad.finalUrls, + approvalStatus: adGroupAd.policySummary?.approvalStatus, + })), + count: ads.length, + }; + }, + }); + +// ============================================================================ +// Get Ad Tool +// ============================================================================ + +export const createGetAdTool = (env: Env) => + createPrivateTool({ + id: "get_ad", + description: + "Get detailed information about a specific Google Ads ad including creative content.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z.string().describe("Ad group ID"), + adId: z.string().describe("Ad ID"), + }), + outputSchema: z.object({ + ad: z + .object({ + resourceName: z.string(), + adId: z.string(), + adName: z.string().optional(), + adType: z.string(), + adGroup: z.string(), + status: z.string(), + finalUrls: z.array(z.string()).optional(), + displayUrl: z.string().optional(), + approvalStatus: z.string().optional(), + responsiveSearchAd: z + .object({ + headlines: z.array(z.object({ text: z.string() })), + descriptions: z.array(z.object({ text: z.string() })), + path1: z.string().optional(), + path2: z.string().optional(), + }) + .optional(), + }) + .nullable(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const adGroupAd = await client.getAd( + context.customerId, + context.adGroupId, + context.adId, + ); + + if (!adGroupAd) { + return { ad: null }; + } + + return { + ad: { + resourceName: adGroupAd.resourceName, + adId: adGroupAd.ad.id, + adName: adGroupAd.ad.name, + adType: adGroupAd.ad.type, + adGroup: adGroupAd.adGroup, + status: adGroupAd.status, + finalUrls: adGroupAd.ad.finalUrls, + displayUrl: adGroupAd.ad.displayUrl, + approvalStatus: adGroupAd.policySummary?.approvalStatus, + responsiveSearchAd: adGroupAd.ad.responsiveSearchAd, + }, + }; + }, + }); + +// ============================================================================ +// Create Responsive Search Ad Tool +// ============================================================================ + +export const createCreateResponsiveSearchAdTool = (env: Env) => + createPrivateTool({ + id: "create_responsive_search_ad", + description: + "Create a new Responsive Search Ad (RSA) in a Google Ads ad group. RSAs automatically test different headline and description combinations.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + finalUrls: z + .array(z.string()) + .describe("Landing page URLs (usually just one URL)"), + headlines: z + .array(z.string()) + .min(3) + .max(15) + .describe("Ad headlines (3-15 headlines, each max 30 characters)"), + descriptions: z + .array(z.string()) + .min(2) + .max(4) + .describe("Ad descriptions (2-4 descriptions, each max 90 characters)"), + path1: z + .string() + .optional() + .describe("Display URL path 1 (max 15 characters)"), + path2: z + .string() + .optional() + .describe("Display URL path 2 (max 15 characters, requires path1)"), + status: z + .enum(["ENABLED", "PAUSED"]) + .optional() + .default("PAUSED") + .describe("Initial ad status (default: PAUSED)"), + }), + outputSchema: z.object({ + resourceName: z.string().describe("Created ad resource name"), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const response = await client.createResponsiveSearchAd( + context.customerId, + { + adGroup: context.adGroupResourceName, + status: (context.status || "PAUSED") as AdGroupAdStatus, + finalUrls: context.finalUrls, + headlines: context.headlines.map((text) => ({ text })), + descriptions: context.descriptions.map((text) => ({ text })), + path1: context.path1, + path2: context.path2, + }, + ); + + const resourceName = response.results[0]?.resourceName; + if (!resourceName) { + throw new Error("Failed to create ad"); + } + + return { + resourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Pause Ad Tool +// ============================================================================ + +export const createPauseAdTool = (env: Env) => + createPrivateTool({ + id: "pause_ad", + description: "Pause a Google Ads ad. Sets the ad status to PAUSED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adResourceName: z + .string() + .describe( + "Ad resource name (e.g., 'customers/123/adGroupAds/456~789')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + await client.updateAdStatus( + context.customerId, + context.adResourceName, + "PAUSED", + ); + + return { + resourceName: context.adResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Enable Ad Tool +// ============================================================================ + +export const createEnableAdTool = (env: Env) => + createPrivateTool({ + id: "enable_ad", + description: "Enable a Google Ads ad. Sets the ad status to ENABLED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adResourceName: z + .string() + .describe( + "Ad resource name (e.g., 'customers/123/adGroupAds/456~789')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + await client.updateAdStatus( + context.customerId, + context.adResourceName, + "ENABLED", + ); + + return { + resourceName: context.adResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Export all ad tools +// ============================================================================ + +export const adTools = [ + createListAdsTool, + createGetAdTool, + createCreateResponsiveSearchAdTool, + createPauseAdTool, + createEnableAdTool, +]; diff --git a/google-ads/server/tools/campaigns.ts b/google-ads/server/tools/campaigns.ts new file mode 100644 index 00000000..eb80aeea --- /dev/null +++ b/google-ads/server/tools/campaigns.ts @@ -0,0 +1,440 @@ +/** + * Campaign Management Tools + * + * Tools for listing, creating, updating, and managing Google Ads campaigns + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; +import type { CampaignStatus, AdvertisingChannelType } from "../lib/types.ts"; + +// ============================================================================ +// List Campaigns Tool +// ============================================================================ + +export const createListCampaignsTool = (env: Env) => + createPrivateTool({ + id: "list_campaigns", + description: + "List all campaigns for a Google Ads customer account. Can optionally filter by status.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + statusFilter: z + .enum(["ENABLED", "PAUSED", "REMOVED"]) + .optional() + .describe("Filter campaigns by status"), + }), + outputSchema: z.object({ + campaigns: z.array( + z.object({ + resourceName: z.string(), + id: z.string(), + name: z.string(), + status: z.string(), + advertisingChannelType: z.string(), + advertisingChannelSubType: z.string().optional(), + biddingStrategyType: z.string().optional(), + startDate: z.string().optional(), + endDate: z.string().optional(), + servingStatus: z.string().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const campaigns = await client.listCampaigns( + context.customerId, + context.statusFilter as CampaignStatus | undefined, + ); + + return { + campaigns: campaigns.map((campaign) => ({ + resourceName: campaign.resourceName, + id: campaign.id, + name: campaign.name, + status: campaign.status, + advertisingChannelType: campaign.advertisingChannelType, + advertisingChannelSubType: campaign.advertisingChannelSubType, + biddingStrategyType: campaign.biddingStrategyType, + startDate: campaign.startDate, + endDate: campaign.endDate, + servingStatus: campaign.servingStatus, + })), + count: campaigns.length, + }; + }, + }); + +// ============================================================================ +// Get Campaign Tool +// ============================================================================ + +export const createGetCampaignTool = (env: Env) => + createPrivateTool({ + id: "get_campaign", + description: + "Get detailed information about a specific Google Ads campaign including settings and configuration.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignId: z.string().describe("Campaign ID"), + }), + outputSchema: z.object({ + campaign: z + .object({ + resourceName: z.string(), + id: z.string(), + name: z.string(), + status: z.string(), + advertisingChannelType: z.string(), + advertisingChannelSubType: z.string().optional(), + biddingStrategyType: z.string().optional(), + startDate: z.string().optional(), + endDate: z.string().optional(), + campaignBudget: z.string().optional(), + servingStatus: z.string().optional(), + networkSettings: z + .object({ + targetGoogleSearch: z.boolean().optional(), + targetSearchNetwork: z.boolean().optional(), + targetContentNetwork: z.boolean().optional(), + }) + .optional(), + }) + .nullable(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const campaign = await client.getCampaign( + context.customerId, + context.campaignId, + ); + + if (!campaign) { + return { campaign: null }; + } + + return { + campaign: { + resourceName: campaign.resourceName, + id: campaign.id, + name: campaign.name, + status: campaign.status, + advertisingChannelType: campaign.advertisingChannelType, + advertisingChannelSubType: campaign.advertisingChannelSubType, + biddingStrategyType: campaign.biddingStrategyType, + startDate: campaign.startDate, + endDate: campaign.endDate, + campaignBudget: campaign.campaignBudget, + servingStatus: campaign.servingStatus, + networkSettings: campaign.networkSettings, + }, + }; + }, + }); + +// ============================================================================ +// Create Campaign Tool +// ============================================================================ + +export const createCreateCampaignTool = (env: Env) => + createPrivateTool({ + id: "create_campaign", + description: + "Create a new Google Ads campaign. First create a campaign budget, then create the campaign with the budget resource name.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + name: z.string().describe("Campaign name"), + advertisingChannelType: z + .enum([ + "SEARCH", + "DISPLAY", + "SHOPPING", + "VIDEO", + "PERFORMANCE_MAX", + "DEMAND_GEN", + "LOCAL", + "SMART", + "HOTEL", + "LOCAL_SERVICES", + "TRAVEL", + "DISCOVERY", + ]) + .describe("Campaign type (e.g., SEARCH, DISPLAY, VIDEO)"), + budgetAmountMicros: z + .string() + .describe( + "Daily budget amount in micros (1 dollar = 1,000,000 micros). E.g., '10000000' for $10", + ), + budgetName: z + .string() + .optional() + .describe("Budget name (defaults to campaign name + ' Budget')"), + status: z + .enum(["ENABLED", "PAUSED"]) + .optional() + .default("PAUSED") + .describe("Initial campaign status (default: PAUSED)"), + startDate: z + .string() + .optional() + .describe("Campaign start date (YYYY-MM-DD format)"), + endDate: z + .string() + .optional() + .describe("Campaign end date (YYYY-MM-DD format)"), + targetGoogleSearch: z + .boolean() + .optional() + .describe("Target Google Search (for SEARCH campaigns)"), + targetSearchNetwork: z + .boolean() + .optional() + .describe("Target Search Network partners"), + targetContentNetwork: z + .boolean() + .optional() + .describe("Target Display Network"), + manualCpcEnabled: z + .boolean() + .optional() + .describe("Use Manual CPC bidding strategy"), + enhancedCpcEnabled: z + .boolean() + .optional() + .describe("Enable Enhanced CPC (only with Manual CPC)"), + }), + outputSchema: z.object({ + campaignResourceName: z + .string() + .describe("Created campaign resource name"), + budgetResourceName: z.string().describe("Created budget resource name"), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + + // First, create the campaign budget + const budgetResponse = await client.createCampaignBudget( + context.customerId, + { + name: context.budgetName || `${context.name} Budget`, + amountMicros: context.budgetAmountMicros, + deliveryMethod: "STANDARD", + }, + ); + + const budgetResourceName = budgetResponse.results[0]?.resourceName; + if (!budgetResourceName) { + throw new Error("Failed to create campaign budget"); + } + + // Build network settings if any are specified + const networkSettings = + context.targetGoogleSearch !== undefined || + context.targetSearchNetwork !== undefined || + context.targetContentNetwork !== undefined + ? { + targetGoogleSearch: context.targetGoogleSearch, + targetSearchNetwork: context.targetSearchNetwork, + targetContentNetwork: context.targetContentNetwork, + } + : undefined; + + // Build manual CPC settings if specified + const manualCpc = context.manualCpcEnabled + ? { enhancedCpcEnabled: context.enhancedCpcEnabled } + : undefined; + + // Then, create the campaign + const campaignResponse = await client.createCampaign(context.customerId, { + name: context.name, + advertisingChannelType: + context.advertisingChannelType as AdvertisingChannelType, + status: (context.status || "PAUSED") as CampaignStatus, + campaignBudget: budgetResourceName, + startDate: context.startDate, + endDate: context.endDate, + networkSettings, + manualCpc, + }); + + const campaignResourceName = campaignResponse.results[0]?.resourceName; + if (!campaignResourceName) { + throw new Error("Failed to create campaign"); + } + + return { + campaignResourceName, + budgetResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Update Campaign Tool +// ============================================================================ + +export const createUpdateCampaignTool = (env: Env) => + createPrivateTool({ + id: "update_campaign", + description: + "Update an existing Google Ads campaign. Can change name, status, dates, and network settings.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignResourceName: z + .string() + .describe( + "Campaign resource name (e.g., 'customers/123/campaigns/456')", + ), + name: z.string().optional().describe("New campaign name"), + status: z + .enum(["ENABLED", "PAUSED", "REMOVED"]) + .optional() + .describe("New campaign status"), + startDate: z + .string() + .optional() + .describe("New start date (YYYY-MM-DD format)"), + endDate: z + .string() + .optional() + .describe("New end date (YYYY-MM-DD format)"), + targetGoogleSearch: z.boolean().optional(), + targetSearchNetwork: z.boolean().optional(), + targetContentNetwork: z.boolean().optional(), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + + const networkSettings = + context.targetGoogleSearch !== undefined || + context.targetSearchNetwork !== undefined || + context.targetContentNetwork !== undefined + ? { + targetGoogleSearch: context.targetGoogleSearch, + targetSearchNetwork: context.targetSearchNetwork, + targetContentNetwork: context.targetContentNetwork, + } + : undefined; + + const response = await client.updateCampaign(context.customerId, { + resourceName: context.campaignResourceName, + name: context.name, + status: context.status as CampaignStatus | undefined, + startDate: context.startDate, + endDate: context.endDate, + networkSettings, + }); + + return { + resourceName: + response.results[0]?.resourceName || context.campaignResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Pause Campaign Tool +// ============================================================================ + +export const createPauseCampaignTool = (env: Env) => + createPrivateTool({ + id: "pause_campaign", + description: + "Pause a Google Ads campaign. Sets the campaign status to PAUSED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignResourceName: z + .string() + .describe( + "Campaign resource name (e.g., 'customers/123/campaigns/456')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + await client.updateCampaignStatus( + context.customerId, + context.campaignResourceName, + "PAUSED", + ); + + return { + resourceName: context.campaignResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Enable Campaign Tool +// ============================================================================ + +export const createEnableCampaignTool = (env: Env) => + createPrivateTool({ + id: "enable_campaign", + description: + "Enable a Google Ads campaign. Sets the campaign status to ENABLED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignResourceName: z + .string() + .describe( + "Campaign resource name (e.g., 'customers/123/campaigns/456')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + await client.updateCampaignStatus( + context.customerId, + context.campaignResourceName, + "ENABLED", + ); + + return { + resourceName: context.campaignResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Export all campaign tools +// ============================================================================ + +export const campaignTools = [ + createListCampaignsTool, + createGetCampaignTool, + createCreateCampaignTool, + createUpdateCampaignTool, + createPauseCampaignTool, + createEnableCampaignTool, +]; diff --git a/google-ads/server/tools/index.ts b/google-ads/server/tools/index.ts new file mode 100644 index 00000000..897c81ae --- /dev/null +++ b/google-ads/server/tools/index.ts @@ -0,0 +1,37 @@ +/** + * Central export point for all Google Ads tools + * + * This file aggregates all tools from different modules into a single + * export, making it easy to import all tools in main.ts. + * + * Tools: + * - accountTools: Account management (list accessible customers, get customer) + * - campaignTools: Campaign management (list, get, create, update, pause, enable) + * - adGroupTools: Ad group management (list, get, create, update, pause, enable) + * - adTools: Ad management (list, get, create responsive search ad, pause, enable) + * - keywordTools: Keyword management (list, get, create, create negative, update, pause, enable, remove) + * - reportTools: Performance reports (account, campaign, ad group, keyword) + */ + +import { accountTools } from "./accounts.ts"; +import { campaignTools } from "./campaigns.ts"; +import { adGroupTools } from "./ad-groups.ts"; +import { adTools } from "./ads.ts"; +import { keywordTools } from "./keywords.ts"; +import { reportTools } from "./reports.ts"; + +// Export all tools from all modules +export const tools = [ + // Account management tools + ...accountTools, + // Campaign management tools + ...campaignTools, + // Ad group management tools + ...adGroupTools, + // Ad management tools + ...adTools, + // Keyword management tools + ...keywordTools, + // Report tools + ...reportTools, +]; diff --git a/google-ads/server/tools/keywords.ts b/google-ads/server/tools/keywords.ts new file mode 100644 index 00000000..480fbd56 --- /dev/null +++ b/google-ads/server/tools/keywords.ts @@ -0,0 +1,442 @@ +/** + * Keyword Management Tools + * + * Tools for listing, creating, updating, and managing Google Ads keywords + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; +import type { KeywordMatchType, AdGroupCriterionStatus } from "../lib/types.ts"; + +// ============================================================================ +// List Keywords Tool +// ============================================================================ + +export const createListKeywordsTool = (env: Env) => + createPrivateTool({ + id: "list_keywords", + description: + "List keywords for a Google Ads customer account. Can optionally filter by ad group.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z + .string() + .optional() + .describe("Optional ad group ID to filter keywords"), + }), + outputSchema: z.object({ + keywords: z.array( + z.object({ + resourceName: z.string(), + criterionId: z.string(), + adGroup: z.string(), + text: z.string(), + matchType: z.string(), + status: z.string(), + cpcBidMicros: z.string().optional(), + negative: z.boolean().optional(), + qualityScore: z.number().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const keywords = await client.listKeywords( + context.customerId, + context.adGroupId, + ); + + return { + keywords: keywords.map((keyword) => ({ + resourceName: keyword.resourceName, + criterionId: keyword.criterionId, + adGroup: keyword.adGroup, + text: keyword.keyword?.text || "", + matchType: keyword.keyword?.matchType || "UNKNOWN", + status: keyword.status, + cpcBidMicros: keyword.cpcBidMicros, + negative: keyword.negative, + qualityScore: keyword.qualityInfo?.qualityScore, + })), + count: keywords.length, + }; + }, + }); + +// ============================================================================ +// Get Keyword Tool +// ============================================================================ + +export const createGetKeywordTool = (env: Env) => + createPrivateTool({ + id: "get_keyword", + description: + "Get detailed information about a specific Google Ads keyword including quality score and bid estimates.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z.string().describe("Ad group ID"), + criterionId: z.string().describe("Keyword criterion ID"), + }), + outputSchema: z.object({ + keyword: z + .object({ + resourceName: z.string(), + criterionId: z.string(), + adGroup: z.string(), + text: z.string(), + matchType: z.string(), + status: z.string(), + cpcBidMicros: z.string().optional(), + negative: z.boolean().optional(), + qualityScore: z.number().optional(), + firstPageCpcMicros: z.string().optional(), + topOfPageCpcMicros: z.string().optional(), + }) + .nullable(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const keyword = await client.getKeyword( + context.customerId, + context.adGroupId, + context.criterionId, + ); + + if (!keyword) { + return { keyword: null }; + } + + return { + keyword: { + resourceName: keyword.resourceName, + criterionId: keyword.criterionId, + adGroup: keyword.adGroup, + text: keyword.keyword?.text || "", + matchType: keyword.keyword?.matchType || "UNKNOWN", + status: keyword.status, + cpcBidMicros: keyword.cpcBidMicros, + negative: keyword.negative, + qualityScore: keyword.qualityInfo?.qualityScore, + firstPageCpcMicros: keyword.positionEstimates?.firstPageCpcMicros, + topOfPageCpcMicros: keyword.positionEstimates?.topOfPageCpcMicros, + }, + }; + }, + }); + +// ============================================================================ +// Create Keyword Tool +// ============================================================================ + +export const createCreateKeywordTool = (env: Env) => + createPrivateTool({ + id: "create_keyword", + description: + "Add a new keyword to a Google Ads ad group. Keywords trigger your ads to show when users search for related terms.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + text: z.string().describe("Keyword text (e.g., 'running shoes')"), + matchType: z + .enum(["EXACT", "PHRASE", "BROAD"]) + .describe( + "Match type: EXACT (most specific), PHRASE (moderate), BROAD (widest reach)", + ), + cpcBidMicros: z + .string() + .optional() + .describe( + "Max CPC bid in micros (1 dollar = 1,000,000 micros). E.g., '500000' for $0.50", + ), + finalUrls: z + .array(z.string()) + .optional() + .describe("Optional landing page URLs specific to this keyword"), + negative: z + .boolean() + .optional() + .describe( + "Set to true to create a negative keyword (blocks ads from showing)", + ), + status: z + .enum(["ENABLED", "PAUSED"]) + .optional() + .default("ENABLED") + .describe("Initial keyword status (default: ENABLED)"), + }), + outputSchema: z.object({ + resourceName: z.string().describe("Created keyword resource name"), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const response = await client.createKeyword(context.customerId, { + adGroup: context.adGroupResourceName, + status: (context.status || "ENABLED") as AdGroupCriterionStatus, + keyword: { + text: context.text, + matchType: context.matchType as KeywordMatchType, + }, + cpcBidMicros: context.cpcBidMicros, + finalUrls: context.finalUrls, + negative: context.negative, + }); + + const resourceName = response.results[0]?.resourceName; + if (!resourceName) { + throw new Error("Failed to create keyword"); + } + + return { + resourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Create Negative Keyword Tool +// ============================================================================ + +export const createCreateNegativeKeywordTool = (env: Env) => + createPrivateTool({ + id: "create_negative_keyword", + description: + "Add a negative keyword to a Google Ads ad group. Negative keywords prevent your ads from showing for certain searches.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + text: z + .string() + .describe( + "Negative keyword text (e.g., 'free' to block searches containing 'free')", + ), + matchType: z + .enum(["EXACT", "PHRASE", "BROAD"]) + .describe("Match type for the negative keyword"), + }), + outputSchema: z.object({ + resourceName: z + .string() + .describe("Created negative keyword resource name"), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const response = await client.createKeyword(context.customerId, { + adGroup: context.adGroupResourceName, + status: "ENABLED", + keyword: { + text: context.text, + matchType: context.matchType as KeywordMatchType, + }, + negative: true, + }); + + const resourceName = response.results[0]?.resourceName; + if (!resourceName) { + throw new Error("Failed to create negative keyword"); + } + + return { + resourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Update Keyword Tool +// ============================================================================ + +export const createUpdateKeywordTool = (env: Env) => + createPrivateTool({ + id: "update_keyword", + description: + "Update an existing Google Ads keyword. Can change status, bid, or landing page URLs.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + keywordResourceName: z + .string() + .describe( + "Keyword resource name (e.g., 'customers/123/adGroupCriteria/456~789')", + ), + status: z + .enum(["ENABLED", "PAUSED", "REMOVED"]) + .optional() + .describe("New keyword status"), + cpcBidMicros: z.string().optional().describe("New max CPC bid in micros"), + finalUrls: z + .array(z.string()) + .optional() + .describe("New landing page URLs"), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const response = await client.updateKeyword(context.customerId, { + resourceName: context.keywordResourceName, + status: context.status as AdGroupCriterionStatus | undefined, + cpcBidMicros: context.cpcBidMicros, + finalUrls: context.finalUrls, + }); + + return { + resourceName: + response.results[0]?.resourceName || context.keywordResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Pause Keyword Tool +// ============================================================================ + +export const createPauseKeywordTool = (env: Env) => + createPrivateTool({ + id: "pause_keyword", + description: + "Pause a Google Ads keyword. Sets the keyword status to PAUSED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + keywordResourceName: z + .string() + .describe( + "Keyword resource name (e.g., 'customers/123/adGroupCriteria/456~789')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + await client.updateKeywordStatus( + context.customerId, + context.keywordResourceName, + "PAUSED", + ); + + return { + resourceName: context.keywordResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Enable Keyword Tool +// ============================================================================ + +export const createEnableKeywordTool = (env: Env) => + createPrivateTool({ + id: "enable_keyword", + description: + "Enable a Google Ads keyword. Sets the keyword status to ENABLED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + keywordResourceName: z + .string() + .describe( + "Keyword resource name (e.g., 'customers/123/adGroupCriteria/456~789')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + await client.updateKeywordStatus( + context.customerId, + context.keywordResourceName, + "ENABLED", + ); + + return { + resourceName: context.keywordResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Remove Keyword Tool +// ============================================================================ + +export const createRemoveKeywordTool = (env: Env) => + createPrivateTool({ + id: "remove_keyword", + description: + "Remove a Google Ads keyword. This permanently deletes the keyword from the ad group.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + keywordResourceName: z + .string() + .describe( + "Keyword resource name (e.g., 'customers/123/adGroupCriteria/456~789')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + await client.removeKeyword( + context.customerId, + context.keywordResourceName, + ); + + return { + resourceName: context.keywordResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Export all keyword tools +// ============================================================================ + +export const keywordTools = [ + createListKeywordsTool, + createGetKeywordTool, + createCreateKeywordTool, + createCreateNegativeKeywordTool, + createUpdateKeywordTool, + createPauseKeywordTool, + createEnableKeywordTool, + createRemoveKeywordTool, +]; diff --git a/google-ads/server/tools/reports.ts b/google-ads/server/tools/reports.ts new file mode 100644 index 00000000..c7a9ac63 --- /dev/null +++ b/google-ads/server/tools/reports.ts @@ -0,0 +1,365 @@ +/** + * Reporting Tools + * + * Tools for getting Google Ads performance reports and metrics + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; + +// Helper to convert micros to currency string +const microsToAmount = (micros: string | undefined): string | undefined => { + if (!micros) return undefined; + const amount = parseInt(micros, 10) / 1_000_000; + return amount.toFixed(2); +}; + +// ============================================================================ +// Get Account Performance Tool +// ============================================================================ + +export const createGetAccountPerformanceTool = (env: Env) => + createPrivateTool({ + id: "get_account_performance", + description: + "Get overall account performance metrics for a Google Ads customer account over a specified date range.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + dateRange: z + .enum([ + "TODAY", + "YESTERDAY", + "LAST_7_DAYS", + "LAST_14_DAYS", + "LAST_30_DAYS", + "LAST_90_DAYS", + "THIS_WEEK_SUN_TODAY", + "THIS_WEEK_MON_TODAY", + "LAST_WEEK_SUN_SAT", + "LAST_WEEK_MON_SUN", + "THIS_MONTH", + "LAST_MONTH", + "ALL_TIME", + ]) + .default("LAST_30_DAYS") + .describe("Date range for the report (default: LAST_30_DAYS)"), + }), + outputSchema: z.object({ + accountId: z.string(), + accountName: z.string().optional(), + dateRange: z.string(), + metrics: z.object({ + impressions: z.string().optional(), + clicks: z.string().optional(), + cost: z.string().optional().describe("Cost in account currency"), + conversions: z.number().optional(), + conversionsValue: z.number().optional(), + ctr: z.number().optional().describe("Click-through rate (percentage)"), + averageCpc: z.string().optional().describe("Average cost per click"), + averageCpm: z + .string() + .optional() + .describe("Average cost per 1000 impressions"), + }), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const rows = await client.getAccountPerformance( + context.customerId, + context.dateRange, + ); + + const row = rows[0]; + if (!row) { + return { + accountId: context.customerId, + dateRange: context.dateRange, + metrics: {}, + }; + } + + return { + accountId: row.customer?.id || context.customerId, + accountName: row.customer?.descriptiveName, + dateRange: context.dateRange, + metrics: { + impressions: row.metrics?.impressions, + clicks: row.metrics?.clicks, + cost: microsToAmount(row.metrics?.costMicros), + conversions: row.metrics?.conversions, + conversionsValue: row.metrics?.conversionsValue, + ctr: row.metrics?.ctr, + averageCpc: microsToAmount(row.metrics?.averageCpc?.toString()), + averageCpm: microsToAmount(row.metrics?.averageCpm?.toString()), + }, + }; + }, + }); + +// ============================================================================ +// Get Campaign Performance Tool +// ============================================================================ + +export const createGetCampaignPerformanceTool = (env: Env) => + createPrivateTool({ + id: "get_campaign_performance", + description: + "Get campaign performance metrics for all campaigns or a specific campaign over a date range. Shows daily breakdown.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignId: z + .string() + .optional() + .describe("Optional campaign ID to filter results"), + dateRange: z + .enum([ + "TODAY", + "YESTERDAY", + "LAST_7_DAYS", + "LAST_14_DAYS", + "LAST_30_DAYS", + "LAST_90_DAYS", + "THIS_WEEK_SUN_TODAY", + "THIS_WEEK_MON_TODAY", + "LAST_WEEK_SUN_SAT", + "LAST_WEEK_MON_SUN", + "THIS_MONTH", + "LAST_MONTH", + "ALL_TIME", + ]) + .default("LAST_30_DAYS") + .describe("Date range for the report (default: LAST_30_DAYS)"), + }), + outputSchema: z.object({ + dateRange: z.string(), + data: z.array( + z.object({ + date: z.string().optional(), + campaignId: z.string(), + campaignName: z.string(), + status: z.string(), + impressions: z.string().optional(), + clicks: z.string().optional(), + cost: z.string().optional(), + conversions: z.number().optional(), + conversionsValue: z.number().optional(), + ctr: z.number().optional(), + averageCpc: z.string().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const rows = await client.getCampaignPerformance( + context.customerId, + context.dateRange, + context.campaignId, + ); + + return { + dateRange: context.dateRange, + data: rows.map((row) => ({ + date: row.segments?.date, + campaignId: row.campaign?.id || "", + campaignName: row.campaign?.name || "", + status: row.campaign?.status || "", + impressions: row.metrics?.impressions, + clicks: row.metrics?.clicks, + cost: microsToAmount(row.metrics?.costMicros), + conversions: row.metrics?.conversions, + conversionsValue: row.metrics?.conversionsValue, + ctr: row.metrics?.ctr, + averageCpc: microsToAmount(row.metrics?.averageCpc?.toString()), + })), + count: rows.length, + }; + }, + }); + +// ============================================================================ +// Get Ad Group Performance Tool +// ============================================================================ + +export const createGetAdGroupPerformanceTool = (env: Env) => + createPrivateTool({ + id: "get_ad_group_performance", + description: + "Get ad group performance metrics over a date range. Can filter by campaign.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignId: z + .string() + .optional() + .describe("Optional campaign ID to filter results"), + dateRange: z + .enum([ + "TODAY", + "YESTERDAY", + "LAST_7_DAYS", + "LAST_14_DAYS", + "LAST_30_DAYS", + "LAST_90_DAYS", + "THIS_WEEK_SUN_TODAY", + "THIS_WEEK_MON_TODAY", + "LAST_WEEK_SUN_SAT", + "LAST_WEEK_MON_SUN", + "THIS_MONTH", + "LAST_MONTH", + "ALL_TIME", + ]) + .default("LAST_30_DAYS") + .describe("Date range for the report (default: LAST_30_DAYS)"), + }), + outputSchema: z.object({ + dateRange: z.string(), + data: z.array( + z.object({ + date: z.string().optional(), + adGroupId: z.string(), + adGroupName: z.string(), + campaign: z.string().optional(), + status: z.string(), + impressions: z.string().optional(), + clicks: z.string().optional(), + cost: z.string().optional(), + conversions: z.number().optional(), + ctr: z.number().optional(), + averageCpc: z.string().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const rows = await client.getAdGroupPerformance( + context.customerId, + context.dateRange, + context.campaignId, + ); + + return { + dateRange: context.dateRange, + data: rows.map((row) => ({ + date: row.segments?.date, + adGroupId: row.adGroup?.id || "", + adGroupName: row.adGroup?.name || "", + campaign: row.adGroup?.campaign, + status: row.adGroup?.status || "", + impressions: row.metrics?.impressions, + clicks: row.metrics?.clicks, + cost: microsToAmount(row.metrics?.costMicros), + conversions: row.metrics?.conversions, + ctr: row.metrics?.ctr, + averageCpc: microsToAmount(row.metrics?.averageCpc?.toString()), + })), + count: rows.length, + }; + }, + }); + +// ============================================================================ +// Get Keyword Performance Tool +// ============================================================================ + +export const createGetKeywordPerformanceTool = (env: Env) => + createPrivateTool({ + id: "get_keyword_performance", + description: + "Get keyword performance metrics over a date range. Shows which keywords are performing best.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z + .string() + .optional() + .describe("Optional ad group ID to filter results"), + dateRange: z + .enum([ + "TODAY", + "YESTERDAY", + "LAST_7_DAYS", + "LAST_14_DAYS", + "LAST_30_DAYS", + "LAST_90_DAYS", + "THIS_WEEK_SUN_TODAY", + "THIS_WEEK_MON_TODAY", + "LAST_WEEK_SUN_SAT", + "LAST_WEEK_MON_SUN", + "THIS_MONTH", + "LAST_MONTH", + "ALL_TIME", + ]) + .default("LAST_30_DAYS") + .describe("Date range for the report (default: LAST_30_DAYS)"), + }), + outputSchema: z.object({ + dateRange: z.string(), + data: z.array( + z.object({ + date: z.string().optional(), + criterionId: z.string(), + keywordText: z.string(), + matchType: z.string(), + adGroupName: z.string().optional(), + status: z.string(), + impressions: z.string().optional(), + clicks: z.string().optional(), + cost: z.string().optional(), + conversions: z.number().optional(), + ctr: z.number().optional(), + averageCpc: z.string().optional(), + qualityScore: z.number().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = createGoogleAdsClient(env); + const rows = await client.getKeywordPerformance( + context.customerId, + context.dateRange, + context.adGroupId, + ); + + return { + dateRange: context.dateRange, + data: rows.map((row) => ({ + date: row.segments?.date, + criterionId: row.adGroupCriterion?.criterionId || "", + keywordText: row.adGroupCriterion?.keyword?.text || "", + matchType: row.adGroupCriterion?.keyword?.matchType || "", + adGroupName: row.adGroup?.name, + status: row.adGroupCriterion?.status || "", + impressions: row.metrics?.impressions, + clicks: row.metrics?.clicks, + cost: microsToAmount(row.metrics?.costMicros), + conversions: row.metrics?.conversions, + ctr: row.metrics?.ctr, + averageCpc: microsToAmount(row.metrics?.averageCpc?.toString()), + qualityScore: row.adGroupCriterion?.qualityInfo?.qualityScore, + })), + count: rows.length, + }; + }, + }); + +// ============================================================================ +// Export all report tools +// ============================================================================ + +export const reportTools = [ + createGetAccountPerformanceTool, + createGetCampaignPerformanceTool, + createGetAdGroupPerformanceTool, + createGetKeywordPerformanceTool, +]; diff --git a/google-ads/shared/deco.gen.ts b/google-ads/shared/deco.gen.ts new file mode 100644 index 00000000..de6575c8 --- /dev/null +++ b/google-ads/shared/deco.gen.ts @@ -0,0 +1,84 @@ +// Generated types for Google Ads MCP + +import { z } from "zod"; + +/** + * User state configuration + */ +export interface State { + /** Google Ads Developer Token */ + developerToken: string; +} + +/** + * Mesh request context injected by the Deco runtime + * Contains authentication and metadata for the current request + */ +export interface MeshRequestContext { + /** OAuth access token from Google */ + authorization?: string; + /** User state configuration */ + state?: State; + /** JWT token for the request */ + token?: string; + /** URL of the mesh server */ + meshUrl?: string; + /** Connection ID for this session */ + connectionId?: string; + /** Function to ensure user is authenticated */ + ensureAuthenticated?: () => Promise; +} + +/** + * Environment type for Google Ads MCP + * Extends process env with Deco runtime context + */ +export interface Env { + /** Google OAuth Client ID */ + GOOGLE_CLIENT_ID: string; + /** Google OAuth Client Secret */ + GOOGLE_CLIENT_SECRET: string; + /** Mesh request context injected by runtime */ + MESH_REQUEST_CONTEXT: MeshRequestContext; + /** Self-reference MCP (if needed) */ + SELF?: Record; + /** Whether running locally */ + IS_LOCAL?: boolean; +} + +/** + * State schema for OAuth flow validation and Google Ads API configuration + */ +export const StateSchema = z.object({ + /** + * Google Ads Developer Token + * Required for API access. Get it from: https://ads.google.com/aw/apicenter + */ + developerToken: z + .string() + .describe("Google Ads Developer Token (from API Center)"), +}); + +/** + * MCP type helper for typed tool definitions + */ +export type Mcp< + T extends Record< + string, + (input: Record) => Promise> + >, +> = { + [K in keyof T]: (( + input: Parameters[0], + ) => Promise>>) & { + asTool: () => Promise<{ + inputSchema: z.ZodType[0]>; + outputSchema?: z.ZodType>>; + description: string; + id: string; + execute: ( + input: Parameters[0], + ) => Promise>>; + }>; + }; +}; diff --git a/google-ads/tsconfig.json b/google-ads/tsconfig.json new file mode 100644 index 00000000..cdb2eab2 --- /dev/null +++ b/google-ads/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022"], + "strict": true, + "noEmit": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "isolatedModules": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "allowImportingTsExtensions": true, + "types": ["node"], + "paths": { + "@decocms/mcps-shared/*": ["../shared/*"] + } + }, + "include": ["server/**/*.ts", "shared/**/*.ts"], + "exclude": ["node_modules", "dist"] +} + diff --git a/google-big-query/.gitignore b/google-big-query/.gitignore new file mode 100644 index 00000000..d68737e3 --- /dev/null +++ b/google-big-query/.gitignore @@ -0,0 +1,5 @@ +dist/ +node_modules/ +.env +.dev.vars + diff --git a/google-big-query/app.json b/google-big-query/app.json new file mode 100644 index 00000000..21aaac13 --- /dev/null +++ b/google-big-query/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "deco", + "name": "google-big-query", + "friendlyName": "Google BigQuery", + "connection": { + "type": "HTTP", + "url": "https://sites-google-big-query.decocache.com/mcp" + }, + "description": "Query and manage Google BigQuery datasets. Execute SQL queries, list datasets and tables, and explore table schemas.", + "icon": "https://cdn.worldvectorlogo.com/logos/google-bigquery-logo-1.svg", + "unlisted": false, + "metadata": { + "categories": ["Data Analysis"], + "official": false, + "tags": ["google", "bigquery", "sql", "data-warehouse", "analytics", "big-data", "cloud"], + "short_description": "Query and manage Google BigQuery datasets. Execute SQL queries, list datasets and tables, and explore table schemas.", + "mesh_description": "The Google BigQuery MCP provides comprehensive access to Google's serverless data warehouse platform, enabling AI agents to execute SQL queries, manage datasets, explore table schemas, and analyze large-scale data. This MCP supports running standard SQL and legacy SQL queries, retrieving query results, managing BigQuery datasets and tables, exploring table metadata and column definitions, and accessing query job history. It enables advanced data analytics workflows including cross-dataset joins, complex aggregations, time-series analysis, and integration with machine learning models. The integration is designed for data analysts, data scientists, and business intelligence applications that need programmatic access to BigQuery for data exploration, reporting, or automated analytics pipelines. Supports query optimization, cost management through query previews, and streaming data access. Ideal for building data-driven AI applications, automated reporting systems, or intelligent data exploration tools." + } +} + diff --git a/google-big-query/package.json b/google-big-query/package.json new file mode 100644 index 00000000..bdae7cb9 --- /dev/null +++ b/google-big-query/package.json @@ -0,0 +1,28 @@ +{ + "name": "google-big-query", + "version": "1.0.0", + "description": "Google BigQuery MCP Server - Query and manage BigQuery datasets", + "private": true, + "type": "module", + "scripts": { + "dev": "bun run --hot server/main.ts", + "build:server": "NODE_ENV=production bun build server/main.ts --target=bun --outfile=dist/server/main.js", + "build": "bun run build:server", + "publish": "cat app.json | deco registry publish -w /shared/deco -y", + "check": "tsc --noEmit" + }, + "dependencies": { + "@decocms/runtime": "^1.1.0", + "zod": "^4.0.0" + }, + "devDependencies": { + "@decocms/mcps-shared": "workspace:*", + "@modelcontextprotocol/sdk": "1.25.1", + "deco-cli": "^0.28.0", + "typescript": "^5.7.2" + }, + "engines": { + "node": ">=22.0.0" + } +} + diff --git a/google-big-query/server/constants.ts b/google-big-query/server/constants.ts new file mode 100644 index 00000000..24d90a82 --- /dev/null +++ b/google-big-query/server/constants.ts @@ -0,0 +1,47 @@ +/** + * BigQuery API Constants + */ + +export const BIGQUERY_API_BASE = "https://bigquery.googleapis.com/bigquery/v2"; + +/** + * BigQuery API Endpoints + */ +export const ENDPOINTS = { + // Datasets + DATASETS: (projectId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/datasets`, + DATASET: (projectId: string, datasetId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/datasets/${datasetId}`, + + // Tables + TABLES: (projectId: string, datasetId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/datasets/${datasetId}/tables`, + TABLE: (projectId: string, datasetId: string, tableId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/datasets/${datasetId}/tables/${tableId}`, + + // Query + QUERY: (projectId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/queries`, + QUERY_RESULTS: (projectId: string, jobId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/queries/${jobId}`, + + // Jobs + JOBS: (projectId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/jobs`, + JOB: (projectId: string, jobId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/jobs/${jobId}`, + + // Projects + PROJECTS: `${BIGQUERY_API_BASE}/projects`, +} as const; + +/** + * Default configuration values + */ +export const DEFAULTS = { + MAX_RESULTS: 1000, + QUERY_TIMEOUT_MS: 60000, + USE_LEGACY_SQL: false, + USE_QUERY_CACHE: true, +} as const; diff --git a/google-big-query/server/lib/bigquery-client.ts b/google-big-query/server/lib/bigquery-client.ts new file mode 100644 index 00000000..a1e669c2 --- /dev/null +++ b/google-big-query/server/lib/bigquery-client.ts @@ -0,0 +1,284 @@ +/** + * BigQuery API client + * Handles all communication with the Google BigQuery API + */ + +import { ENDPOINTS, DEFAULTS } from "../constants.ts"; +import type { + DatasetsListResponse, + Dataset, + TablesListResponse, + Table, + QueryRequest, + QueryResponse, + GetQueryResultsResponse, + TableSchema, + TableRow, +} from "./types.ts"; + +export interface BigQueryClientConfig { + accessToken: string; +} + +export class BigQueryClient { + private accessToken: string; + + constructor(config: BigQueryClientConfig) { + this.accessToken = config.accessToken; + } + + /** + * Make a request to the BigQuery API + */ + private async request(url: string, options: RequestInit = {}): Promise { + const response = await fetch(url, { + ...options, + headers: { + Authorization: `Bearer ${this.accessToken}`, + "Content-Type": "application/json", + ...options.headers, + }, + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`BigQuery API error: ${response.status} - ${error}`); + } + + // Handle 204 No Content + if (response.status === 204) { + return {} as T; + } + + return (await response.json()) as T; + } + + // ==================== Dataset Methods ==================== + + /** + * List all datasets in a project + */ + async listDatasets( + projectId: string, + options?: { + maxResults?: number; + pageToken?: string; + all?: boolean; + }, + ): Promise { + const url = new URL(ENDPOINTS.DATASETS(projectId)); + + if (options?.maxResults) { + url.searchParams.set("maxResults", String(options.maxResults)); + } + if (options?.pageToken) { + url.searchParams.set("pageToken", options.pageToken); + } + if (options?.all) { + url.searchParams.set("all", "true"); + } + + return this.request(url.toString()); + } + + /** + * Get a specific dataset + */ + async getDataset(projectId: string, datasetId: string): Promise { + return this.request(ENDPOINTS.DATASET(projectId, datasetId)); + } + + // ==================== Table Methods ==================== + + /** + * List all tables in a dataset + */ + async listTables( + projectId: string, + datasetId: string, + options?: { + maxResults?: number; + pageToken?: string; + }, + ): Promise { + const url = new URL(ENDPOINTS.TABLES(projectId, datasetId)); + + if (options?.maxResults) { + url.searchParams.set("maxResults", String(options.maxResults)); + } + if (options?.pageToken) { + url.searchParams.set("pageToken", options.pageToken); + } + + return this.request(url.toString()); + } + + /** + * Get a specific table with its schema + */ + async getTable( + projectId: string, + datasetId: string, + tableId: string, + ): Promise { + return this.request
(ENDPOINTS.TABLE(projectId, datasetId, tableId)); + } + + /** + * Get table schema only + */ + async getTableSchema( + projectId: string, + datasetId: string, + tableId: string, + ): Promise { + const table = await this.getTable(projectId, datasetId, tableId); + return table.schema || { fields: [] }; + } + + // ==================== Query Methods ==================== + + /** + * Execute a SQL query + */ + async query( + projectId: string, + options: { + query: string; + useLegacySql?: boolean; + maxResults?: number; + timeoutMs?: number; + dryRun?: boolean; + useQueryCache?: boolean; + defaultDataset?: { + projectId: string; + datasetId: string; + }; + }, + ): Promise { + const queryRequest: QueryRequest = { + query: options.query, + useLegacySql: options.useLegacySql ?? DEFAULTS.USE_LEGACY_SQL, + maxResults: options.maxResults ?? DEFAULTS.MAX_RESULTS, + timeoutMs: options.timeoutMs ?? DEFAULTS.QUERY_TIMEOUT_MS, + dryRun: options.dryRun ?? false, + useQueryCache: options.useQueryCache ?? DEFAULTS.USE_QUERY_CACHE, + }; + + if (options.defaultDataset) { + queryRequest.defaultDataset = options.defaultDataset; + } + + return this.request(ENDPOINTS.QUERY(projectId), { + method: "POST", + body: JSON.stringify(queryRequest), + }); + } + + /** + * Get query results (for long-running queries) + */ + async getQueryResults( + projectId: string, + jobId: string, + options?: { + maxResults?: number; + pageToken?: string; + startIndex?: string; + timeoutMs?: number; + }, + ): Promise { + const url = new URL(ENDPOINTS.QUERY_RESULTS(projectId, jobId)); + + if (options?.maxResults) { + url.searchParams.set("maxResults", String(options.maxResults)); + } + if (options?.pageToken) { + url.searchParams.set("pageToken", options.pageToken); + } + if (options?.startIndex) { + url.searchParams.set("startIndex", options.startIndex); + } + if (options?.timeoutMs) { + url.searchParams.set("timeoutMs", String(options.timeoutMs)); + } + + return this.request(url.toString()); + } + + /** + * Execute query and wait for complete results + * Handles pagination and job completion automatically + */ + async queryAndWait( + projectId: string, + options: { + query: string; + useLegacySql?: boolean; + maxResults?: number; + timeoutMs?: number; + useQueryCache?: boolean; + defaultDataset?: { + projectId: string; + datasetId: string; + }; + maxWaitMs?: number; + }, + ): Promise<{ + schema: TableSchema; + rows: TableRow[]; + totalRows: string; + cacheHit: boolean; + totalBytesProcessed: string; + }> { + // Initial query + let response = await this.query(projectId, options); + + // Wait for job completion if not complete + const maxWaitMs = options.maxWaitMs ?? 300000; // 5 minutes default + const pollIntervalMs = 1000; + const startTime = Date.now(); + + while (!response.jobComplete && response.jobReference) { + // Check if we've exceeded the maximum wait time + if (Date.now() - startTime > maxWaitMs) { + throw new Error( + `Query timeout: Job did not complete within ${maxWaitMs / 1000} seconds. ` + + `Job ID: ${response.jobReference.jobId}`, + ); + } + + await new Promise((resolve) => setTimeout(resolve, pollIntervalMs)); + const results = await this.getQueryResults( + projectId, + response.jobReference.jobId, + { + timeoutMs: options.timeoutMs ?? DEFAULTS.QUERY_TIMEOUT_MS, + }, + ); + response = { + ...response, + ...results, + jobComplete: results.jobComplete, + }; + } + + // Check for errors + if (response.errors && response.errors.length > 0) { + throw new Error( + `Query error: ${response.errors.map((e) => e.message).join(", ")}`, + ); + } + + return { + schema: response.schema || { fields: [] }, + rows: response.rows || [], + totalRows: response.totalRows || "0", + cacheHit: response.cacheHit || false, + totalBytesProcessed: response.totalBytesProcessed || "0", + }; + } +} + +// Re-export getGoogleAccessToken from env.ts for convenience +export { getGoogleAccessToken as getAccessToken } from "./env.ts"; diff --git a/google-big-query/server/lib/env.ts b/google-big-query/server/lib/env.ts new file mode 100644 index 00000000..0e44436a --- /dev/null +++ b/google-big-query/server/lib/env.ts @@ -0,0 +1,17 @@ +import type { Env } from "../../shared/deco.gen.ts"; + +/** + * Get Google OAuth access token from environment context + * @param env - The environment containing the mesh request context + * @returns The OAuth access token + * @throws Error if not authenticated + */ +export const getGoogleAccessToken = (env: Env): string => { + const authorization = env.MESH_REQUEST_CONTEXT?.authorization; + if (!authorization) { + throw new Error( + "Not authenticated. Please authorize with Google BigQuery first.", + ); + } + return authorization; +}; diff --git a/google-big-query/server/lib/types.ts b/google-big-query/server/lib/types.ts new file mode 100644 index 00000000..7c4c3855 --- /dev/null +++ b/google-big-query/server/lib/types.ts @@ -0,0 +1,199 @@ +/** + * BigQuery API Types + */ + +// ==================== Dataset Types ==================== + +export interface Dataset { + kind: string; + id: string; + datasetReference: DatasetReference; + friendlyName?: string; + description?: string; + location?: string; + creationTime?: string; + lastModifiedTime?: string; +} + +export interface DatasetReference { + projectId: string; + datasetId: string; +} + +export interface DatasetsListResponse { + kind: string; + etag?: string; + nextPageToken?: string; + datasets?: Dataset[]; +} + +// ==================== Table Types ==================== + +export interface Table { + kind: string; + id: string; + tableReference: TableReference; + friendlyName?: string; + description?: string; + type?: string; + creationTime?: string; + expirationTime?: string; + numBytes?: string; + numRows?: string; + schema?: TableSchema; +} + +export interface TableReference { + projectId: string; + datasetId: string; + tableId: string; +} + +export interface TableSchema { + fields?: TableFieldSchema[]; +} + +export interface TableFieldSchema { + name: string; + type: string; + mode?: string; + description?: string; + fields?: TableFieldSchema[]; +} + +export interface TablesListResponse { + kind: string; + etag?: string; + nextPageToken?: string; + tables?: Table[]; + totalItems?: number; +} + +// ==================== Query Types ==================== + +export interface QueryRequest { + query: string; + useLegacySql?: boolean; + maxResults?: number; + timeoutMs?: number; + dryRun?: boolean; + useQueryCache?: boolean; + defaultDataset?: DatasetReference; + parameterMode?: string; + queryParameters?: QueryParameter[]; +} + +export interface QueryParameter { + name?: string; + parameterType: QueryParameterType; + parameterValue: QueryParameterValue; +} + +export interface QueryParameterType { + type: string; + arrayType?: QueryParameterType; + structTypes?: Array<{ + name?: string; + type: QueryParameterType; + }>; +} + +export interface QueryParameterValue { + value?: string; + arrayValues?: QueryParameterValue[]; + structValues?: Record; +} + +export interface QueryResponse { + kind: string; + schema?: TableSchema; + jobReference?: JobReference; + totalRows?: string; + pageToken?: string; + rows?: TableRow[]; + totalBytesProcessed?: string; + jobComplete?: boolean; + errors?: ErrorProto[]; + cacheHit?: boolean; + numDmlAffectedRows?: string; +} + +export interface TableRow { + f?: TableCell[]; +} + +export interface TableCell { + v?: unknown; +} + +export interface JobReference { + projectId: string; + jobId: string; + location?: string; +} + +export interface ErrorProto { + reason?: string; + location?: string; + debugInfo?: string; + message?: string; +} + +// ==================== Job Types ==================== + +export interface Job { + kind: string; + etag?: string; + id?: string; + selfLink?: string; + jobReference?: JobReference; + configuration?: JobConfiguration; + status?: JobStatus; + statistics?: JobStatistics; +} + +export interface JobConfiguration { + query?: JobConfigurationQuery; + jobType?: string; +} + +export interface JobConfigurationQuery { + query: string; + destinationTable?: TableReference; + useLegacySql?: boolean; +} + +export interface JobStatus { + state?: string; + errorResult?: ErrorProto; + errors?: ErrorProto[]; +} + +export interface JobStatistics { + creationTime?: string; + startTime?: string; + endTime?: string; + totalBytesProcessed?: string; + query?: JobStatisticsQuery; +} + +export interface JobStatisticsQuery { + totalBytesProcessed?: string; + totalBytesBilled?: string; + cacheHit?: boolean; + statementType?: string; +} + +export interface GetQueryResultsResponse { + kind: string; + etag?: string; + schema?: TableSchema; + jobReference?: JobReference; + totalRows?: string; + pageToken?: string; + rows?: TableRow[]; + totalBytesProcessed?: string; + jobComplete?: boolean; + errors?: ErrorProto[]; + cacheHit?: boolean; +} diff --git a/google-big-query/server/main.ts b/google-big-query/server/main.ts new file mode 100644 index 00000000..c8b0ad8a --- /dev/null +++ b/google-big-query/server/main.ts @@ -0,0 +1,123 @@ +/** + * Google BigQuery MCP Server + * + * This MCP provides tools for interacting with Google BigQuery API, + * including querying datasets, listing tables, and exploring schemas. + */ +import { withRuntime } from "@decocms/runtime"; +import { serve } from "@decocms/mcps-shared/serve"; + +import { tools } from "./tools/index.ts"; +import type { Env } from "../shared/deco.gen.ts"; + +export type { Env }; + +const BIGQUERY_SCOPES = [ + "https://www.googleapis.com/auth/bigquery", + "https://www.googleapis.com/auth/bigquery.readonly", +].join(" "); + +// Store the last used redirect_uri for token exchange +let lastRedirectUri: string | null = null; + +const runtime = withRuntime({ + tools: (env: Env) => tools.map((createTool) => createTool(env)), + oauth: { + mode: "PKCE", + // Used in protected resource metadata to point to the auth server + authorizationServer: "https://accounts.google.com", + + // Generates the URL to redirect users to for authorization + authorizationUrl: (callbackUrl) => { + // Parse the callback URL to extract base URL and state parameter + // Google OAuth doesn't allow 'state' inside redirect_uri + const callbackUrlObj = new URL(callbackUrl); + const state = callbackUrlObj.searchParams.get("state"); + + // Remove state from redirect_uri (Google requires clean redirect_uri) + callbackUrlObj.searchParams.delete("state"); + const cleanRedirectUri = callbackUrlObj.toString(); + + // Store for later use in exchangeCode + lastRedirectUri = cleanRedirectUri; + + const url = new URL("https://accounts.google.com/o/oauth2/v2/auth"); + url.searchParams.set("redirect_uri", cleanRedirectUri); + url.searchParams.set("client_id", process.env.GOOGLE_CLIENT_ID!); + url.searchParams.set("response_type", "code"); + url.searchParams.set("scope", BIGQUERY_SCOPES); + url.searchParams.set("access_type", "offline"); + url.searchParams.set("prompt", "consent"); + + // Pass state as a separate OAuth parameter (Google will return it in the callback) + if (state) { + url.searchParams.set("state", state); + } + + return url.toString(); + }, + + // Exchanges the authorization code for access token + exchangeCode: async ({ + code, + code_verifier, + code_challenge_method, + }: { + code: string; + code_verifier?: string; + code_challenge_method?: string; + }) => { + // Use the stored redirect_uri from authorizationUrl + const cleanRedirectUri = lastRedirectUri; + + if (!cleanRedirectUri) { + throw new Error( + "redirect_uri is required for Google OAuth token exchange", + ); + } + + const params = new URLSearchParams({ + code, + client_id: process.env.GOOGLE_CLIENT_ID!, + client_secret: process.env.GOOGLE_CLIENT_SECRET!, + grant_type: "authorization_code", + redirect_uri: cleanRedirectUri, + }); + + // Add PKCE verifier if provided + if (code_verifier) { + params.set("code_verifier", code_verifier); + } + if (code_challenge_method) { + params.set("code_challenge_method", code_challenge_method); + } + + const response = await fetch("https://oauth2.googleapis.com/token", { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: params, + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`Google OAuth failed: ${response.status} - ${error}`); + } + + const data = (await response.json()) as { + access_token: string; + refresh_token?: string; + expires_in?: number; + token_type: string; + }; + + return { + access_token: data.access_token, + refresh_token: data.refresh_token, + token_type: data.token_type || "Bearer", + expires_in: data.expires_in, + }; + }, + }, +}); + +serve(runtime.fetch); diff --git a/google-big-query/server/tools/bigquery.ts b/google-big-query/server/tools/bigquery.ts new file mode 100644 index 00000000..2152cc16 --- /dev/null +++ b/google-big-query/server/tools/bigquery.ts @@ -0,0 +1,353 @@ +/** + * BigQuery Tools + * + * Tools for querying, listing datasets/tables, and exploring schemas + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { BigQueryClient, getAccessToken } from "../lib/bigquery-client.ts"; + +// ============================================================================ +// Schema Definitions +// ============================================================================ + +const TableFieldSchemaZod: z.ZodType<{ + name: string; + type: string; + mode?: string; + description?: string; + fields?: unknown[]; +}> = z.object({ + name: z.string().describe("Field name"), + type: z + .string() + .describe( + "Field type (STRING, INTEGER, FLOAT, BOOLEAN, TIMESTAMP, RECORD, etc.)", + ), + mode: z + .string() + .optional() + .describe("Field mode (NULLABLE, REQUIRED, REPEATED)"), + description: z.string().optional().describe("Field description"), + fields: z + .array(z.lazy(() => TableFieldSchemaZod)) + .optional() + .describe("Nested fields for RECORD type"), +}); + +const DatasetSchema = z.object({ + id: z.string().describe("Full dataset ID (project:dataset)"), + datasetId: z.string().describe("Dataset ID"), + projectId: z.string().describe("Project ID"), + friendlyName: z.string().optional().describe("Dataset friendly name"), + description: z.string().optional().describe("Dataset description"), + location: z.string().optional().describe("Dataset location"), +}); + +const TableInfoSchema = z.object({ + id: z.string().describe("Full table ID (project:dataset.table)"), + tableId: z.string().describe("Table ID"), + datasetId: z.string().describe("Dataset ID"), + projectId: z.string().describe("Project ID"), + type: z + .string() + .optional() + .describe("Table type (TABLE, VIEW, MATERIALIZED_VIEW, etc.)"), + friendlyName: z.string().optional().describe("Table friendly name"), + description: z.string().optional().describe("Table description"), + numRows: z.string().optional().describe("Number of rows"), + numBytes: z.string().optional().describe("Size in bytes"), +}); + +// ============================================================================ +// Execute Query Tool +// ============================================================================ + +export const createQueryTool = (env: Env) => + createPrivateTool({ + id: "bigquery_query", + description: + "Execute a SQL query against Google BigQuery. Returns the query results with schema information. Supports standard SQL by default.", + inputSchema: z.object({ + projectId: z.string().describe("Google Cloud project ID"), + query: z.string().describe("SQL query to execute"), + useLegacySql: z + .boolean() + .optional() + .describe("Use legacy SQL syntax (default: false, uses standard SQL)"), + maxResults: z.coerce + .number() + .int() + .min(1) + .max(10000) + .optional() + .describe("Maximum number of rows to return (default: 1000)"), + timeoutMs: z.coerce + .number() + .int() + .optional() + .describe("Query timeout in milliseconds (default: 60000)"), + useQueryCache: z + .boolean() + .optional() + .describe("Whether to use query cache (default: true)"), + defaultDatasetId: z + .string() + .optional() + .describe("Default dataset for unqualified table names"), + }), + outputSchema: z.object({ + schema: z + .object({ + fields: z.array(TableFieldSchemaZod).optional(), + }) + .describe("Query result schema"), + rows: z + .array(z.record(z.string(), z.unknown())) + .describe("Query result rows as objects"), + totalRows: z.string().describe("Total number of rows in result"), + cacheHit: z.boolean().describe("Whether results came from cache"), + totalBytesProcessed: z + .string() + .describe("Total bytes processed by the query"), + }), + execute: async ({ context }) => { + const client = new BigQueryClient({ + accessToken: getAccessToken(env), + }); + + const result = await client.queryAndWait(context.projectId, { + query: context.query, + useLegacySql: context.useLegacySql, + maxResults: context.maxResults, + timeoutMs: context.timeoutMs, + useQueryCache: context.useQueryCache, + defaultDataset: context.defaultDatasetId + ? { + projectId: context.projectId, + datasetId: context.defaultDatasetId, + } + : undefined, + }); + + // Convert rows to objects using schema field names + const fieldNames = result.schema.fields?.map((f) => f.name) || []; + const rows = result.rows.map((row) => { + const obj: Record = {}; + row.f?.forEach((cell, index) => { + if (fieldNames[index]) { + obj[fieldNames[index]] = cell.v; + } + }); + return obj; + }); + + return { + schema: result.schema, + rows, + totalRows: result.totalRows, + cacheHit: result.cacheHit, + totalBytesProcessed: result.totalBytesProcessed, + }; + }, + }); + +// ============================================================================ +// List Datasets Tool +// ============================================================================ + +export const createListDatasetsTool = (env: Env) => + createPrivateTool({ + id: "bigquery_list_datasets", + description: + "List all datasets in a Google BigQuery project. Returns dataset IDs, names, and metadata.", + inputSchema: z.object({ + projectId: z.string().describe("Google Cloud project ID"), + maxResults: z.coerce + .number() + .int() + .min(1) + .max(1000) + .optional() + .describe("Maximum number of datasets to return"), + pageToken: z + .string() + .optional() + .describe("Token for fetching next page of results"), + all: z + .boolean() + .optional() + .describe("Whether to list all datasets, including hidden ones"), + }), + outputSchema: z.object({ + datasets: z.array(DatasetSchema).describe("List of datasets"), + nextPageToken: z + .string() + .optional() + .describe("Token for fetching next page"), + }), + execute: async ({ context }) => { + const client = new BigQueryClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.listDatasets(context.projectId, { + maxResults: context.maxResults, + pageToken: context.pageToken, + all: context.all, + }); + + const datasets = (response.datasets || []).map((ds) => ({ + id: ds.id, + datasetId: ds.datasetReference.datasetId, + projectId: ds.datasetReference.projectId, + friendlyName: ds.friendlyName, + description: ds.description, + location: ds.location, + })); + + return { + datasets, + nextPageToken: response.nextPageToken, + }; + }, + }); + +// ============================================================================ +// List Tables Tool +// ============================================================================ + +export const createListTablesTool = (env: Env) => + createPrivateTool({ + id: "bigquery_list_tables", + description: + "List all tables in a Google BigQuery dataset. Returns table IDs, types, and metadata.", + inputSchema: z.object({ + projectId: z.string().describe("Google Cloud project ID"), + datasetId: z.string().describe("Dataset ID"), + maxResults: z.coerce + .number() + .int() + .min(1) + .max(1000) + .optional() + .describe("Maximum number of tables to return"), + pageToken: z + .string() + .optional() + .describe("Token for fetching next page of results"), + }), + outputSchema: z.object({ + tables: z.array(TableInfoSchema).describe("List of tables"), + nextPageToken: z + .string() + .optional() + .describe("Token for fetching next page"), + totalItems: z.number().optional().describe("Total number of tables"), + }), + execute: async ({ context }) => { + const client = new BigQueryClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.listTables( + context.projectId, + context.datasetId, + { + maxResults: context.maxResults, + pageToken: context.pageToken, + }, + ); + + const tables = (response.tables || []).map((t) => ({ + id: t.id, + tableId: t.tableReference.tableId, + datasetId: t.tableReference.datasetId, + projectId: t.tableReference.projectId, + type: t.type, + friendlyName: t.friendlyName, + description: t.description, + numRows: t.numRows, + numBytes: t.numBytes, + })); + + return { + tables, + nextPageToken: response.nextPageToken, + totalItems: response.totalItems, + }; + }, + }); + +// ============================================================================ +// Get Table Schema Tool +// ============================================================================ + +export const createGetTableSchemaTool = (env: Env) => + createPrivateTool({ + id: "bigquery_get_table_schema", + description: + "Get the schema of a specific BigQuery table. Returns all fields with their types, modes, and descriptions.", + inputSchema: z.object({ + projectId: z.string().describe("Google Cloud project ID"), + datasetId: z.string().describe("Dataset ID"), + tableId: z.string().describe("Table ID"), + }), + outputSchema: z.object({ + table: z.object({ + id: z.string().describe("Full table ID"), + tableId: z.string().describe("Table ID"), + datasetId: z.string().describe("Dataset ID"), + projectId: z.string().describe("Project ID"), + type: z.string().optional(), + friendlyName: z.string().optional(), + description: z.string().optional(), + numRows: z.string().optional(), + numBytes: z.string().optional(), + }), + schema: z + .object({ + fields: z.array(TableFieldSchemaZod).optional(), + }) + .describe("Table schema"), + }), + execute: async ({ context }) => { + const client = new BigQueryClient({ + accessToken: getAccessToken(env), + }); + + const table = await client.getTable( + context.projectId, + context.datasetId, + context.tableId, + ); + + return { + table: { + id: table.id, + tableId: table.tableReference.tableId, + datasetId: table.tableReference.datasetId, + projectId: table.tableReference.projectId, + type: table.type, + friendlyName: table.friendlyName, + description: table.description, + numRows: table.numRows, + numBytes: table.numBytes, + }, + schema: table.schema || { fields: [] }, + }; + }, + }); + +// ============================================================================ +// Export all BigQuery tools +// ============================================================================ + +export const bigqueryTools = [ + createQueryTool, + createListDatasetsTool, + createListTablesTool, + createGetTableSchemaTool, +]; diff --git a/google-big-query/server/tools/index.ts b/google-big-query/server/tools/index.ts new file mode 100644 index 00000000..96fe1e4d --- /dev/null +++ b/google-big-query/server/tools/index.ts @@ -0,0 +1,20 @@ +/** + * Central export point for all Google BigQuery tools + * + * This file aggregates all tools from different modules into a single + * export, making it easy to import all tools in main.ts. + * + * Tools: + * - bigquery_query: Execute SQL queries + * - bigquery_list_datasets: List datasets in a project + * - bigquery_list_tables: List tables in a dataset + * - bigquery_get_table_schema: Get table schema details + */ + +import { bigqueryTools } from "./bigquery.ts"; + +// Export all tools from all modules +export const tools = [ + // BigQuery tools + ...bigqueryTools, +]; diff --git a/google-big-query/shared/deco.gen.ts b/google-big-query/shared/deco.gen.ts new file mode 100644 index 00000000..72b32e5d --- /dev/null +++ b/google-big-query/shared/deco.gen.ts @@ -0,0 +1,63 @@ +// Generated types for Google BigQuery MCP + +import { z } from "zod"; + +/** + * Mesh request context injected by the Deco runtime + * Contains authentication and metadata for the current request + */ +export interface MeshRequestContext { + /** OAuth access token from Google */ + authorization?: string; + /** Internal state for OAuth flow */ + state?: string; + /** JWT token for the request */ + token?: string; + /** URL of the mesh server */ + meshUrl?: string; + /** Connection ID for this session */ + connectionId?: string; + /** Function to ensure user is authenticated */ + ensureAuthenticated?: () => Promise; +} + +/** + * Environment type for Google BigQuery MCP + * Extends process env with Deco runtime context + */ +export interface Env { + /** Google OAuth Client ID */ + GOOGLE_CLIENT_ID: string; + /** Google OAuth Client Secret */ + GOOGLE_CLIENT_SECRET: string; + /** Mesh request context injected by runtime */ + MESH_REQUEST_CONTEXT: MeshRequestContext; + /** Self-reference MCP (if needed) */ + SELF?: unknown; + /** Whether running locally */ + IS_LOCAL?: boolean; +} + +/** + * State schema for OAuth flow validation + */ +export const StateSchema = z.object({}); + +/** + * MCP type helper for typed tool definitions + */ +export type Mcp Promise>> = { + [K in keyof T]: (( + input: Parameters[0], + ) => Promise>>) & { + asTool: () => Promise<{ + inputSchema: z.ZodType[0]>; + outputSchema?: z.ZodType>>; + description: string; + id: string; + execute: ( + input: Parameters[0], + ) => Promise>>; + }>; + }; +}; diff --git a/google-big-query/tsconfig.json b/google-big-query/tsconfig.json new file mode 100644 index 00000000..a7e0e946 --- /dev/null +++ b/google-big-query/tsconfig.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2023", "ES2024", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "allowJs": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + + /* Path Aliases */ + "baseUrl": ".", + "paths": { + "server/*": ["./server/*"] + } + }, + "include": [ + "server" + ] +} + diff --git a/google-bigquery-official/README.md b/google-bigquery-official/README.md new file mode 100644 index 00000000..f4d010f6 --- /dev/null +++ b/google-bigquery-official/README.md @@ -0,0 +1,43 @@ +# Google BigQuery MCP Server Official + +This is the **official Google BigQuery MCP Server**, provided directly by the Google Cloud team for integration with BigQuery. + +## About Google BigQuery + +BigQuery is Google's fully managed, serverless data warehouse for analytics. With this official MCP, you can: + +- 📊 **SQL Queries** - Run complex SQL queries on massive datasets +- 🗄️ **Dataset Management** - Create and manage datasets and tables +- 📈 **Analytics** - Perform advanced analytics and ML predictions +- 💰 **Cost Analysis** - Monitor and optimize query costs +- 🔄 **Data Loading** - Import data from various sources +- 🤝 **Official Integration** - Direct support and features maintained by the Google Cloud team + +## Connection + +This MCP connects to the official Google BigQuery server at: + +``` +https://bigquery.googleapis.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Google Cloud credentials when prompted +3. Start analyzing data with AI assistance + +## Official Resources + +- 🌐 Website: [cloud.google.com/bigquery](https://cloud.google.com/bigquery) +- 📚 Documentation: [cloud.google.com/bigquery/docs](https://cloud.google.com/bigquery/docs) +- 🆘 Support: Contact through Google Cloud support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Google Cloud team. + +--- + +*This MCP requires an active Google Cloud account with BigQuery enabled.* + diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json new file mode 100644 index 00000000..08135556 --- /dev/null +++ b/google-bigquery-official/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "google", + "name": "google-bigquery-mcp", + "friendlyName": "Google BigQuery", + "connection": { + "type": "HTTP", + "url": "https://bigquery.googleapis.com/mcp" + }, + "description": "Analyze massive datasets with Google BigQuery serverless data warehouse. Run SQL queries, manage datasets, and perform analytics through natural language.", + "icon": "https://www.gstatic.com/images/branding/product/2x/bigquery_64dp.png", + "unlisted": false, + "metadata": { + "categories": ["Data Analysis"], + "official": true, + "mesh_unlisted": true, + "tags": ["data-warehouse", "sql", "analytics", "bigdata", "google-cloud", "machine-learning", "bi", "data-science", "petabyte-scale"], + "short_description": "Analyze massive datasets with Google BigQuery serverless data warehouse", + "mesh_description": "Google BigQuery is a fully managed, serverless data warehouse that enables super-fast SQL queries using the processing power of Google's infrastructure. This official MCP provides natural language access to BigQuery's powerful analytics capabilities, allowing you to analyze petabytes of data in seconds. Create and manage datasets, tables, and views with schema definition and partitioning strategies. Run complex SQL queries with support for standard SQL, geographic functions, machine learning functions, and user-defined functions (UDFs). Load data from various sources including Cloud Storage, Cloud SQL, Sheets, and streaming inserts. Execute federated queries that can join BigQuery data with external data sources like Cloud Storage, Bigtable, or Cloud SQL. Use BigQuery ML to create and execute machine learning models directly in SQL for tasks like classification, regression, forecasting, and recommendation. Access real-time analytics with streaming inserts and automatic table updates. Optimize costs with automatic query caching, materialized views, and partitioned tables. Monitor query performance with execution plans, slot usage, and cost estimates. Set up scheduled queries for automated data refreshes, configure access controls with IAM policies, and export results to various formats for further analysis or visualization." + } +} diff --git a/google-calendar/app.json b/google-calendar/app.json index 7788d8e1..69475c39 100644 --- a/google-calendar/app.json +++ b/google-calendar/app.json @@ -8,6 +8,13 @@ }, "description": "Integrate and manage your Google Calendar. Create, edit and delete events, check availability and sync your calendars.", "icon": "https://assets.decocache.com/mcp/b5fffe71-647a-461c-aa39-3da07b86cc96/Google-Meets.svg", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": ["Productivity"], + "official": false, + "tags": ["google", "calendar", "scheduling", "events", "meetings", "productivity", "time-management"], + "short_description": "Integrate and manage your Google Calendar. Create, edit and delete events, check availability and sync your calendars.", + "mesh_description": "The Google Calendar MCP provides comprehensive integration with Google Calendar, enabling full programmatic control over calendar events, schedules, and availability management. This MCP allows AI agents to create, read, update, and delete calendar events, check user availability across multiple calendars, manage event attendees and invitations, set up recurring events, and configure event reminders and notifications. It supports advanced scheduling features including finding optimal meeting times, managing calendar sharing and permissions, handling multiple calendars, and synchronizing events across different time zones. The integration is perfect for building intelligent scheduling assistants, automated meeting coordinators, calendar-based workflow triggers, and personal productivity tools. Ideal for teams and individuals who need to automate calendar management, integrate scheduling into business processes, or build calendar-aware applications. Provides secure OAuth-based authentication for calendar access." + } } diff --git a/google-calendar/package.json b/google-calendar/package.json index 92817c02..3a04761e 100644 --- a/google-calendar/package.json +++ b/google-calendar/package.json @@ -12,7 +12,7 @@ "check": "tsc --noEmit" }, "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0" }, "devDependencies": { diff --git a/google-gke-official/README.md b/google-gke-official/README.md new file mode 100644 index 00000000..90d436d7 --- /dev/null +++ b/google-gke-official/README.md @@ -0,0 +1,43 @@ +# Google GKE MCP Server Official + +This is the **official Google GKE MCP Server**, provided directly by the Google Cloud team for integration with Google Kubernetes Engine. + +## About Google GKE + +Google Kubernetes Engine (GKE) is a managed Kubernetes service for deploying containerized applications. With this official MCP, you can: + +- 🚀 **Cluster Management** - Create and manage Kubernetes clusters +- 📦 **Container Deployment** - Deploy and scale containerized apps +- 📊 **Monitoring** - Monitor cluster health and performance +- 🔒 **Security** - Manage security policies and access control +- ⚙️ **Configuration** - Configure nodes, networking, and resources +- 🤝 **Official Integration** - Direct support and features maintained by the Google Cloud team + +## Connection + +This MCP connects to the official Google GKE server at: + +``` +https://container.googleapis.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Google Cloud credentials when prompted +3. Start managing your Kubernetes clusters with AI assistance + +## Official Resources + +- 🌐 Website: [cloud.google.com/kubernetes-engine](https://cloud.google.com/kubernetes-engine) +- 📚 Documentation: [cloud.google.com/kubernetes-engine/docs](https://cloud.google.com/kubernetes-engine/docs) +- 🆘 Support: Contact through Google Cloud support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Google Cloud team. + +--- + +*This MCP requires an active Google Cloud account with GKE enabled.* + diff --git a/google-gke-official/app.json b/google-gke-official/app.json new file mode 100644 index 00000000..3579fdbe --- /dev/null +++ b/google-gke-official/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "google", + "name": "google-gke-mcp", + "friendlyName": "Google GKE", + "connection": { + "type": "HTTP", + "url": "https://container.googleapis.com/mcp" + }, + "description": "Manage Kubernetes clusters on Google Cloud with GKE. Deploy, scale, and monitor containerized applications through natural language commands.", + "icon": "https://www.gstatic.com/images/branding/product/2x/gke_64dp.png", + "unlisted": false, + "metadata": { + "categories": ["Developer Tools"], + "official": true, + "mesh_unlisted": true, + "tags": ["kubernetes", "containers", "docker", "orchestration", "google-cloud", "gke", "devops", "microservices", "cloud-native"], + "short_description": "Manage Kubernetes clusters on Google Cloud with GKE", + "mesh_description": "Google Kubernetes Engine (GKE) is a managed Kubernetes service that simplifies deploying, managing, and scaling containerized applications using Google's infrastructure. This official MCP enables you to create and manage GKE clusters with autopilot or standard modes, configure node pools with custom machine types, and implement cluster autoscaling based on workload demands. Deploy applications using Kubernetes manifests, Helm charts, or Kustomize configurations. Manage pods, deployments, services, ingress, config maps, and secrets through intuitive natural language commands. Configure networking with VPC-native clusters, private clusters, and workload identity for secure service authentication. Set up horizontal pod autoscaling, vertical pod autoscaling, and cluster autoscaler for optimal resource utilization. Implement CI/CD pipelines with GKE integration, rolling updates with zero downtime, and canary deployments for gradual rollouts. Monitor cluster health, resource usage, and application performance with Cloud Monitoring and Logging integration. Configure security policies with Pod Security Standards, Binary Authorization, and network policies. Manage multi-cluster deployments with GKE Enterprise, implement service mesh with Anthos Service Mesh, and use Config Sync for GitOps workflows. Perfect for teams running cloud-native applications at scale." + } +} diff --git a/google-maps-official/README.md b/google-maps-official/README.md new file mode 100644 index 00000000..c2dd7990 --- /dev/null +++ b/google-maps-official/README.md @@ -0,0 +1,43 @@ +# Google Maps MCP Server Official + +This is the **official Google Maps MCP Server**, provided directly by the Google Maps team for integration with Google Maps Platform. + +## About Google Maps + +Google Maps Platform provides APIs for maps, routes, and places. With this official MCP, you can: + +- 🗺️ **Mapping** - Access and display Google Maps +- 📍 **Geocoding** - Convert addresses to coordinates and vice versa +- 🧭 **Directions** - Get routing and navigation data +- 📌 **Places** - Search for places and get detailed information +- 🌍 **Geographic Data** - Access geographic and location data +- 🤝 **Official Integration** - Direct support and features maintained by the Google Maps team + +## Connection + +This MCP connects to the official Google Maps server at: + +``` +https://mapstools.googleapis.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Google Maps API key when prompted +3. Start using Maps services with AI assistance + +## Official Resources + +- 🌐 Website: [developers.google.com/maps](https://developers.google.com/maps) +- 📚 Documentation: [developers.google.com/maps/documentation](https://developers.google.com/maps/documentation) +- 🆘 Support: Contact through Google Maps Platform support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Google Maps team. + +--- + +*This MCP requires an active Google Maps Platform API key.* + diff --git a/google-maps-official/app.json b/google-maps-official/app.json new file mode 100644 index 00000000..d14e3475 --- /dev/null +++ b/google-maps-official/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "google", + "name": "google-maps-mcp", + "friendlyName": "Google Maps", + "connection": { + "type": "HTTP", + "url": "https://mapstools.googleapis.com/mcp" + }, + "description": "Access Google Maps Platform APIs through natural language. Get directions, geocoding, places data, and mapping services with AI assistance.", + "icon": "https://www.gstatic.com/images/branding/product/2x/maps_64dp.png", + "unlisted": false, + "metadata": { + "categories": ["Mapping"], + "official": true, + "mesh_unlisted": true, + "tags": ["maps", "geocoding", "directions", "places", "location", "google-maps", "geospatial", "navigation", "gis"], + "short_description": "Access Google Maps Platform APIs through natural language", + "mesh_description": "Google Maps Platform provides comprehensive mapping and location services used by millions of applications worldwide. This official MCP gives you natural language access to Google Maps APIs including geocoding for converting addresses to coordinates and reverse geocoding for coordinates to addresses. Get optimal route directions with multiple transportation modes (driving, walking, bicycling, transit) considering real-time traffic conditions, toll roads, and route alternatives. Search and discover places with detailed information including business hours, ratings, reviews, photos, and contact details. Calculate accurate distances and travel times between multiple locations using the Distance Matrix API. Optimize multi-stop routes with the Directions API for efficient delivery and logistics planning. Access detailed place information with the Places API including nearby search, text search, and place details. Use the Geolocation API to determine device location based on cell towers and WiFi access points. Implement time zone services to convert coordinates to time zones and calculate local times. Create custom maps with markers, polylines, polygons, and info windows. Access Street View imagery programmatically for location verification and virtual tours. Utilize Elevation API for topographic data and terrain information. Perfect for location-based applications, delivery services, real estate platforms, and travel apps." + } +} diff --git a/google-tag-manager/app.json b/google-tag-manager/app.json index 49be9fbc..e9012d65 100644 --- a/google-tag-manager/app.json +++ b/google-tag-manager/app.json @@ -7,6 +7,13 @@ "url": "https://sites-google-tag-manager.decocache.com/mcp" }, "description": "Manage Google Tag Manager resources including accounts, containers, workspaces, tags, triggers and variables via API.", - "icon": "https://img.icons8.com/color/1200/google-tag-manager.jpg", - "unlisted": false + "icon": "https://assets.decocache.com/decocms/9636f785-2d20-4b90-8fd8-6bd8f0b29afb/google-tag-manager.jpg", + "unlisted": false, + "metadata": { + "categories": ["Analytics"], + "official": false, + "tags": ["google", "tag-manager", "gtm", "analytics", "tracking", "marketing"], + "short_description": "Manage Google Tag Manager resources including accounts, containers, workspaces, tags, triggers and variables via API.", + "mesh_description": "The Google Tag Manager MCP provides comprehensive integration with GTM's API, enabling programmatic management of all aspects of tag management infrastructure. This MCP allows AI agents and automation systems to create, read, update, and delete GTM resources including accounts, containers, workspaces, tags, triggers, and variables. It supports complete workspace management workflows, from creating new workspaces for isolated development to publishing changes to production containers. The integration enables automated tag deployment, bulk tag operations, configuration backups, and cross-container synchronization. Perfect for marketing teams, web analysts, and developers who need to manage tracking implementations at scale, automate tag deployments across multiple properties, or integrate GTM management into their CI/CD pipelines. Supports all GTM resource types and enables advanced automation scenarios for tag governance and compliance." + } } diff --git a/google-tag-manager/package.json b/google-tag-manager/package.json index 8a13cdf1..e7c4a9dc 100644 --- a/google-tag-manager/package.json +++ b/google-tag-manager/package.json @@ -12,7 +12,7 @@ "check": "tsc --noEmit" }, "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0" }, "devDependencies": { diff --git a/grain-official/README.md b/grain-official/README.md index 75ff311d..ada7d988 100644 --- a/grain-official/README.md +++ b/grain-official/README.md @@ -1,42 +1,42 @@ # Grain Official MCP -Este é o **MCP oficial do Grain**, fornecido diretamente pela equipe do Grain para integração com a plataforma de gravação e análise de reuniões. +This is the **official Grain MCP**, provided directly by the Grain team for integration with the meeting recording and analysis platform. -## Sobre o Grain +## About Grain -O Grain é uma plataforma poderosa para gravação, transcrição e análise de reuniões. Com este MCP oficial, você pode: +Grain is a powerful platform for recording, transcribing, and analyzing meetings. With this official MCP, you can: -- 📹 **Acessar suas gravações** - Recupere e gerencie suas reuniões gravadas -- 📝 **Consultar transcrições** - Acesse transcrições completas de suas reuniões -- 💡 **Extrair insights** - Obtenha insights e análises de suas reuniões -- 🔍 **Buscar conteúdo** - Pesquise através de todas as suas reuniões e transcrições -- 🤝 **Integração oficial** - Suporte direto e funcionalidades mantidas pela equipe Grain +- 📹 **Access your recordings** - Retrieve and manage your recorded meetings +- 📝 **Query transcripts** - Access complete transcripts of your meetings +- 💡 **Extract insights** - Get insights and analysis from your meetings +- 🔍 **Search content** - Search through all your meetings and transcripts +- 🤝 **Official integration** - Direct support and features maintained by the Grain team -## Conexão +## Connection -Este MCP se conecta ao servidor oficial do Grain em: +This MCP connects to the official Grain server at: ``` https://api.grain.com/_/mcp ``` -## Como Usar +## How to Use -1. Instale este MCP através do registry -2. Configure suas credenciais do Grain quando solicitado -3. Comece a usar as ferramentas disponibilizadas pelo Grain +1. Install this MCP through the registry +2. Configure your Grain credentials when prompted +3. Start using the tools provided by Grain -## Recursos Oficiais +## Official Resources - 🌐 Website: [grain.com](https://grain.com) -- 📚 Documentação: [docs.grain.com](https://docs.grain.com) -- 🆘 Suporte: Entre em contato através do suporte oficial do Grain +- 📚 Documentation: [docs.grain.com](https://docs.grain.com) +- 🆘 Support: Contact through official Grain support ## Status -✅ **MCP Oficial** - Este é o MCP oficial mantido pela equipe do Grain. +✅ **Official MCP** - This is the official MCP maintained by the Grain team. --- -*Este MCP requer uma conta ativa no Grain para funcionar.* +*This MCP requires an active Grain account to function.* diff --git a/grain-official/app.json b/grain-official/app.json index 30a6fb14..a78b7115 100644 --- a/grain-official/app.json +++ b/grain-official/app.json @@ -1,13 +1,24 @@ { "scopeName": "grain", - "name": "Grain mcp", + "name": "grain-mcp", + "friendlyName": "Grain", +<<<<<<< HEAD + "category": "Collaboration", +======= +>>>>>>> 2795092 (Update app.json files for Google Tag Manager and Grain MCP) "connection": { "type": "HTTP", "url": "https://api.grain.com/_/mcp" }, - "description": "Grain Official MCP - Acesse e gerencie suas reuniões, transcrições e insights do Grain. Este é o MCP oficial da Grain para integração completa com a plataforma de gravação e análise de reuniões.", + "description": "Record, transcribe, and analyze meetings with Grain. Access recordings, transcripts, insights, and search through meetings with AI assistance.", "icon": "https://assets.decocache.com/mcp/1bfc7176-e7be-487c-83e6-4b9e970a8e10/Grain.svg", "unlisted": false, - "official": true + "metadata": { + "categories": ["Collaboration"], + "official": true, + "tags": ["meetings", "transcription", "recording", "video", "collaboration", "grain", "ai-notes", "insights", "productivity"], + "short_description": "Record, transcribe, and analyze meetings with Grain", + "mesh_description": "Grain is a powerful meeting recording and analysis platform that helps teams capture, share, and learn from their customer conversations and internal meetings. This official MCP provides natural language access to your meeting recordings across Zoom, Google Meet, and Microsoft Teams. Automatically transcribe meetings with high accuracy in multiple languages, search through transcripts to find specific moments or topics, and create highlights and clips from important discussions. Extract AI-powered insights including action items, key decisions, questions asked, and sentiment analysis. Share meeting highlights with your team through integrations with Slack, Notion, and CRM systems. Build a searchable knowledge base of customer feedback, product discussions, and sales calls. Use Grain's AI to summarize long meetings, identify common themes across multiple conversations, and track important topics over time. Create custom highlight reels for onboarding, training, and knowledge sharing. Collaborate with team members by adding comments and reactions to specific moments in recordings. Perfect for sales teams analyzing customer calls, product teams gathering user feedback, and customer success teams improving support quality. The MCP enables seamless access to your meeting library, transcript search, insight extraction, and clip creation through conversational commands." + } } diff --git a/hubspot-official/README.md b/hubspot-official/README.md new file mode 100644 index 00000000..8a89a1ea --- /dev/null +++ b/hubspot-official/README.md @@ -0,0 +1,44 @@ +# HubSpot MCP Server Official + +This is the **official HubSpot MCP Server**, provided directly by the HubSpot team for integration with HubSpot CRM. + +## About HubSpot + +HubSpot is a leading CRM platform for marketing, sales, and customer service. With this official MCP, you can: + +- 👥 **Contact Management** - Create and manage contacts and companies +- 💼 **Deals & Pipeline** - Track deals and sales pipeline +- 📧 **Email Marketing** - Send and manage email campaigns +- 🎫 **Ticket Management** - Handle customer support tickets +- 📊 **Analytics** - Access CRM analytics and reports +- 🔄 **Workflow Automation** - Automate marketing and sales processes +- 🤝 **Official Integration** - Direct support and features maintained by the HubSpot team + +## Connection + +This MCP connects to the official HubSpot server at: + +``` +https://app.hubspot.com/mcp/v1/http +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your HubSpot API key when prompted +3. Start managing your CRM with AI assistance + +## Official Resources + +- 🌐 Website: [hubspot.com](https://www.hubspot.com) +- 📚 Documentation: [developers.hubspot.com](https://developers.hubspot.com) +- 🆘 Support: Contact through official HubSpot support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the HubSpot team. + +--- + +*This MCP requires an active HubSpot account and API key.* + diff --git a/hubspot-official/app.json b/hubspot-official/app.json new file mode 100644 index 00000000..d3f02fe5 --- /dev/null +++ b/hubspot-official/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "hubspot", + "name": "hubspot-mcp", + "friendlyName": "HubSpot", + "connection": { + "type": "HTTP", + "url": "https://app.hubspot.com/mcp/v1/http" + }, + "description": "Manage your CRM, marketing, sales, and service operations with HubSpot. Create contacts, deals, tickets, and automate workflows through natural language.", + "icon": "https://www.hubspot.com/favicon.ico", + "unlisted": false, + "metadata": { + "categories": ["CRM"], + "official": true, + "mesh_unlisted": true, + "tags": ["crm", "marketing", "sales", "customer-service", "automation", "hubspot", "email-marketing", "lead-generation", "analytics"], + "short_description": "Manage your CRM, marketing, sales, and service operations with HubSpot", + "mesh_description": "HubSpot is a comprehensive customer relationship management (CRM) platform that combines marketing, sales, customer service, and content management tools in one unified system. This official MCP provides natural language access to HubSpot's powerful features, enabling you to manage the entire customer lifecycle from first touch to loyal advocate. Create and update contacts, companies, and deals with custom properties and associations. Build and manage your sales pipeline with deal stages, forecasting, and revenue tracking. Design and execute email marketing campaigns with personalization, A/B testing, and automated follow-ups. Create landing pages, forms, and CTAs to capture leads and drive conversions. Set up sophisticated workflow automation for lead nurturing, task creation, and data enrichment. Manage customer support with ticketing system, knowledge base, and live chat integration. Access detailed analytics and reports on marketing performance, sales activities, and customer satisfaction metrics. Configure lead scoring rules to prioritize high-value prospects, create custom dashboards for team visibility, and set up sequences for automated email outreach. Integrate with hundreds of apps through HubSpot's App Marketplace. Perfect for growing businesses that need an all-in-one platform to attract, engage, and delight customers at scale." + } +} diff --git a/indeed-official/README.md b/indeed-official/README.md new file mode 100644 index 00000000..d00395dd --- /dev/null +++ b/indeed-official/README.md @@ -0,0 +1,43 @@ +# Indeed MCP Server Official + +This is the **official Indeed MCP Server**, provided directly by the Indeed team for integration with the world's largest job site. + +## About Indeed + +Indeed is the world's #1 job site with millions of job listings. With this official MCP, you can: + +- 🔍 **Job Search** - Search and filter through millions of job listings +- 💼 **Recruitment** - Post and manage job listings +- 📊 **Analytics** - Access hiring analytics and insights +- 👥 **Candidate Management** - Manage applications and candidates +- 📈 **Market Data** - Get salary insights and market trends +- 🤝 **Official Integration** - Direct support and features maintained by the Indeed team + +## Connection + +This MCP connects to the official Indeed server at: + +``` +https://mcp.indeed.com/claude/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Indeed credentials when prompted +3. Start searching jobs and managing recruitment with AI assistance + +## Official Resources + +- 🌐 Website: [indeed.com](https://www.indeed.com) +- 📚 For Employers: [indeed.com/hire](https://www.indeed.com/hire) +- 🆘 Support: Contact through official Indeed support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Indeed team. + +--- + +*This MCP provides access to Indeed's job search and recruitment platform.* + diff --git a/indeed-official/app.json b/indeed-official/app.json new file mode 100644 index 00000000..bfa22b2d --- /dev/null +++ b/indeed-official/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "indeed", + "name": "indeed-mcp", + "friendlyName": "Indeed", + "connection": { + "type": "HTTP", + "url": "https://mcp.indeed.com/claude/mcp" + }, + "description": "Search and interact with job listings through natural language. Access millions of jobs, post listings, and manage recruitment on the world's largest job site.", + "icon": "https://www.indeed.com/favicon.ico", + "unlisted": false, + "metadata": { + "categories": ["Job Board"], + "official": true, + "mesh_unlisted": true, + "tags": ["jobs", "recruitment", "hiring", "job-search", "indeed", "hr", "talent-acquisition", "careers", "employment"], + "short_description": "Search and interact with job listings on the world's largest job site", + "mesh_description": "Indeed is the world's #1 job site with over 350 million unique visitors per month and millions of job listings across all industries and experience levels. This official MCP enables job seekers to search and filter through comprehensive job listings using natural language queries, save favorite jobs, set up job alerts for specific criteria, and research companies with reviews and ratings from current and former employees. For employers and recruiters, the MCP provides tools to post job listings with detailed descriptions, requirements, and company information. Manage applications with applicant tracking features, review candidate profiles and resumes, schedule interviews, and communicate with applicants directly through the platform. Access powerful analytics on job posting performance including views, clicks, and application rates. Use Indeed's matching technology to find qualified candidates based on skills, experience, and location. Leverage salary insights and market data to create competitive compensation packages. Set up sponsored job postings to increase visibility and reach more qualified candidates. Configure screening questions to pre-filter applicants and save time in the hiring process. Perfect for both job seekers looking for their next opportunity and companies building their teams with top talent." + } +} diff --git a/jam-dev/README.md b/jam-dev/README.md new file mode 100644 index 00000000..691ec435 --- /dev/null +++ b/jam-dev/README.md @@ -0,0 +1,43 @@ +# Jam MCP Server Official + +This is the **official Jam MCP Server**, provided directly by the Jam team for integration with Jam's bug reporting platform. + +## About Jam + +Jam is the bug reporting tool that makes debugging faster. With this official MCP, you can: + +- 🐛 **Bug Reporting** - Create detailed bug reports instantly +- 📸 **Screenshots & Videos** - Capture visual evidence automatically +- 🔍 **Console Logs** - Include console logs and errors +- 🌐 **Network Data** - Track network requests and responses +- 🔄 **Integration** - Connect with issue trackers (Jira, Linear, GitHub) +- 🤝 **Official Integration** - Direct support and features maintained by the Jam team + +## Connection + +This MCP connects to the official Jam server at: + +``` +https://mcp.jam.dev/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Jam credentials when prompted +3. Start creating and managing bug reports with AI assistance + +## Official Resources + +- 🌐 Website: [jam.dev](https://jam.dev) +- 📚 Documentation: [jam.dev/docs](https://jam.dev/docs) +- 🆘 Support: Contact through official Jam support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Jam team. + +--- + +*This MCP requires an active Jam account to function.* + diff --git a/jam-dev/app.json b/jam-dev/app.json new file mode 100644 index 00000000..24e8aa17 --- /dev/null +++ b/jam-dev/app.json @@ -0,0 +1,19 @@ +{ + "scopeName": "jam", + "name": "jam-dev-mcp", + "friendlyName": "Jam", + "connection": { + "type": "HTTP", + "url": "https://mcp.jam.dev/mcp" + }, + "description": "Debug faster with instant bug reports. Capture screenshots, console logs, network data, and browser info automatically for faster bug resolution.", + "icon": "https://jam.dev/favicon.ico", + "unlisted": false, + "metadata": { + "categories": ["Software Development"], + "official": true, + "tags": ["debugging", "bug-tracking", "developer-tools", "qa", "testing", "jam", "screenshots", "browser-extension", "collaboration"], + "short_description": "Debug faster with instant comprehensive bug reports", + "mesh_description": "Jam is the fastest way to capture and share bugs, automatically including everything developers need to debug - screenshots, console logs, network requests, browser info, and device specs in a single click. This official MCP enables development teams to dramatically reduce time spent reproducing and debugging issues. When a bug is reported through Jam, it automatically captures the current page state including DOM snapshot, JavaScript console errors and warnings, network activity with request/response details, browser and OS information, screen resolution, and installed extensions. Create annotated screenshots and screen recordings with drawing tools to highlight specific issues. Reproduce bugs reliably with session replay that shows exactly what the user did. Integrate seamlessly with issue trackers including Jira, Linear, GitHub Issues, Asana, and ClickUp to create tickets with all debugging context attached. Share bugs via links without requiring recipients to have Jam installed. Use Jam for QA testing, user acceptance testing, production monitoring, and customer support. Collaborate with team members by adding comments and status updates. Track bug resolution progress and gather metrics on common issues. Configure custom templates for bug reports specific to your workflow. Perfect for product teams, QA engineers, and support teams who need to communicate bugs clearly and help developers fix issues faster without lengthy back-and-forth for missing information." + } +} diff --git a/mcp-studio/package.json b/mcp-studio/package.json index fe79fbc5..51aef626 100644 --- a/mcp-studio/package.json +++ b/mcp-studio/package.json @@ -15,8 +15,8 @@ }, "dependencies": { "@ai-sdk/mcp": "^1.0.1", - "@decocms/bindings": "^1.0.7", - "@decocms/runtime": "^1.1.0", + "@decocms/bindings": "^1.0.8", + "@decocms/runtime": "^1.1.3", "@jitl/quickjs-singlefile-cjs-release-sync": "^0.31.0", "@modelcontextprotocol/sdk": "^1.25.1", "@radix-ui/react-collapsible": "^1.1.12", @@ -41,6 +41,7 @@ "tailwind-merge": "^3.0.2", "tailwindcss": "^4.0.6", "tailwindcss-animate": "^1.0.7", + "ts-morph": "^27.0.2", "zod": "^4.0.0" }, "devDependencies": { diff --git a/mcp-studio/server/types/env.ts b/mcp-studio/server/types/env.ts index 8a2972ea..f70329e2 100644 --- a/mcp-studio/server/types/env.ts +++ b/mcp-studio/server/types/env.ts @@ -4,13 +4,8 @@ * Central definition for the Env type used throughout the workflow system. */ -import type { EVENT_BUS_BINDING } from "@decocms/bindings"; -import type { createCollectionBindings } from "@decocms/bindings/collections"; -import { - BindingOf, - type BindingRegistry, - type DefaultEnv, -} from "@decocms/runtime"; +import type { Registry } from "@decocms/mcps-shared/registry"; +import { BindingOf, type DefaultEnv } from "@decocms/runtime"; import z from "zod"; export const StateSchema = z.object({ @@ -19,74 +14,5 @@ export const StateSchema = z.object({ CONNECTION: BindingOf("@deco/connection"), }); -export type ConnectionBinding = { - COLLECTION_CONNECTIONS_UPDATE: (params: { - id: string; - data: { - configuration_state: object; - configuration_scopes: string[]; - }; - }) => Promise; - COLLECTION_CONNECTIONS_GET: (params: { id: string }) => Promise<{ - item: { - configuration_state: object; - configuration_scopes: string[]; - tools: { - name: string; - description: string; - inputSchema: object; - outputSchema: object; - }[]; - }; - }>; - // Accepts an (empty) object because MCP tool validation rejects `undefined` inputs. - COLLECTION_CONNECTIONS_LIST: (params?: Record) => Promise<{ - items: { - id: string; - title: string; - tools: { - name: string; - description: string; - inputSchema: object; - outputSchema: object; - }[]; - }[]; - }>; -}; -const ConnectionSchema = z.object({ - configuration_state: z.object({}), - configuration_scopes: z.array(z.string()), - tools: z.array( - z.object({ - name: z.string(), - description: z.string(), - inputSchema: z.object({}), - outputSchema: z.object({}), - }), - ), -}); - -export interface Registry extends BindingRegistry { - "@deco/event-bus": typeof EVENT_BUS_BINDING; - "@deco/connection": ReturnType< - typeof createCollectionBindings - >; - "@deco/postgres": [ - { - name: "DATABASES_RUN_SQL"; - description: "Run a SQL query against the database"; - inputSchema: z.ZodType<{ - sql: string; - params?: unknown[]; - }>; - outputSchema: z.ZodType<{ - result: { - results?: unknown[]; - success?: boolean; - }[]; - }>; - }, - ]; -} - export type Env = DefaultEnv; +export type { Registry }; diff --git a/mercadolibre-official/README.md b/mercadolibre-official/README.md new file mode 100644 index 00000000..5d2f2e67 --- /dev/null +++ b/mercadolibre-official/README.md @@ -0,0 +1,44 @@ +# Mercado Libre MCP Server Official + +This is the **official Mercado Libre MCP Server**, provided directly by the Mercado Libre team for integration with Latin America's largest e-commerce platform. + +## About Mercado Libre + +Mercado Libre is the leading e-commerce and fintech ecosystem in Latin America. With this official MCP, you can: + +- 🛍️ **Product Listings** - Create and manage product listings +- 📦 **Order Management** - Handle orders and fulfillment +- 📊 **Sales Analytics** - Track sales performance and metrics +- 🚚 **Logistics** - Manage shipping and delivery +- 💬 **Customer Service** - Handle questions and messages +- 🏪 **Store Management** - Manage your seller reputation and store +- 🤝 **Official Integration** - Direct support and features maintained by the Mercado Libre team + +## Connection + +This MCP connects to the official Mercado Libre server at: + +``` +https://mcp.mercadolibre.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Mercado Libre API credentials when prompted +3. Start managing your e-commerce operations with AI assistance + +## Official Resources + +- 🌐 Website: [mercadolibre.com](https://www.mercadolibre.com) +- 📚 Documentation: [developers.mercadolibre.com](https://developers.mercadolibre.com) +- 🆘 Support: Contact through official Mercado Libre support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Mercado Libre team. + +--- + +*This MCP requires an active Mercado Libre seller account and API credentials.* + diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json new file mode 100644 index 00000000..2ac93b8a --- /dev/null +++ b/mercadolibre-official/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "mercadolibre", + "name": "mercadolibre-mcp", + "friendlyName": "Mercado Libre", + "connection": { + "type": "HTTP", + "url": "https://mcp.mercadolibre.com/mcp" + }, + "description": "Manage your e-commerce operations on Latin America's largest marketplace. List products, manage orders, track sales, and handle logistics through natural language.", + "icon": "https://http2.mlstatic.com/frontend-assets/ui-navigation/5.19.1/mercadolibre/favicon.svg", + "unlisted": false, + "metadata": { + "categories": ["E-Commerce"], + "official": true, + "mesh_unlisted": true, + "tags": ["e-commerce", "marketplace", "online-selling", "latin-america", "mercadolibre", "retail", "inventory", "shipping", "sales"], + "short_description": "Manage your e-commerce operations on Latin America's largest marketplace", + "mesh_description": "Mercado Libre is Latin America's leading e-commerce platform with over 140 million active users across 18 countries including Argentina, Brazil, Mexico, Chile, Colombia, and Peru. This official MCP enables sellers to create and manage product listings with detailed descriptions, multiple images, specifications, and competitive pricing strategies. Manage your inventory across multiple warehouses and fulfillment centers with real-time stock updates. Process orders from receipt to fulfillment including order confirmation, payment verification, and shipping coordination. Integrate with Mercado Envíos for streamlined shipping with automatic label generation, tracking updates, and delivery confirmation. Handle customer inquiries and questions through the platform's messaging system with automated responses and quick replies. Monitor your seller reputation and performance metrics including response time, shipping accuracy, and customer satisfaction scores. Access detailed sales analytics with revenue reports, best-selling products, traffic sources, and conversion rates. Set up promotional campaigns with discounts, bundles, and special offers to boost sales. Manage returns and refunds efficiently while maintaining high seller ratings. Use the cross-border trade features to sell internationally within Latin America. Configure multiple payment options and installment plans to increase conversion rates. Perfect for sellers looking to grow their business in Latin American markets." + } +} diff --git a/mercadopago-official/README.md b/mercadopago-official/README.md new file mode 100644 index 00000000..6aeef156 --- /dev/null +++ b/mercadopago-official/README.md @@ -0,0 +1,44 @@ +# Mercado Pago MCP Server Official + +This is the **official Mercado Pago MCP Server**, provided directly by the Mercado Pago team for integration with Latin America's leading payment platform. + +## About Mercado Pago + +Mercado Pago is the leading fintech platform in Latin America, offering payment processing and financial services. With this official MCP, you can: + +- 💳 **Payment Processing** - Process credit card, debit, and digital payments +- 💰 **Transaction Management** - Track and manage transactions +- 🔄 **Refunds & Chargebacks** - Handle refunds and disputes +- 📊 **Financial Analytics** - Access payment analytics and reports +- 🔔 **Subscriptions** - Manage recurring payments and subscriptions +- 🔐 **Security** - Manage fraud prevention and security settings +- 🤝 **Official Integration** - Direct support and features maintained by the Mercado Pago team + +## Connection + +This MCP connects to the official Mercado Pago server at: + +``` +https://mcp.mercadopago.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Mercado Pago API credentials when prompted +3. Start managing payments with AI assistance + +## Official Resources + +- 🌐 Website: [mercadopago.com](https://www.mercadopago.com) +- 📚 Documentation: [developers.mercadopago.com](https://www.mercadopago.com/developers) +- 🆘 Support: Contact through official Mercado Pago support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Mercado Pago team. + +--- + +*This MCP requires an active Mercado Pago account and API credentials.* + diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json new file mode 100644 index 00000000..5f0d2302 --- /dev/null +++ b/mercadopago-official/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "mercadolibre", + "name": "mercadopago-mcp", + "friendlyName": "Mercado Pago", + "connection": { + "type": "HTTP", + "url": "https://mcp.mercadopago.com/mcp" + }, + "description": "Process payments and manage financial operations with Latin America's leading fintech platform. Handle transactions, refunds, subscriptions, and payment analytics through natural language.", + "icon": "https://http2.mlstatic.com/frontend-assets/ui-navigation/5.19.1/mercadolibre/favicon.svg", + "unlisted": false, + "metadata": { + "categories": ["Payments"], + "official": true, + "mesh_unlisted": true, + "tags": ["payments", "fintech", "transactions", "latin-america", "mercadopago", "gateway", "subscriptions", "refunds", "checkout"], + "short_description": "Process payments and manage financial operations with Latin America's leading fintech", + "mesh_description": "Mercado Pago is Latin America's largest fintech platform processing billions of dollars in transactions annually across 18 countries. This official MCP provides comprehensive payment processing capabilities for credit cards, debit cards, digital wallets, bank transfers, cash payments, and cryptocurrencies. Create secure checkout experiences with customizable payment forms, one-click checkout for returning customers, and mobile-optimized payment flows. Process payments with smart routing to maximize approval rates, automatic retry logic for failed transactions, and real-time fraud detection and prevention. Manage recurring subscriptions with flexible billing cycles, automatic payment collection, and dunning management for failed payments. Handle refunds, chargebacks, and disputes efficiently with automated workflows and detailed transaction history. Access comprehensive financial analytics including transaction volumes, approval rates, payment methods distribution, and revenue trends. Configure installment payments with interest-free or interest-bearing options to increase conversion rates. Integrate with major e-commerce platforms, point-of-sale systems, and custom applications through robust APIs. Use QR code payments for in-person transactions with instant confirmation. Manage seller balances, withdrawals, and settlement schedules. Implement 3D Secure authentication for enhanced security compliance. Perfect for businesses of all sizes processing payments in Latin American markets with multi-currency support and local payment methods." + } +} diff --git a/meta-ads/app.json b/meta-ads/app.json index 0e052706..03732c51 100644 --- a/meta-ads/app.json +++ b/meta-ads/app.json @@ -1,12 +1,20 @@ { "scopeName": "deco", "name": "meta-ads", + "friendlyName": "Meta Ads Analytics", "connection": { "type": "HTTP", "url": "https://sites-meta-ads.decocache.com/mcp" }, "description": "Meta Ads Analytics - Analyze performance of Meta/Facebook advertising campaigns with detailed insights and metrics", "icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Facebook_Logo_%282019%29.png/1200px-Facebook_Logo_%282019%29.png", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": ["Marketing"], + "official": false, + "tags": ["meta", "facebook", "instagram", "ads", "advertising", "analytics", "marketing", "campaigns"], + "short_description": "Meta Ads Analytics - Analyze performance of Meta/Facebook advertising campaigns with detailed insights and metrics", + "mesh_description": "The Meta Ads Analytics MCP provides deep integration with Meta's advertising platform, offering comprehensive tools to analyze, monitor, and optimize advertising campaigns across Facebook and Instagram. This MCP enables AI agents to retrieve detailed campaign performance metrics, including impressions, clicks, conversions, cost data, and audience engagement statistics. It supports querying campaign hierarchies (campaigns, ad sets, ads), accessing demographic breakdowns, analyzing time-series performance data, and generating custom reports. The integration allows for automated performance monitoring, anomaly detection in ad spend, ROI analysis, and budget optimization recommendations. Ideal for digital marketers, advertising agencies, and data analysts who need to track campaign performance, generate client reports, or build automated optimization workflows. Provides access to Meta's Marketing API for programmatic campaign insights and decision-making support." + } } diff --git a/meta-ads/package.json b/meta-ads/package.json index b70dcdb5..2a491bef 100644 --- a/meta-ads/package.json +++ b/meta-ads/package.json @@ -13,7 +13,7 @@ "dev:tunnel": "deco link -p 3003 -- PORT=3003 bun run dev" }, "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0" }, "devDependencies": { diff --git a/openrouter/app.json b/openrouter/app.json index ae28c4fa..0f1cc4a0 100644 --- a/openrouter/app.json +++ b/openrouter/app.json @@ -1,11 +1,19 @@ { "scopeName": "deco", "name": "openrouter", + "friendlyName": "OpenRouter", "connection": { "type": "HTTP", "url": "https://sites-openrouter.decocache.com/mcp" }, "description": "OpenRouter App Connection for LLM uses.", "icon": "https://assets.decocache.com/decocms/b2e2f64f-6025-45f7-9e8c-3b3ebdd073d8/openrouter_logojpg.jpg", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": ["AI"], + "official": false, + "tags": ["openrouter", "llm", "ai", "language-models", "chat", "completion"], + "short_description": "OpenRouter App Connection for LLM uses.", + "mesh_description": "The OpenRouter MCP provides a unified gateway to access multiple large language models (LLMs) through a single integration point. OpenRouter aggregates various AI model providers including OpenAI, Anthropic, Google, Meta, and many others, offering a standardized API interface for chat completions and text generation. This MCP enables AI agents to dynamically select and utilize different LLMs based on specific requirements such as cost, speed, capability, or context window size. It supports model routing, fallback strategies, cost tracking, and usage analytics. The integration is perfect for applications that need flexibility in model selection, want to optimize costs by using the most appropriate model for each task, or require high availability through automatic failover between providers. Ideal for developers building AI-powered applications, chatbots, content generation systems, or multi-model comparison tools." + } } \ No newline at end of file diff --git a/openrouter/package.json b/openrouter/package.json index f48aac40..c5528b6d 100644 --- a/openrouter/package.json +++ b/openrouter/package.json @@ -1,5 +1,5 @@ { - "name": "openrouter", + "name": "@decocms/openrouter", "version": "1.0.0", "description": "OpenRouter AI model routing and management", "private": true, @@ -11,11 +11,16 @@ "publish": "cat app.json | deco registry publish -w /shared/deco -y", "check": "tsc --noEmit" }, + "exports": { + "./tools": "./server/tools/index.ts", + "./types": "./server/lib/types.ts", + "./hooks": "./server/tools/hooks.ts" + }, "dependencies": { "@ai-sdk/provider": "^3.0.2", "@ai-sdk/provider-utils": "^4.0.4", - "@decocms/bindings": "^1.0.6", - "@decocms/runtime": "^1.1.1", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.3", "@openrouter/ai-sdk-provider": "^1.5.4", "@openrouter/sdk": "^0.3.11", "ai": "^6.0.3", diff --git a/openrouter/server/lib/env.ts b/openrouter/server/lib/env.ts index fdbab23f..3c404254 100644 --- a/openrouter/server/lib/env.ts +++ b/openrouter/server/lib/env.ts @@ -1,7 +1,8 @@ import type { Env } from "server/main"; export const getOpenRouterApiKey = (env: Env) => { - const authorization = env.MESH_REQUEST_CONTEXT.authorization; + const authorization = + env.MESH_REQUEST_CONTEXT.authorization ?? process.env.OPENROUTER_API_KEY; if (!authorization) { throw new Error("Authorization header is required"); } diff --git a/openrouter/server/lib/openrouter-client.ts b/openrouter/server/lib/openrouter-client.ts index 39e58139..0218c039 100644 --- a/openrouter/server/lib/openrouter-client.ts +++ b/openrouter/server/lib/openrouter-client.ts @@ -45,6 +45,12 @@ export class OpenRouterClient { this.modelCache = new Map(); } + static for(apiKey: string) { + return new OpenRouterClient({ + apiKey, + }); + } + /** * List all available models */ diff --git a/openrouter/server/main.ts b/openrouter/server/main.ts index 09750661..56e3a719 100644 --- a/openrouter/server/main.ts +++ b/openrouter/server/main.ts @@ -7,17 +7,20 @@ * OpenRouter offers a unified API for accessing hundreds of AI models * with built-in fallback mechanisms, cost optimization, and provider routing. */ -import { type DefaultEnv, withRuntime } from "@decocms/runtime"; +import type { Registry } from "@decocms/mcps-shared/registry"; import { serve } from "@decocms/mcps-shared/serve"; - +import { type DefaultEnv, withRuntime } from "@decocms/runtime"; +import { z } from "zod"; import { tools } from "./tools/index.ts"; +const StateSchema = z.object({}); /** * Environment type combining Deco bindings and Cloudflare Workers context */ -export type Env = DefaultEnv; -const runtime = withRuntime({ +export type Env = DefaultEnv; + +const runtime = withRuntime({ oauth: { mode: "PKCE", // Used in protected resource metadata to point to the auth server diff --git a/openrouter/server/tools/hooks.ts b/openrouter/server/tools/hooks.ts new file mode 100644 index 00000000..d2bacd69 --- /dev/null +++ b/openrouter/server/tools/hooks.ts @@ -0,0 +1,16 @@ +import type { LanguageModelV2Usage } from "@ai-sdk/provider"; +import type { LanguageModelInputSchema } from "@decocms/bindings/llm"; +import type { ModelInfo } from "server/lib/types"; +import type { z } from "zod"; + +export interface UsageHooks { + start: ( + modelInfo: ModelInfo, + params: z.infer, + ) => Promise<{ + end: (usage: { + usage: LanguageModelV2Usage; + providerMetadata?: unknown; + }) => Promise; + }>; +} diff --git a/openrouter/server/tools/index.ts b/openrouter/server/tools/index.ts index 0870b74a..7e57dc71 100644 --- a/openrouter/server/tools/index.ts +++ b/openrouter/server/tools/index.ts @@ -10,6 +10,8 @@ * - llmBinding: LLM binding implementation (metadata, stream, generate, list, get) * - modelTools: Model comparison and recommendations (separate utilities) */ +import type { Env } from "../main.ts"; +import type { UsageHooks } from "./hooks.ts"; import { createGetLLMTool, createListLLMTool, @@ -22,20 +24,21 @@ import { createRecommendModelTool, } from "./models/index.ts"; -// Export all tools from all modules -export const tools = [ - // LLM Binding - implements all 5 required tools: - // - COLLECTION_LLM_LIST - // - COLLECTION_LLM_GET - // - LLM_METADATA - // - LLM_DO_STREAM - // - LLM_DO_GENERATE - createListLLMTool, - createGetLLMTool, - createLLMMetadataTool, - createLLMStreamTool, - createLLMGenerateTool, - // Additional model utilities (not part of LLM binding) - createCompareModelsTool, - createRecommendModelTool, -]; +export const tools = (env: TEnv, hooks?: UsageHooks) => { + return [ + // LLM Binding - implements all 5 required tools: + // - COLLECTION_LLM_LIST + // - COLLECTION_LLM_GET + // - LLM_METADATA + // - LLM_DO_STREAM + // - LLM_DO_GENERATE + createListLLMTool(env), + createGetLLMTool(env), + createLLMMetadataTool(env), + createLLMStreamTool(hooks)(env), + createLLMGenerateTool(hooks)(env), + // Additional model utilities (not part of LLM binding) + createCompareModelsTool(env), + createRecommendModelTool(env), + ]; +}; diff --git a/openrouter/server/tools/llm-binding.ts b/openrouter/server/tools/llm-binding.ts index 61c7d73e..2bc53326 100644 --- a/openrouter/server/tools/llm-binding.ts +++ b/openrouter/server/tools/llm-binding.ts @@ -24,6 +24,7 @@ import { getOpenRouterApiKey } from "server/lib/env.ts"; import type { z } from "zod"; import { OpenRouterClient } from "../lib/openrouter-client.ts"; import type { Env } from "../main.ts"; +import type { UsageHooks } from "./hooks.ts"; import { getBaseUrl } from "./models/utils.ts"; import { WELL_KNOWN_MODEL_IDS } from "./models/well-known.ts"; @@ -46,14 +47,107 @@ const DEFAULT_LOGO = * Provider logo mapping - maps provider names to their logo URLs */ const PROVIDER_LOGOS: Record = { - openai: - "https://assets.decocache.com/webdraw/15dc381c-23b4-4f6b-9ceb-9690f77a7cf5/openai.svg", + "aion-labs": + "https://assets.decocache.com/decocms/6da18da8-0160-4b85-8bca-84eefffebe12/images-(6).png", + ai21: "https://assets.decocache.com/decocms/5d8388e9-027b-4b23-b816-90cee1cd28ad/images-(5).png", + alfredpros: + "https://assets.decocache.com/decocms/76eaa620-ce73-43d6-8817-272c1d498b53/images-(19).png", + alibaba: + "https://assets.decocache.com/decocms/4d113b13-5412-4d3b-96ec-3c2e7c1f7a5f/images-(8).png", + allenai: + "https://assets.decocache.com/decocms/21d6071a-e0da-4919-9f35-902b1d0b85b8/allen.png", + alpindale: + "https://assets.decocache.com/decocms/76eaa620-ce73-43d6-8817-272c1d498b53/images-(19).png", + amazon: + "https://assets.decocache.com/decocms/31e7b260-6cf0-4753-bb32-bd062b15c5f1/Amazon_icon.png", anthropic: - "https://assets.decocache.com/webdraw/6ae2b0e1-7b81-48f7-9707-998751698b6f/anthropic.svg", + "https://assets.decocache.com/decocms/4fa4f3ed-1bf3-4e5a-8d05-4f3787df5966/anthropic-icon-tdvkiqisswbrmtkiygb0ia.webp", + "anthracite-org": DEFAULT_LOGO, + "arcee-ai": + "https://assets.decocache.com/decocms/ee325839-6acc-48dc-8cf7-8bab74698015/126496414.png", + baidu: + "https://assets.decocache.com/decocms/cf4c19f1-39b5-499e-87b7-e16dc5da2b50/images-(9).png", + bytedance: + "https://assets.decocache.com/decocms/1c111a26-8e1d-4a48-9d3c-fe9fb728af06/images-(18).png", + "bytedance-seed": + "https://assets.decocache.com/decocms/1c111a26-8e1d-4a48-9d3c-fe9fb728af06/images-(18).png", + cognitivecomputations: DEFAULT_LOGO, + cohere: + "https://assets.decocache.com/decocms/c942091b-b3bf-4c46-af37-fc2c1086d9f7/cohere-color.png", + deepcogito: + "https://assets.decocache.com/decocms/4ee77a8f-a36a-4933-8cdf-d2e8676b88d8/images-(13).png", + deepseek: + "https://assets.decocache.com/decocms/3611e8ac-4cad-4b0e-a1f8-8f791288ce03/images-(1).png", + eleutherai: + "https://assets.decocache.com/decocms/76eaa620-ce73-43d6-8817-272c1d498b53/images-(19).png", + essentialai: + "https://assets.decocache.com/decocms/c5afc6de-1e41-457e-a6dd-91810d92541e/images-(1).jpeg", google: "https://assets.decocache.com/webdraw/17df85af-1578-42ef-ae07-4300de0d1723/gemini.svg", + gryphe: + "https://assets.decocache.com/decocms/a5503d3b-2056-47f2-a76c-611b7416bdc8/6798c7dccaaadd0a1318d66a_66f41d1fd146c3b0b9c76453_gryphe-logo.webp", + "ibm-granite": + "https://assets.decocache.com/decocms/2c50018d-6f70-472d-be30-65a5e8e249f0/images-(10).png", + inflection: DEFAULT_LOGO, + inception: + "https://assets.decocache.com/decocms/ff9822b8-a914-482b-bd7d-b0e46b9d5a56/images-(6).jpeg", + kwaipilot: + "https://assets.decocache.com/decocms/cd576e1d-1184-45ba-8162-cf2bd06d684f/images-(14).png", + liquid: DEFAULT_LOGO, + mancer: + "https://assets.decocache.com/decocms/79762356-a0c5-4546-b268-ad4a0b51db51/Screenshot-2026-01-08-at-18.49.42.png", + meituan: DEFAULT_LOGO, + "meta-llama": + "https://assets.decocache.com/decocms/56421cb3-488c-4cc3-83a5-16d9a303850e/images-(11).png", + microsoft: + "https://assets.decocache.com/decocms/0e352a51-4ea5-4f35-802e-fd82bf266683/images-(12).png", + minimax: + "https://assets.decocache.com/decocms/f362cc4f-7ccc-4317-afda-92e6f348fdfd/images-(2).png", + mistralai: + "https://assets.decocache.com/decocms/73ab9971-bbbc-40dc-99a3-5fddd9a0f340/images-(3).png", + morph: DEFAULT_LOGO, + moonshotai: + "https://assets.decocache.com/decocms/b8abfea7-e8b4-4b72-b653-fdf11c9e3b66/moonshot.png", + neversleep: DEFAULT_LOGO, + "nex-agi": + "https://assets.decocache.com/decocms/d2ada265-160d-4959-981d-e90210d71713/241570229.jpeg", + nousresearch: + "https://assets.decocache.com/decocms/496acb3d-9b5d-4759-b764-16c9ca7eb6b2/nousresearch.png", + nvidia: + "https://assets.decocache.com/decocms/ecca3238-fa79-4648-bb55-738f13a4293f/nvidia-7.svg", + opengvlab: + "https://assets.decocache.com/decocms/fb2d0c32-85f1-410a-87f4-9731dfafd248/images-(2).jpeg", + openai: + "https://assets.decocache.com/webdraw/15dc381c-23b4-4f6b-9ceb-9690f77a7cf5/openai.svg", + openrouter: + "https://assets.decocache.com/decocms/a75e4eb2-8c95-4cd3-a2f8-c49b21feab5e/openrouter.png", + perplexity: + "https://assets.decocache.com/decocms/3a134746-f370-4089-a3c9-fe545be0441c/images-(15).png", + "prime-intellect": DEFAULT_LOGO, + qwen: "https://assets.decocache.com/decocms/ab94208c-4439-4aec-a06c-c51747120e43/Qwen_logo.svg.png", + raifle: DEFAULT_LOGO, + relace: + "https://assets.decocache.com/decocms/c5dbae73-3ce0-40ca-8433-c38783fb13a9/Screenshot-2026-01-08-at-18.52.09.png", + sao10k: + "https://assets.decocache.com/decocms/76eaa620-ce73-43d6-8817-272c1d498b53/images-(19).png", + "stepfun-ai": + "https://assets.decocache.com/decocms/8892b883-4905-444e-b554-648565dc7fab/images-(16).png", + switchpoint: + "https://assets.decocache.com/decocms/0319d595-e0dd-4d8e-a0a3-b20ff4cbddcb/images-(4).jpeg", + tencent: + "https://assets.decocache.com/decocms/80f2f7bd-f9ea-4fcf-b89c-c58823a389ed/images-(3).jpeg", + thedrummer: + "https://assets.decocache.com/decocms/5c6c09fc-cf9d-43a1-a1c3-4a1ef367b824/images-(17).png", + thudm: DEFAULT_LOGO, + tngtech: + "https://assets.decocache.com/decocms/5b5648ad-f858-4687-b67b-212cf186b62d/images-(7).png", + undi95: DEFAULT_LOGO, + xiaomi: + "https://assets.decocache.com/decocms/2d7191b7-fc80-4867-a431-6d443d691cfc/images-(4).png", "x-ai": "https://assets.decocache.com/webdraw/7a8003ff-8f2d-4988-8693-3feb20e87eca/xai.svg", + "z-ai": + "https://assets.decocache.com/decocms/12a0877f-c978-4880-88d1-09097e606e2f/Z.ai_(company_logo).svg.png", }; // ============================================================================ @@ -473,7 +567,7 @@ const isAPICallError = (error: unknown): error is APICallError => /** * LLM_DO_STREAM - Streams a language model response in real-time */ -export const createLLMStreamTool = (env: Env) => +export const createLLMStreamTool = (usageHooks?: UsageHooks) => (env: Env) => createStreamableTool({ id: "LLM_DO_STREAM", description: @@ -493,13 +587,18 @@ export const createLLMStreamTool = (env: Env) => const model = openrouter.languageModel(modelId); try { + const hook = await usageHooks?.start?.( + await OpenRouterClient.for(apiKey).getModel(modelId), + context, + ); const callResponse = await model.doStream( callOptions as Parameters<(typeof model)["doStream"]>[0], ); - const [_, stream] = getUsageFromStream( + const [usage, stream] = getUsageFromStream( callResponse.stream as ReadableStream, ); + usage.then((usage) => hook?.end?.(usage)); const response = streamToResponse(stream); // Return the data stream response @@ -627,7 +726,7 @@ function transformGenerateResult(result: unknown): Record { /** * LLM_DO_GENERATE - Generates a complete response in a single call (non-streaming) */ -export const createLLMGenerateTool = (env: Env) => +export const createLLMGenerateTool = (usageHooks?: UsageHooks) => (env: Env) => createPrivateTool({ id: "LLM_DO_GENERATE", description: @@ -648,10 +747,15 @@ export const createLLMGenerateTool = (env: Env) => const openrouter = createOpenRouter({ apiKey }); const model = openrouter.languageModel(modelId); + const hook = await usageHooks?.start?.( + await OpenRouterClient.for(apiKey).getModel(modelId), + context, + ); // Use doGenerate directly (consistent with doStream pattern) const result = await model.doGenerate( callOptions as Parameters<(typeof model)["doGenerate"]>[0], ); + await hook?.end?.(result); // Transform the result to match the binding schema return transformGenerateResult(result) as z.infer< @@ -659,15 +763,3 @@ export const createLLMGenerateTool = (env: Env) => >; }, }); - -/** - * Creates all LLM binding tools for OpenRouter. - * Returns an array of tools that implement the Language Model binding. - */ -export const createLLMBinding = (env: Env) => [ - createListLLMTool(env), - createGetLLMTool(env), - createLLMMetadataTool(env), - createLLMStreamTool(env), - createLLMGenerateTool(env), -]; diff --git a/package.json b/package.json index c0c5e430..8354c76e 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "gemini-pro-vision", "google-calendar", "google-tag-manager", + "google-big-query", "meta-ads", "nanobanana", "object-storage", @@ -43,7 +44,8 @@ "template-with-view", "veo", "whisper", - "mcp-studio" + "mcp-studio", + "deco-llm" ], "dependencies": { "@types/node": "^24.10.0" diff --git a/registry/app.json b/registry/app.json index 3c5c08bf..2026835f 100644 --- a/registry/app.json +++ b/registry/app.json @@ -9,7 +9,14 @@ "repository": { "url": "https://github.com/decocms/mcps/tree/main/registry" }, - "description": "A registry translation server that normalizes third-party MCP registries into this system’s format. When no external registry URL is supplied, the server automatically falls back to the official MCP store.", + "description": "A registry translation server that normalizes third-party MCP registries into this system's format. When no external registry URL is supplied, the server automatically falls back to the official MCP store.", "icon": "https://assets.decocache.com/decocms/cd7ca472-0f72-463a-b0de-6e44bdd0f9b4/mcp.png", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": ["Developer Tools"], + "official": false, + "tags": ["mcp", "registry", "discovery", "marketplace", "integration", "catalog"], + "short_description": "A registry translation server that normalizes third-party MCP registries into this system's format. When no external registry URL is supplied, the server automatically falls back to the official MCP store.", + "mesh_description": "The MCP Registry is a centralized discovery and translation service that aggregates and normalizes MCP integrations from multiple sources into a unified format. This MCP acts as a registry gateway, enabling AI agents and applications to discover available MCP integrations, retrieve their metadata and schemas, and connect to them programmatically. It supports querying MCPs by category, tags, capabilities, or search terms, fetching detailed integration documentation, and resolving MCP endpoints. The registry automatically translates between different MCP registry formats, ensuring compatibility across various MCP ecosystems. When no external registry URL is provided, it defaults to the official MCP store. Ideal for building MCP marketplaces, integration discovery tools, or applications that need dynamic MCP loading and connection management. Provides a standardized interface for MCP catalog management and distribution." + } } diff --git a/registry/package.json b/registry/package.json index d77cbba9..fb00ea08 100644 --- a/registry/package.json +++ b/registry/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@decocms/bindings": "^1.0.4", - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.3", "@supabase/supabase-js": "^2.89.0", "zod": "^4.0.0" }, diff --git a/scripts/build-mcp.ts b/scripts/build-mcp.ts index 44d31f23..c8b324d0 100644 --- a/scripts/build-mcp.ts +++ b/scripts/build-mcp.ts @@ -1,11 +1,16 @@ import { $ } from "bun"; -const SITE_NAME_TO_MCP_FOLDER_OVERRIDES = { +const FOLDER_OVERRIDES = { vibemcp: "mcp-studio", }; -const getMcpFolder = (siteName: string) => { - return SITE_NAME_TO_MCP_FOLDER_OVERRIDES[siteName] || siteName; +const PKG_NAME_OVERRIDES = { + vibemcp: "mcp-studio", + openrouter: "@decocms/openrouter", +}; + +const getMcpPkgName = (siteName: string) => { + return PKG_NAME_OVERRIDES[siteName] || siteName; }; const siteName = process.env.DECO_SITE_NAME; @@ -17,14 +22,14 @@ if (!siteName) { console.log(`Building MCP for site name ${siteName}`); -const folderToBuild = getMcpFolder(siteName); +const pkgToBuild = getMcpPkgName(siteName); -if (!folderToBuild) { +if (!pkgToBuild) { console.error( `❌ Error building MCP: package with name ${siteName} not found`, ); process.exit(1); } -await $`bun run --filter=${folderToBuild} build`; -await $`mv ./${folderToBuild}/dist ./dist`; +await $`bun run --filter=${pkgToBuild} build`; +await $`mv ./${FOLDER_OVERRIDES[siteName] || siteName}/dist ./dist`; diff --git a/shared/package.json b/shared/package.json index d677528a..e8b410dc 100644 --- a/shared/package.json +++ b/shared/package.json @@ -17,10 +17,12 @@ "./audio-transcribers": "./audio-transcribers/index.ts", "./storage": "./storage/index.ts", "./search-ai": "./search-ai/index.ts", - "./serve": "./serve.ts" + "./serve": "./serve.ts", + "./registry": "./registry.ts" }, "devDependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.3", "@types/bun": "^1.2.14", "vite": "7.2.0", "zod": "^4.0.0" diff --git a/shared/registry.ts b/shared/registry.ts new file mode 100644 index 00000000..67b96f41 --- /dev/null +++ b/shared/registry.ts @@ -0,0 +1,99 @@ +import type { EVENT_BUS_BINDING } from "@decocms/bindings"; +import type { createCollectionBindings } from "@decocms/bindings/collections"; +import type { BindingRegistry } from "@decocms/runtime"; +import { z } from "zod"; + +export type ConnectionBinding = { + COLLECTION_CONNECTIONS_UPDATE: (params: { + id: string; + data: { + configuration_state: object; + configuration_scopes: string[]; + }; + }) => Promise; + COLLECTION_CONNECTIONS_GET: (params: { id: string }) => Promise<{ + item: { + configuration_state: object; + configuration_scopes: string[]; + tools: { + name: string; + description: string; + inputSchema: object; + outputSchema: object; + }[]; + }; + }>; + // Accepts an (empty) object because MCP tool validation rejects `undefined` inputs. + COLLECTION_CONNECTIONS_LIST: (params?: Record) => Promise<{ + items: { + id: string; + title: string; + tools: { + name: string; + description: string; + inputSchema: object; + outputSchema: object; + }[]; + }[]; + }>; +}; +const ConnectionSchema = z.object({ + configuration_state: z.object({}), + configuration_scopes: z.array(z.string()), + tools: z.array( + z.object({ + name: z.string(), + description: z.string(), + inputSchema: z.object({}), + outputSchema: z.object({}), + }), + ), +}); + +export interface Registry extends BindingRegistry { + "@deco/event-bus": typeof EVENT_BUS_BINDING; + "@deco/connection": ReturnType< + typeof createCollectionBindings + >; + "@deco/postgres": [ + { + name: "DATABASES_RUN_SQL"; + description: "Run a SQL query against the database"; + inputSchema: z.ZodType<{ + sql: string; + params?: unknown[]; + }>; + outputSchema: z.ZodType<{ + result: { + results?: unknown[]; + success?: boolean; + }[]; + }>; + }, + ]; + "@deco/wallet": [ + { + name: "COMMIT_PRE_AUTHORIZED_AMOUNT"; + inputSchema: z.ZodType<{ + identifier?: string; + contractId: string; + vendorId: string; + amount: string; // in microdollars + metadata?: Record; + }>; + outputSchema: z.ZodType<{ + id: string; + }>; + }, + { + name: "PRE_AUTHORIZE_AMOUNT"; + inputSchema: z.ZodType<{ + amount: string; // in microdollars + metadata?: Record; + }>; + outputSchema: z.ZodType<{ + id: string; + }>; + }, + ]; +} diff --git a/vercel-official/README.md b/vercel-official/README.md new file mode 100644 index 00000000..c1d7bc6f --- /dev/null +++ b/vercel-official/README.md @@ -0,0 +1,43 @@ +# Vercel MCP Server Official + +This is the **official Vercel MCP Server**, provided directly by the Vercel team for integration with Vercel's frontend platform. + +## About Vercel + +Vercel is the platform for frontend developers, providing zero-configuration deployments. With this official MCP, you can: + +- 🚀 **Deployments** - Deploy and manage your applications +- 📊 **Analytics** - Access Web Analytics and performance data +- 🌐 **Domains** - Manage custom domains and DNS +- ⚡ **Edge Functions** - Deploy and manage serverless functions +- 🔄 **Git Integration** - Manage GitHub, GitLab, and Bitbucket connections +- 🤝 **Official Integration** - Direct support and features maintained by the Vercel team + +## Connection + +This MCP connects to the official Vercel server at: + +``` +https://mcp.vercel.com/ +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Vercel API token when prompted +3. Start managing your deployments with AI assistance + +## Official Resources + +- 🌐 Website: [vercel.com](https://vercel.com) +- 📚 Documentation: [vercel.com/docs](https://vercel.com/docs) +- 🆘 Support: Contact through official Vercel support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Vercel team. + +--- + +*This MCP requires an active Vercel account to function.* + diff --git a/vercel-official/app.json b/vercel-official/app.json new file mode 100644 index 00000000..4728433e --- /dev/null +++ b/vercel-official/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "vercel", + "name": "vercel-mcp", + "friendlyName": "Vercel", + "connection": { + "type": "HTTP", + "url": "https://mcp.vercel.com/" + }, + "description": "Deploy and manage your frontend applications with Vercel. Interact with projects, deployments, domains, and serverless functions through natural language.", + "icon": "https://vercel.com/favicon.ico", + "unlisted": false, + "metadata": { + "categories": ["Software Development"], + "official": true, + "mesh_unlisted": true, + "tags": ["deployment", "frontend", "nextjs", "serverless", "vercel", "jamstack", "cdn", "edge-functions", "ci-cd"], + "short_description": "Deploy and manage your frontend applications with Vercel", + "mesh_description": "Vercel is the platform for frontend developers, providing zero-configuration deployments for modern web applications with automatic HTTPS, CDN, and serverless functions. This official MCP enables you to deploy Next.js, React, Vue, Angular, Svelte, and static sites with git integration for automatic deployments on every push. Experience instant rollbacks, preview deployments for every pull request, and production deployments on merge. Manage custom domains with automatic SSL certificate provisioning, DNS configuration, and domain redirects. Configure environment variables per deployment environment (production, preview, development) with encrypted secrets management. Deploy Edge Functions that run on Vercel's global edge network for ultra-low latency, and Serverless Functions for backend API routes with automatic scaling. Access real-time Web Analytics with Core Web Vitals tracking, page performance metrics, and visitor insights without impacting performance. Use Edge Config for ultra-low-latency data access at the edge, and KV for serverless Redis-compatible storage. Configure build settings including framework presets, custom build commands, and output directories. Set up team collaboration with role-based access control, audit logs, and deployment protection rules. Integrate with monitoring tools, implement A/B testing with Edge Middleware, and optimize images automatically with Vercel Image Optimization. Perfect for teams building high-performance web applications." + } +} diff --git a/wix-official/README.md b/wix-official/README.md new file mode 100644 index 00000000..00017d3a --- /dev/null +++ b/wix-official/README.md @@ -0,0 +1,43 @@ +# Wix MCP Server Official + +This is the **official Wix MCP Server**, provided directly by the Wix team for integration with Wix's website building platform. + +## About Wix + +Wix is a leading website builder platform with powerful CMS and e-commerce capabilities. With this official MCP, you can: + +- 🎨 **Website Building** - Create and customize websites through natural language +- 📝 **Content Management** - Manage pages, blogs, and content +- 🛍️ **E-Commerce** - Handle products, orders, and inventory +- 📊 **Analytics** - Access site analytics and visitor data +- 🔌 **Apps & Integrations** - Manage Wix apps and third-party integrations +- 🤝 **Official Integration** - Direct support and features maintained by the Wix team + +## Connection + +This MCP connects to the official Wix server at: + +``` +https://mcp.wix.com/sse +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Wix credentials when prompted +3. Start building and managing your websites with AI assistance + +## Official Resources + +- 🌐 Website: [wix.com](https://www.wix.com) +- 📚 Documentation: [dev.wix.com](https://dev.wix.com) +- 🆘 Support: Contact through official Wix support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Wix team. + +--- + +*This MCP requires an active Wix account to function.* + diff --git a/wix-official/app.json b/wix-official/app.json new file mode 100644 index 00000000..70df66b4 --- /dev/null +++ b/wix-official/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "wix", + "name": "wix-mcp", + "friendlyName": "Wix", + "connection": { + "type": "HTTP", + "url": "https://mcp.wix.com/sse" + }, + "description": "Build and manage websites through natural language with Wix's powerful CMS. Create pages, manage content, customize designs, and handle e-commerce operations.", + "icon": "https://www.wix.com/favicon.ico", + "unlisted": false, + "metadata": { + "categories": ["CMS"], + "official": true, + "mesh_unlisted": true, + "tags": ["website-builder", "cms", "e-commerce", "no-code", "wix", "drag-and-drop", "templates", "blogging", "online-store"], + "short_description": "Build and manage websites with Wix's powerful no-code platform", + "mesh_description": "Wix is a leading website builder platform with over 200 million users worldwide, offering powerful tools for creating professional websites without coding. This official MCP provides natural language access to Wix's comprehensive features including creating and editing pages with drag-and-drop functionality, managing site structure and navigation, and customizing designs with thousands of templates. Build complete e-commerce stores with product catalogs, inventory management, shopping cart, checkout process, and payment gateway integrations including PayPal, Stripe, and Wix Payments. Create and manage blog content with SEO optimization, scheduling, categories, and social media integration. Use Wix's CMS capabilities to create custom databases and dynamic pages for portfolios, directories, and content-rich sites. Add interactive elements like forms, galleries, video backgrounds, animations, and custom interactions without coding. Configure SEO settings including meta tags, structured data, sitemaps, and mobile optimization for better search rankings. Manage domain names, SSL certificates, and email accounts directly from the platform. Use Wix Apps marketplace to extend functionality with thousands of integrations for marketing, analytics, bookings, events, and more. Create member areas with user authentication, roles, and permissions. Implement marketing tools including email campaigns, social media integration, and marketing automation. Access analytics and insights on visitor behavior, conversion rates, and site performance. Perfect for small businesses, entrepreneurs, and creatives building their online presence." + } +}