From 352b024f1c84f67c5e1c6f150931497082f5f6ab Mon Sep 17 00:00:00 2001 From: Matt Carey Date: Mon, 19 Oct 2026 17:46:32 +0100 Subject: [PATCH 1/6] feat(mcp): serve forge-mcp generated direct tools at ?forge=true A forge plugin (src/forge-tools/) builds the direct-tool catalogue with the generic @cloudflare/forge-mcp tools plus the Cloudflare policy: optional account_id, the two values of merged account_or_zone paths, and accepted API token permissions in each tool's extensions. npm run generate:tools builds and runs it with forge; the seed script uploads the catalogue to R2 as forge-mcp-tools.json. /mcp?forge=true serves the catalogue next to docs and whoami: tools/list from the isolate cache, tools/call with the session's account filled in, requests built by forge-mcp, and refusals explained with scope step-up as the other direct tools do. ?codemode=false is unchanged. --- .gitignore | 1 + AGENTS.md | 9 + README.md | 8 + package-lock.json | 5023 +++++++++++++++++++------ package.json | 6 +- scripts/forge-tools.ts | 34 + scripts/generate-tools.ts | 24 + scripts/seed-r2.ts | 13 +- src/forge-tools/cloudflare-plugin.ts | 70 + src/forge-tools/plugin-entry.ts | 10 + src/forge-tools/policy.ts | 32 + src/isolate-cache.ts | 16 + src/mcp-handler.ts | 9 +- src/server.ts | 14 +- src/tools/forge-tools.ts | 172 + tests/forge-tools-plugin.test.ts | 52 + tests/forge-tools-worker.test.ts | 190 + tests/helpers/forge-tools.ts | 68 + vendor/cloudflare-forge-mcp-0.1.0.tgz | Bin 0 -> 711994 bytes 19 files changed, 4569 insertions(+), 1182 deletions(-) create mode 100644 scripts/forge-tools.ts create mode 100644 scripts/generate-tools.ts create mode 100644 src/forge-tools/cloudflare-plugin.ts create mode 100644 src/forge-tools/plugin-entry.ts create mode 100644 src/forge-tools/policy.ts create mode 100644 src/tools/forge-tools.ts create mode 100644 tests/forge-tools-plugin.test.ts create mode 100644 tests/forge-tools-worker.test.ts create mode 100644 tests/helpers/forge-tools.ts create mode 100644 vendor/cloudflare-forge-mcp-0.1.0.tgz diff --git a/.gitignore b/.gitignore index 8fa91f76..44bfaef4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ node_modules dist/ *.log .worktrees/ +generated/ diff --git a/AGENTS.md b/AGENTS.md index db8d6660..008ad1df 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -162,6 +162,15 @@ The consent page offers minimal, read-only and full-access templates. Minimal is - `mcp-tools.json` holds the final wire JSON Schemas (including the session-independent optional `account_id`) plus minimal request-routing metadata. Each isolate builds the `tools/list` payload from it once and serves it unchanged; `tools/call` lazily validates/dispatches only the requested operation with Zod. No per-endpoint SDK tools are registered - `src/isolate-cache.ts` caches all three artifacts for one hour in warm isolates. Concurrent requests on a cold isolate share one load, and a failed load is not cached. There is no fallback: a missing `mcp-tools.json` fails the request, so seed R2 (`npm run seed:staging` / `seed:prod`) before deploying a change to its key or shape +### forge-mcp direct tools (`?forge=true`, opt-in) + +A second direct-tool surface, generated by forge rather than by `src/openapi.ts`, while it is tried out: + +- `src/forge-tools/plugin-entry.ts` is a forge plugin: the generic `@cloudflare/forge-mcp` catalogue (vendored in `vendor/` until it is published) with the Cloudflare policy in `src/forge-tools/cloudflare-plugin.ts` applied. `account_id` is optional with one description, merged `account_or_zone` tools name their two values, and accepted API token permissions go in each tool's `extensions`, which clients never see. `src/forge-tools/policy.ts` holds what the plugin and the Worker share +- `npm run generate:tools` builds the plugin with `forge-plugin` and runs the `forge` binary (both from the `@cloudflare/forge` dev dependency) on the latest `openapi.forge.json`, into `generated/forge/` (gitignored). The scheduled handler can't run forge, so `forge-mcp-tools.json` reaches R2 only through `npm run seed:staging` / `seed:prod` for now +- `src/tools/forge-tools.ts` serves the catalogue from the isolate cache next to `docs` and `whoami`, fills in the session's account, builds each request with forge-mcp's `buildRequest`, and explains refused calls and steps up OAuth scopes like the other direct tools +- Tool names are forge's (`d1_list`, `zones_list`), not `src/openapi.ts`'s, so `?forge=true` is a separate opt-in; `?codemode=false` is unchanged + ### Skills over MCP The server implements the MCP Skills extension (`io.modelcontextprotocol/skills`, [SEP-2640](https://github.com/modelcontextprotocol/ext-skills/blob/main/specification/stable/skills.mdx)) in both tool modes and serves the skills from [`cloudflare/skills`](https://github.com/cloudflare/skills). diff --git a/README.md b/README.md index 26099f31..b11885cb 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,14 @@ https://mcp.cloudflare.com/mcp?codemode=false&truncateToolResult=false > **Note:** Without the cap, a broad query can return megabytes. Only turn it off when your client bounds what reaches the model. +### Forge-generated tools (preview) + +`?forge=true` serves direct tools generated by [forge-mcp](https://github.com/cloudflare/forge) from the Cloudflare API's [Forge](https://github.com/cloudflare/forge) document instead. Tool names follow the `cf` CLI (`zones_list`, `d1_list`), and request bodies are typed, nested JSON. It is a preview: names and schemas may change. + +``` +https://mcp.cloudflare.com/mcp?forge=true +``` + ### Missing Permissions When Cloudflare refuses a call because the OAuth connection lacks a scope, the server asks the client to re-authorize with that scope added to the ones it already has. Claude and other clients that follow the [MCP authorization spec](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization#scope-challenge-handling) get a `403 insufficient_scope` challenge. Codex and ChatGPT get it in the tool result, which is where they look for it. Either way, the tool error says which scope is missing. diff --git a/package-lock.json b/package-lock.json index 5877003b..b1ff5146 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "cloudflare-mcp", "version": "0.1.0", "dependencies": { + "@cloudflare/forge-mcp": "file:vendor/cloudflare-forge-mcp-0.1.0.tgz", "@cloudflare/workers-oauth-provider": "^1.2.3", "@modelcontextprotocol/server": "2.3.1", "hono": "^4.13.7", @@ -15,6 +16,8 @@ "zod": "^4.3.5" }, "devDependencies": { + "@bytecodealliance/jco": "1.37.0", + "@cloudflare/forge": "https://pkg.pr.new/cloudflare/forge/@cloudflare/forge@ca70d7f5", "@cloudflare/vitest-plugin": "^1.4.0", "@modelcontextprotocol/client": "2.3.1", "@types/node": "^25.0.6", @@ -29,104 +32,124 @@ "wrangler": "^4.149.0" } }, - "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", - "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", + "node_modules/@andreiltd/componentize-qjs-binding-darwin-arm64": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-darwin-arm64/-/componentize-qjs-binding-darwin-arm64-0.4.5.tgz", + "integrity": "sha512-CW+ukVP778x2NAHAC1FvXb5KVSXmUlUQxhQTFtF0mAqqOVnYrQgy4DDNUa48EGthwtLdgLT1+eE71qmQiyMEqg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT OR Apache-2.0", + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=22.0.0" + "node": ">=18.0.0" } }, - "node_modules/@cloudflare/unenv-preset": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.2.tgz", - "integrity": "sha512-JBP1+Z7ZSNG/d4mRP+y8VC5dka3tZVMLEZRvS+rzQ4DGV1EoxRFQckcJTTkXbHSQiTj0DtNI01Zwb/V2fX0mvQ==", + "node_modules/@andreiltd/componentize-qjs-binding-darwin-x64": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-darwin-x64/-/componentize-qjs-binding-darwin-x64-0.4.5.tgz", + "integrity": "sha512-37uz97pCEuXNfoVuZMBbI6xUirSndxJyMzPa4UCQb9nJdZhzRujmrU79yiFl+5nDYQxcCjthhBVEKU3OxJNAdg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT OR Apache-2.0", - "peerDependencies": { - "unenv": "2.0.0-rc.24", - "workerd": ">1.20260305.0 <2.0.0-0" - }, - "peerDependenciesMeta": { - "workerd": { - "optional": true - } + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@cloudflare/vitest-plugin": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@cloudflare/vitest-plugin/-/vitest-plugin-1.4.0.tgz", - "integrity": "sha512-SgIhyhpVH+2MVSJxidG8gosqrpzF25IwKevQhPykwulTgAFe4s0Nkj71pNzqCkwV2+A4NKkHJP2ReyyRsoIxsg==", + "node_modules/@andreiltd/componentize-qjs-binding-linux-arm64-gnu": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-linux-arm64-gnu/-/componentize-qjs-binding-linux-arm64-gnu-0.4.5.tgz", + "integrity": "sha512-L5S0C6qIx3f+DnwN42HnDuMhV8NgfqaY+J1PaJAw468Ip/JN+h67tVAp4wUvs8xgTqj6UnGSBbSZVGYifK2XtA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "cjs-module-lexer": "1.2.3", - "esbuild": "0.28.2", - "miniflare": "5.20261006.1-alpha", - "wrangler": "4.149.0", - "zod": "4.6.5" - }, - "peerDependencies": { - "vitest": "^4.1.0 || ^5.0.0" + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20261006.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20261006.1.tgz", - "integrity": "sha512-lCX6avJO2It9AyDEYitjmOtJRVp/xmaW0TziyoLAnfxlzozyyRbSFfIIMMCiDx/sTP1++E4VLbV+7BHSD33f0Q==", + "node_modules/@andreiltd/componentize-qjs-binding-linux-arm64-musl": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-linux-arm64-musl/-/componentize-qjs-binding-linux-arm64-musl-0.4.5.tgz", + "integrity": "sha512-bBaq8/tvQ6HweqBLKWkE5tsPEMf7g3l5EGtka3Z7AFDUOtFzkAkG67nW1OYiYT6/0pjwDYw7Mvya45f79PG28g==", "cpu": [ - "x64" + "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "Apache-2.0", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": ">=16" + "node": ">=18.0.0" } }, - "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20261006.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20261006.1.tgz", - "integrity": "sha512-PyFGjOaldtppnLuKsdkoYWXfLVpDjuf8u+uoykX+1Xvxo2EPmCVViq0iDKm+U7c7PRno85ehS3/MPVXyk2HwHw==", + "node_modules/@andreiltd/componentize-qjs-binding-linux-x64-gnu": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-linux-x64-gnu/-/componentize-qjs-binding-linux-x64-gnu-0.4.5.tgz", + "integrity": "sha512-Xec4O4sy/xHlhPPhf7GAV41D+AT7f9vxxjBpE7lUIElZNhX/kc+Ty6AQG50xbHsT5Mi4XQvSmtJJqhnB6xi8Vw==", "cpu": [ - "arm64" + "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "Apache-2.0", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": ">=16" + "node": ">=18.0.0" } }, - "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20261006.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20261006.1.tgz", - "integrity": "sha512-Ntf9S8eesmVufdjaT2kzWlz6Ng9XGYTc6cHQVRKAg59lFufwsIabGeMT6U4KkrpEeSIxgHq8aPtuLbZXE19tCA==", + "node_modules/@andreiltd/componentize-qjs-binding-linux-x64-musl": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-linux-x64-musl/-/componentize-qjs-binding-linux-x64-musl-0.4.5.tgz", + "integrity": "sha512-62+PgJ+tJOjgNvXzRuz3s76tPBaExCodeVhDIIXkGI/PNbulqTHiyYXRw4O3UX6/CO71Nux8onqnXxQkcXBlvg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=16" + "node": ">=18.0.0" } }, - "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20261006.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20261006.1.tgz", - "integrity": "sha512-JyeDBymVWw5tVRebSsVE8ojDYxd6UlZrAseHU8G+NpIyd5wF61tXlF/axLeCUqu0pOhBFHb8I5QKi0jwrCK41Q==", + "node_modules/@andreiltd/componentize-qjs-binding-win32-arm64-msvc": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-win32-arm64-msvc/-/componentize-qjs-binding-win32-arm64-msvc-0.4.5.tgz", + "integrity": "sha512-OZO/omsMQFpw3wJJs3XFN+iEu2ZQCWMK8BxkhmXVm1sddEHtgSTY2sT/zq69VZeXjC0zgN1HzlxHbNBq0OkcOQ==", "cpu": [ "arm64" ], @@ -134,16 +157,16 @@ "license": "Apache-2.0", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=16" + "node": ">=18.0.0" } }, - "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20261006.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20261006.1.tgz", - "integrity": "sha512-nWP0URNqOBN9fa/gZ7eh/w051DwjOXN8j4lDZDYVXyQPsux6sV3DfyYZT+CjR/rt9nKBSmJT9QE9/bWT18+84w==", + "node_modules/@andreiltd/componentize-qjs-binding-win32-x64-msvc": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-win32-x64-msvc/-/componentize-qjs-binding-win32-x64-msvc-0.4.5.tgz", + "integrity": "sha512-IlhlcNOEFky46ypfiD6l8MS45zosfhKWUclr10evQFw5Cpky+pji2RAGJRnBXdLQvH4Q3bZr6KYlIhxmtGRhkw==", "cpu": [ "x64" ], @@ -154,434 +177,734 @@ "win32" ], "engines": { - "node": ">=16" + "node": ">=18.0.0" } }, - "node_modules/@cloudflare/workers-oauth-provider": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-oauth-provider/-/workers-oauth-provider-1.2.3.tgz", - "integrity": "sha512-40eGeA3DnTOEl2ijHYY5Z9yNIf0fdjgomoaA6GHPo4FyKQw0oXPuy4GVjTE/uNfS/MoFAvzsuVBRwTPKUki4hA==", - "license": "MIT" + "node_modules/@bytecodealliance/componentize-js": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/componentize-js/-/componentize-js-0.23.0.tgz", + "integrity": "sha512-Qc2+lrwJHU7lq4CBMyVVYE8ASyUFeegMYdRnMVG0wNpNiATzGDF/mWpjDNTeVZeT8L9chhK3vuLaQE9FVANvfw==", + "dev": true, + "workspaces": [ + "." + ], + "dependencies": { + "@bytecodealliance/jco": "^1.15.1", + "@bytecodealliance/weval": "^0.5.0", + "@bytecodealliance/wizer": "^10.0.0", + "es-module-lexer": "^1.6.0", + "oxc-parser": "^0.76.0" + }, + "bin": { + "componentize-js": "src/cli.js" + } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@bytecodealliance/componentize-js-0-19-3": { + "name": "@bytecodealliance/componentize-js", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@bytecodealliance/componentize-js/-/componentize-js-0.19.3.tgz", + "integrity": "sha512-ju7Y4WeF0B9uMkSPHJgmT6ouEfSwbe9M1uR/YOnYZjBpxJjH9qzxIkJg/kf8NycVDyFJ2/lscmJ1E1uPiDQVRQ==", "dev": true, - "license": "MIT", + "workspaces": [ + "." + ], "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@bytecodealliance/jco": "^1.15.1", + "@bytecodealliance/wizer": "^10.0.0", + "es-module-lexer": "^1.6.0", + "oxc-parser": "^0.76.0" }, - "engines": { - "node": ">=12" + "bin": { + "componentize-js": "src/cli.js" } }, - "node_modules/@emnapi/runtime": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", - "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "node_modules/@bytecodealliance/componentize-js-0-19-3/node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, - "license": "MIT", - "optional": true, + "license": "MIT" + }, + "node_modules/@bytecodealliance/componentize-js/node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@bytecodealliance/jco": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco/-/jco-1.37.0.tgz", + "integrity": "sha512-z/crtP4L3wumdFA74K1cEsLfdZ8Ki0dE/7m1fJ9SVq5Z9VsAf0yQXWQzMb6ZrJmXvRN+4wHC2MNkFwSFdaoBzQ==", + "dev": true, + "license": "(Apache-2.0 WITH LLVM-exception)", "dependencies": { - "tslib": "^2.4.0" + "@bytecodealliance/componentize-js": "^0.23.0", + "@bytecodealliance/componentize-js-0-19-3": "npm:@bytecodealliance/componentize-js@^0.19.3", + "@bytecodealliance/jco-std": "^0.7.0", + "@bytecodealliance/jco-transpile": "^0.18.0", + "@bytecodealliance/preview2-shim": "^0.28.0", + "binaryen": "^132.0.0", + "commander": "^14", + "componentize-qjs": "^0.4.5", + "mkdirp": "^3", + "regexpu-core": "6.4.0", + "rolldown": "^1.2.4", + "typescript": "7.0.2", + "typescript-compiler-api": "npm:typescript@6.0.3", + "unenv": "2.0.0-rc.24" + }, + "bin": { + "jco": "dist/jco.js" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", - "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "node_modules/@bytecodealliance/jco-node-fs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs/-/jco-node-fs-0.3.2.tgz", + "integrity": "sha512-yxvqQreNcOQdMsEKZomkSqThtkxrAz3f1Cmy8BsV0UHi9saa2/D1KDB14IAXPYwDq/maS6lCzS+MuMQx6QkUgA==", + "dev": true, + "license": "(Apache-2.0 WITH LLVM-exception)", + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "@bytecodealliance/jco-node-fs-darwin-arm64": "0.3.2", + "@bytecodealliance/jco-node-fs-darwin-x64": "0.3.2", + "@bytecodealliance/jco-node-fs-linux-arm64-gnu": "0.3.2", + "@bytecodealliance/jco-node-fs-linux-arm64-musl": "0.3.2", + "@bytecodealliance/jco-node-fs-linux-x64-gnu": "0.3.2", + "@bytecodealliance/jco-node-fs-linux-x64-musl": "0.3.2", + "@bytecodealliance/jco-node-fs-win32-arm64-msvc": "0.3.2", + "@bytecodealliance/jco-node-fs-win32-x64-msvc": "0.3.2" + } + }, + "node_modules/@bytecodealliance/jco-node-fs-darwin-arm64": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-darwin-arm64/-/jco-node-fs-darwin-arm64-0.3.2.tgz", + "integrity": "sha512-WXQq1tRVUWhbK+ImH0G8Kni2AR0sdokLf/KyXRw5P6n4A9ZbgMHOuPfN/PEsYgw4eosuTAonutK0xILk/hA81A==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, - "license": "MIT", + "license": "(Apache-2.0 WITH LLVM-exception)", "optional": true, "os": [ - "aix" + "darwin" ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", - "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "node_modules/@bytecodealliance/jco-node-fs-darwin-x64": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-darwin-x64/-/jco-node-fs-darwin-x64-0.3.2.tgz", + "integrity": "sha512-Fy/OjHnto7hNE5ksewVkmAMXG/uXyj+RAKFZWQFTzFkp73UyT5vuPjKq3nvx9KolUGWBG37BudEMb4ZAoD9TbQ==", "cpu": [ - "arm" + "x64" ], "dev": true, - "license": "MIT", + "license": "(Apache-2.0 WITH LLVM-exception)", "optional": true, "os": [ - "android" + "darwin" ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", - "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "node_modules/@bytecodealliance/jco-node-fs-linux-arm64-gnu": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-linux-arm64-gnu/-/jco-node-fs-linux-arm64-gnu-0.3.2.tgz", + "integrity": "sha512-OafRtRu3tfOFQARfkia/LDEqSo2R3yAL1xPwzf4RcRW6JqkOY7qKWsUS5+LPVo/aFaSkMX7F7bdFGpFPmcoZJg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "(Apache-2.0 WITH LLVM-exception)", "optional": true, "os": [ - "android" + "linux" ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", - "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "node_modules/@bytecodealliance/jco-node-fs-linux-arm64-musl": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-linux-arm64-musl/-/jco-node-fs-linux-arm64-musl-0.3.2.tgz", + "integrity": "sha512-JblDiwD7+Y+w0d/tjaNDX4QdGvh5lyuDc+S/jDeT7sYA1caA9yiwIjLa8PC/lm2xudqSxD+Cuy4AosXvl+qI0g==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "MIT", + "libc": [ + "musl" + ], + "license": "(Apache-2.0 WITH LLVM-exception)", "optional": true, "os": [ - "android" + "linux" ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", - "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "node_modules/@bytecodealliance/jco-node-fs-linux-x64-gnu": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-linux-x64-gnu/-/jco-node-fs-linux-x64-gnu-0.3.2.tgz", + "integrity": "sha512-6FzmHoLOsa6b4X9AuFLsvlpNF66Dt4sRRftZHaT1I1pYzCWrJkkpgNJhRXxf67ZPmOwBZJT4dan/g752Rx4xRw==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "(Apache-2.0 WITH LLVM-exception)", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", - "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "node_modules/@bytecodealliance/jco-node-fs-linux-x64-musl": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-linux-x64-musl/-/jco-node-fs-linux-x64-musl-0.3.2.tgz", + "integrity": "sha512-SbAJG2PDV8YAHBESHU9sVSckOitJyvlezdF4CGP5/mOp01JnijVkLVXzGK62yVSfa5TpAybbSd1rk+v36NAW/Q==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "libc": [ + "musl" + ], + "license": "(Apache-2.0 WITH LLVM-exception)", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", - "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "node_modules/@bytecodealliance/jco-node-fs-win32-arm64-msvc": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-win32-arm64-msvc/-/jco-node-fs-win32-arm64-msvc-0.3.2.tgz", + "integrity": "sha512-nUWYdFysRQJGsIOCk0KAYN2smkNYiHG7rZ7m+0ZXqP+5wqWxKEjkDsORwXiBjdaWFLVww0anZ3SBxrju6P7hXQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "(Apache-2.0 WITH LLVM-exception)", "optional": true, "os": [ - "freebsd" + "win32" ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", - "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "node_modules/@bytecodealliance/jco-node-fs-win32-x64-msvc": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-win32-x64-msvc/-/jco-node-fs-win32-x64-msvc-0.3.2.tgz", + "integrity": "sha512-RsPj2t8TvltsMWK7/Z7JcVC/IWPMi07/AJkNLiNTCuGTdT/sseqTThJJwhuz3sjFw7dJdxA+bSGT+23y/KT0fw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "(Apache-2.0 WITH LLVM-exception)", "optional": true, "os": [ - "freebsd" + "win32" ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", - "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", - "cpu": [ - "arm" - ], + "node_modules/@bytecodealliance/jco-std": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-std/-/jco-std-0.7.0.tgz", + "integrity": "sha512-QSiIRXS5eMUTe0gt5D45vZK4Pt7Hdf0S0Gr2Lt3+Q0h4YIq+n8EbEioQ2lem2edNWT/Zym+YvEXDZOhS3qZ2dw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "(Apache-2.0 WITH LLVM-exception)", + "dependencies": { + "acorn": "8.17.0", + "acorn-walk": "8.3.5", + "minimatch": "10.2.6", + "punycode": "2.3.1", + "readable-stream": "4.7.0", + "urlpattern-polyfill": "10.1.0", + "whatwg-url": "14.2.0" + }, + "peerDependencies": { + "@bytecodealliance/preview2-shim": "^0.28.0" + }, + "peerDependenciesMeta": { + "@bytecodealliance/preview2-shim": { + "optional": true + } + } + }, + "node_modules/@bytecodealliance/jco-transpile": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-transpile/-/jco-transpile-0.18.0.tgz", + "integrity": "sha512-Ou4MWoxGC6HKBjRpTJ4SEUxsN8DOAv9LIi2RD22Kosq2OZTnUvKikFrOAGS2vCGNMzvXkeKBS1jFMLKzYBk4pg==", + "dev": true, + "license": "(Apache-2.0 WITH LLVM-exception)", + "dependencies": { + "@bytecodealliance/preview2-shim": "^0.28.0", + "@bytecodealliance/preview3-shim": "^0.9.0", + "binaryen": "^132.0.0", + "oxc-minify": "^0.151.0" + } + }, + "node_modules/@bytecodealliance/jco/node_modules/typescript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc" + }, "engines": { - "node": ">=18" + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/@bytecodealliance/preview2-shim": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/preview2-shim/-/preview2-shim-0.28.0.tgz", + "integrity": "sha512-55y59uAzYMTA1bTepmgC7LmK8DUyhOU+y7cfKQRV7wRVABMYna4t7KYpBUkO8VhI+FbDn5cq0ghPLelaP24OpQ==", + "dev": true, + "license": "(Apache-2.0 WITH LLVM-exception)", + "dependencies": { + "@bytecodealliance/jco-node-fs": "0.3.2" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", - "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "node_modules/@bytecodealliance/preview3-shim": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/preview3-shim/-/preview3-shim-0.9.0.tgz", + "integrity": "sha512-/0dEMWyxFyTF/1tsxspU8p6dgfWnQ4SSY+ray8QBJi7KFJu1W6R3M3BFRL83PJ+PmMyuOBaRhhYH3rR6kE+pcA==", + "dev": true, + "license": "(Apache-2.0 WITH LLVM-exception)", + "dependencies": { + "@bytecodealliance/jco-node-fs": "0.3.2", + "@bytecodealliance/preview2-shim": "^0.28.0" + } + }, + "node_modules/@bytecodealliance/weval": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@bytecodealliance/weval/-/weval-0.5.1.tgz", + "integrity": "sha512-Hb8qRoF3b2UgkZqeDTzaTKGITa31KCLcoyfFstE/uO/aYVUyHweaNDchF4SNrPQfEpiBwRnMUilI4Jbbl8Hl6w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@napi-rs/lzma": "^1.1.2", + "fflate": "^0.8.3", + "tar": "^7.5.19" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@bytecodealliance/wizer": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer/-/wizer-10.0.0.tgz", + "integrity": "sha512-ziWmovyu1jQl9TsKlfC2bwuUZwxVPFHlX4fOqTzxhgS76jITIo45nzODEwPgU+jjmOr8F3YX2V2wAChC5NKujg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "wizer": "wizer.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@bytecodealliance/wizer-darwin-arm64": "10.0.0", + "@bytecodealliance/wizer-darwin-x64": "10.0.0", + "@bytecodealliance/wizer-linux-arm64": "10.0.0", + "@bytecodealliance/wizer-linux-s390x": "10.0.0", + "@bytecodealliance/wizer-linux-x64": "10.0.0", + "@bytecodealliance/wizer-win32-x64": "10.0.0" + } + }, + "node_modules/@bytecodealliance/wizer-darwin-arm64": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-darwin-arm64/-/wizer-darwin-arm64-10.0.0.tgz", + "integrity": "sha512-dhZTWel+xccGTKSJtI9A7oM4yyP20FWflsT+AoqkOqkCY7kCNrj4tmMtZ6GXZFRDkrPY5+EnOh62sfShEibAMA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "linux" + "darwin" ], - "engines": { - "node": ">=18" + "bin": { + "wizer-darwin-arm64": "wizer" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", - "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "node_modules/@bytecodealliance/wizer-darwin-x64": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-darwin-x64/-/wizer-darwin-x64-10.0.0.tgz", + "integrity": "sha512-r/LUIZw6Q3Hf4htd46mD+EBxfwjBkxVIrTM1r+B2pTCddoBYQnKVdVsI4UFyy7NoBxzEg8F8BwmTNoSLmFRjpw==", "cpu": [ - "ia32" + "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "linux" + "darwin" ], - "engines": { - "node": ">=18" + "bin": { + "wizer-darwin-x64": "wizer" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", - "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "node_modules/@bytecodealliance/wizer-linux-arm64": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-arm64/-/wizer-linux-arm64-10.0.0.tgz", + "integrity": "sha512-pGSfFWXzeTqHm6z1PtVaEn+7Fm3QGC8YnHrzBV4sQDVS3N1NwmuHZAc8kslmlFPNdu61ycEvdOsSgCny8JPQvg==", "cpu": [ - "loong64" + "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=18" + "bin": { + "wizer-linux-arm64": "wizer" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", - "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "node_modules/@bytecodealliance/wizer-linux-s390x": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-s390x/-/wizer-linux-s390x-10.0.0.tgz", + "integrity": "sha512-O8vHxRTAdb1lUnVXMIMTcp/9q4pq1D4iIKigJCipg2JN15taV9uFAWh0fO88wylXwuSlO7dOE1AwQl54fMKXQg==", "cpu": [ - "mips64el" + "s390x" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=18" + "bin": { + "wizer-linux-s390x": "wizer" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", - "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "node_modules/@bytecodealliance/wizer-linux-x64": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-x64/-/wizer-linux-x64-10.0.0.tgz", + "integrity": "sha512-fJtM1sy43FBMnp+xpapFX6U1YdTBKA/1T4CYfG/qeE8jn0SXk2EuiYoY/EnC2uyNy9hjTrvfdYO5n4MXW0EIdQ==", "cpu": [ - "ppc64" + "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=18" + "bin": { + "wizer-linux-x64": "wizer" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", - "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "node_modules/@bytecodealliance/wizer-win32-x64": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-win32-x64/-/wizer-win32-x64-10.0.0.tgz", + "integrity": "sha512-55BPLfGT7iT7gH5M69NpTM16QknJZ7OxJ0z73VOEoeGA9CT8QPKMRzFKsPIvLs+W8G28fdudFA94nElrdkp3Kg==", "cpu": [ - "riscv64" + "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "linux" + "win32" ], + "bin": { + "wizer-win32-x64": "wizer" + } + }, + "node_modules/@cloudflare/forge": { + "version": "0.1.0", + "resolved": "https://pkg.pr.new/cloudflare/forge/@cloudflare/forge@ca70d7f5", + "integrity": "sha512-h6POFCKOMX96O8RFhV/ZNyQouZdJIbx8e51D4pq6NKxNeCixV4fuSc4bKbieX0xVfF+e81iw5HlG9vKg9twvlw==", + "dev": true, + "bin": { + "forge": "bin/forge.cjs", + "forge-plugin": "bin/forge-plugin.mjs" + }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@bytecodealliance/jco": "^1.37.0" + }, + "peerDependenciesMeta": { + "@bytecodealliance/jco": { + "optional": true + } } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", - "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", - "cpu": [ - "s390x" - ], + "node_modules/@cloudflare/forge-mcp": { + "version": "0.1.0", + "resolved": "file:vendor/cloudflare-forge-mcp-0.1.0.tgz", + "integrity": "sha512-uqpZCVozTOkmdL+wNoenKp1J4OndTEOMAFgD6/Lf1WCcLb8N2e+J3JqnruW15oR0a5e2XFo8ZK1lQxgsXi54+g==", + "dependencies": { + "@modelcontextprotocol/server": "2.3.1" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", + "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT OR Apache-2.0", "engines": { - "node": ">=18" + "node": ">=22.0.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", - "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "node_modules/@cloudflare/unenv-preset": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.2.tgz", + "integrity": "sha512-JBP1+Z7ZSNG/d4mRP+y8VC5dka3tZVMLEZRvS+rzQ4DGV1EoxRFQckcJTTkXbHSQiTj0DtNI01Zwb/V2fX0mvQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": ">1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/vitest-plugin": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@cloudflare/vitest-plugin/-/vitest-plugin-1.4.0.tgz", + "integrity": "sha512-SgIhyhpVH+2MVSJxidG8gosqrpzF25IwKevQhPykwulTgAFe4s0Nkj71pNzqCkwV2+A4NKkHJP2ReyyRsoIxsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cjs-module-lexer": "1.2.3", + "esbuild": "0.28.2", + "miniflare": "5.20261006.1-alpha", + "wrangler": "4.149.0", + "zod": "4.6.5" + }, + "peerDependencies": { + "vitest": "^4.1.0 || ^5.0.0" + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20261006.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20261006.1.tgz", + "integrity": "sha512-lCX6avJO2It9AyDEYitjmOtJRVp/xmaW0TziyoLAnfxlzozyyRbSFfIIMMCiDx/sTP1++E4VLbV+7BHSD33f0Q==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", - "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20261006.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20261006.1.tgz", + "integrity": "sha512-PyFGjOaldtppnLuKsdkoYWXfLVpDjuf8u+uoykX+1Xvxo2EPmCVViq0iDKm+U7c7PRno85ehS3/MPVXyk2HwHw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "netbsd" + "darwin" ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", - "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20261006.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20261006.1.tgz", + "integrity": "sha512-Ntf9S8eesmVufdjaT2kzWlz6Ng9XGYTc6cHQVRKAg59lFufwsIabGeMT6U4KkrpEeSIxgHq8aPtuLbZXE19tCA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", - "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20261006.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20261006.1.tgz", + "integrity": "sha512-JyeDBymVWw5tVRebSsVE8ojDYxd6UlZrAseHU8G+NpIyd5wF61tXlF/axLeCUqu0pOhBFHb8I5QKi0jwrCK41Q==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", - "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20261006.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20261006.1.tgz", + "integrity": "sha512-nWP0URNqOBN9fa/gZ7eh/w051DwjOXN8j4lDZDYVXyQPsux6sV3DfyYZT+CjR/rt9nKBSmJT9QE9/bWT18+84w==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "openbsd" + "win32" ], "engines": { - "node": ">=18" + "node": ">=16" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", - "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "node_modules/@cloudflare/workers-oauth-provider": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-oauth-provider/-/workers-oauth-provider-1.2.3.tgz", + "integrity": "sha512-40eGeA3DnTOEl2ijHYY5Z9yNIf0fdjgomoaA6GHPo4FyKQw0oXPuy4GVjTE/uNfS/MoFAvzsuVBRwTPKUki4hA==", + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", + "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "openharmony" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/sunos-x64": { + "node_modules/@esbuild/android-arm": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", - "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ - "x64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "sunos" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-arm64": { + "node_modules/@esbuild/android-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", - "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], @@ -589,487 +912,425 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-ia32": { + "node_modules/@esbuild/android-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", - "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ - "ia32" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-x64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@img/colour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">=18" } }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.5.tgz", - "integrity": "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "darwin" + "freebsd" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.3.4" + "node": ">=18" } }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.5.tgz", - "integrity": "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "darwin" + "freebsd" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.3.4" + "node": ">=18" } }, - "node_modules/@img/sharp-freebsd-wasm32": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", - "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "freebsd" + "linux" ], - "dependencies": { - "@img/sharp-wasm32": "0.35.5" - }, "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.4.tgz", - "integrity": "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], "dev": true, - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.4.tgz", - "integrity": "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ - "x64" + "ia32" ], "dev": true, - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.4.tgz", - "integrity": "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ - "arm" + "loong64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.4.tgz", - "integrity": "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ - "arm64" + "mips64el" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.4.tgz", - "integrity": "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.4.tgz", - "integrity": "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.4.tgz", - "integrity": "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.4.tgz", - "integrity": "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.4.tgz", - "integrity": "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.4.tgz", - "integrity": "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.5.tgz", - "integrity": "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ - "arm" + "arm64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "openbsd" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.3.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.5.tgz", - "integrity": "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "openbsd" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.3.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.5.tgz", - "integrity": "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "openharmony" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.3.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.5.tgz", - "integrity": "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ - "riscv64" + "x64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "sunos" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.3.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.5.tgz", - "integrity": "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ - "s390x" + "arm64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.3.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.5.tgz", - "integrity": "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ - "x64" + "ia32" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.3.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.5.tgz", - "integrity": "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "libc": [ - "musl" - ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.5.tgz", + "integrity": "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" ], "engines": { "node": ">=20.9.0" @@ -1078,24 +1339,21 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" + "@img/sharp-libvips-darwin-arm64": "1.3.4" } }, - "node_modules/@img/sharp-linuxmusl-x64": { + "node_modules/@img/sharp-darwin-x64": { "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.5.tgz", - "integrity": "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.5.tgz", + "integrity": "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">=20.9.0" @@ -1104,18 +1362,21 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.3.4" + "@img/sharp-libvips-darwin-x64": "1.3.4" } }, - "node_modules/@img/sharp-wasm32": { + "node_modules/@img/sharp-freebsd-wasm32": { "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", - "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", + "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "license": "Apache-2.0", "optional": true, + "os": [ + "freebsd" + ], "dependencies": { - "@emnapi/runtime": "^1.11.3" + "@img/sharp-wasm32": "0.35.5" }, "engines": { "node": ">=20.9.0" @@ -1124,309 +1385,2075 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-webcontainers-wasm32": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.5.tgz", - "integrity": "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.4.tgz", + "integrity": "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", "cpu": [ - "wasm32" + "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "LGPL-3.0-or-later", "optional": true, - "dependencies": { - "@img/sharp-wasm32": "0.35.5" - }, - "engines": { - "node": ">=20.9.0" - }, + "os": [ + "darwin" + ], "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.5.tgz", - "integrity": "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.4.tgz", + "integrity": "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "win32" + "darwin" ], - "engines": { - "node": ">=20.9.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.5.tgz", - "integrity": "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.4.tgz", + "integrity": "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", "cpu": [ - "ia32" + "arm" ], "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "win32" + "linux" ], - "engines": { - "node": "^20.9.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.5.tgz", - "integrity": "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.4.tgz", + "integrity": "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "win32" + "linux" ], - "engines": { - "node": ">=20.9.0" - }, "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@inquirer/ansi": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", - "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.4.tgz", + "integrity": "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@inquirer/confirm": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", - "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.4.tgz", + "integrity": "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^11.2.1", - "@inquirer/type": "^4.0.7" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@inquirer/core": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", - "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.4.tgz", + "integrity": "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^2.0.7", - "@inquirer/figures": "^2.0.7", - "@inquirer/type": "^4.0.7", - "cli-width": "^4.1.0", - "fast-wrap-ansi": "^0.2.0", - "mute-stream": "^3.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@inquirer/figures": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", - "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.4.tgz", + "integrity": "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.4.tgz", + "integrity": "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.4.tgz", + "integrity": "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.5.tgz", + "integrity": "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.5.tgz", + "integrity": "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.5.tgz", + "integrity": "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.5.tgz", + "integrity": "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.5.tgz", + "integrity": "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.5.tgz", + "integrity": "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.5.tgz", + "integrity": "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.5.tgz", + "integrity": "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", + "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.5.tgz", + "integrity": "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.5.tgz", + "integrity": "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.5.tgz", + "integrity": "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.5.tgz", + "integrity": "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@inquirer/ansi": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", + "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/confirm": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", + "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", + "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/type": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", + "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@modelcontextprotocol/client": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/client/-/client-2.3.1.tgz", + "integrity": "sha512-mIGZXpHsjnZ6lD+gD/WCMpR5k8yVQQ8nNFH1N0Srf7AvnwTUMYD6pvTY8ng2+He5FfV7YMZLmrjL7cLa/cc3dQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@modelcontextprotocol/core": "2.3.1", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.8", + "jose": "^6.1.3", + "pkce-challenge": "^5.0.0", + "zod": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@modelcontextprotocol/core": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.3.1.tgz", + "integrity": "sha512-laVmIhPGpWi7rG9q+0UigblRN0Hws/Yjlb6qLFtVqryXVLkc4h+yN8z731POD2LnAGQlFe7/tXhUm7Bi0YB91g==", + "license": "Apache-2.0", + "dependencies": { + "zod": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@modelcontextprotocol/server": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.3.1.tgz", + "integrity": "sha512-e59MfWuSssj6DoQ96JCTqdW1AXT5/XtnTl0WWd6MU1Ka434fFUGGosCLJbGNySDhHGvxQWoRWK137FXYFkYNWw==", + "license": "Apache-2.0", + "dependencies": { + "@modelcontextprotocol/core": "2.3.1", + "zod": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.41.9", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.9.tgz", + "integrity": "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mswjs/interceptors/node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@napi-rs/lzma": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma/-/lzma-1.5.1.tgz", + "integrity": "sha512-sgOZ89+y8cDbY+3WbzR8CtIhCuFRWotZ9/2PjPVDJHz6np5KFTAev0DrwiyTJTgFsCRDhfGlbmhMgyhHbWdZ6g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.20 || ^24.12 || >=25" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/lzma-android-arm-eabi": "1.5.1", + "@napi-rs/lzma-android-arm64": "1.5.1", + "@napi-rs/lzma-darwin-arm64": "1.5.1", + "@napi-rs/lzma-darwin-x64": "1.5.1", + "@napi-rs/lzma-freebsd-x64": "1.5.1", + "@napi-rs/lzma-linux-arm-gnueabihf": "1.5.1", + "@napi-rs/lzma-linux-arm64-gnu": "1.5.1", + "@napi-rs/lzma-linux-arm64-musl": "1.5.1", + "@napi-rs/lzma-linux-ppc64-gnu": "1.5.1", + "@napi-rs/lzma-linux-riscv64-gnu": "1.5.1", + "@napi-rs/lzma-linux-s390x-gnu": "1.5.1", + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@napi-rs/lzma-linux-x64-musl": "1.5.1", + "@napi-rs/lzma-wasm32-wasi": "1.5.1", + "@napi-rs/lzma-win32-arm64-msvc": "1.5.1", + "@napi-rs/lzma-win32-ia32-msvc": "1.5.1", + "@napi-rs/lzma-win32-x64-msvc": "1.5.1" + } + }, + "node_modules/@napi-rs/lzma-android-arm-eabi": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-android-arm-eabi/-/lzma-android-arm-eabi-1.5.1.tgz", + "integrity": "sha512-sahBe4ko2Z69NPTddaX6ZgbQZu9SDoITxw1S3dWl1gAGynZG34qHHCT8UaUMFxf3h3zMhCJjEzz4basaBxiTuQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-android-arm64": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-android-arm64/-/lzma-android-arm64-1.5.1.tgz", + "integrity": "sha512-7tkQAJJuBHxAxiEBNFgSTpvrtGpbwZYYJUSOmGEK3OfbdbNeoT2rdBxpM/gY1s+itEVbtOSlpaRPPG19MnwOzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-darwin-arm64": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-darwin-arm64/-/lzma-darwin-arm64-1.5.1.tgz", + "integrity": "sha512-XWX8gtF+GHGk3nH3Wm3QUZNcxw9QHsFVZz3MzVLhWWHhceede1J4/vD+3dj3E1iKB9G6mualaZxOoD08R3E+7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-darwin-x64": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-darwin-x64/-/lzma-darwin-x64-1.5.1.tgz", + "integrity": "sha512-CfsqUpMTI1z8enrA/b+GcHM6YDI8D0kqCiqPYEnst4rbOABQ9KZ92ybTTNnlnZ7A017WoMZKUEWc36KXDwi0xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-freebsd-x64": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-freebsd-x64/-/lzma-freebsd-x64-1.5.1.tgz", + "integrity": "sha512-bTyNfg90FXIgE61U7l14aMmVOqRQ6AyP5JMT3jmCStaZI18apLNPdzZ8i7yqxZfKvRMVfPjE2brXIw27c+RRgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-linux-arm-gnueabihf": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-arm-gnueabihf/-/lzma-linux-arm-gnueabihf-1.5.1.tgz", + "integrity": "sha512-vNE+D8nrw+eOkBsdKCsmDhowDV3pIMKXEhedvXfbgrWbrO7GlZJH+RXL+X+RYLxGwi8Ym61ZMt15sIOnNmh9Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-linux-arm64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-arm64-gnu/-/lzma-linux-arm64-gnu-1.5.1.tgz", + "integrity": "sha512-csUem4WgoKGTprv/pOPm9UIWbb+hrfUwYXefpTHPAEGVFLl5behEFabisJ7FtihCa3yG2Efcl+yw25rlhhrIYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-linux-arm64-musl": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-arm64-musl/-/lzma-linux-arm64-musl-1.5.1.tgz", + "integrity": "sha512-kB/xhlVN1eLvVmDJSKZEjp5Gg2xDYexNrB5jwpSMbOkeGS6N9AasByPBg5VqCpMYC+zZi7DM458DRhtWYhqXTQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-linux-ppc64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-ppc64-gnu/-/lzma-linux-ppc64-gnu-1.5.1.tgz", + "integrity": "sha512-s28RW0W1yBWQc1nbPdF7tp14koqslY3ZWLVI8uaanX292Dc6ezd4NPVwxEoCNBVON/oD7BmUbWGtyFvmm7dQ5A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-linux-riscv64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-riscv64-gnu/-/lzma-linux-riscv64-gnu-1.5.1.tgz", + "integrity": "sha512-+lGNwYlIN14YPMTNvYtIJJqHFevDTd6Juw/1NmXbWx/iRd/LLrjhlM/yluMX6pxs6NkOGsuuEXJJrbbEUS59OQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-linux-s390x-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-s390x-gnu/-/lzma-linux-s390x-gnu-1.5.1.tgz", + "integrity": "sha512-PB44FFWWFrLeQowhcep1hPD1YcLqKlnnY60RMU74qrxTlr4YGEyzeMItJqh2uivBfv9kQScOF/B0J9+Vab/oyw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-musl": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-musl/-/lzma-linux-x64-musl-1.5.1.tgz", + "integrity": "sha512-I3nsYrWtrW9JpeCr+mkJIVDt0HY3m6qVUBs5vTtoIvJQxwqf1PBXSy5IS7T53ksQFH2kd2UX8rLxJ7B4WISpZg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-wasm32-wasi": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-wasm32-wasi/-/lzma-wasm32-wasi-1.5.1.tgz", + "integrity": "sha512-gy3wwPBa6+XEyA4fUzq6CClrXA1ajXjuVf5zbnHytJRgoHznj+mvpU3+co2fxXwqTCmIpn6KrzqH5bRDztBPhA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.2", + "@emnapi/runtime": "1.11.2", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@napi-rs/lzma-win32-arm64-msvc": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-win32-arm64-msvc/-/lzma-win32-arm64-msvc-1.5.1.tgz", + "integrity": "sha512-dK+huOsHiyH6oJjij+cnjqFCakk2HgWmpI12Xm4pLUyPphe4ebYoJBgehaNAxprmjFqBQ7nL95YPVz9BHyqmPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-win32-ia32-msvc": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-win32-ia32-msvc/-/lzma-win32-ia32-msvc-1.5.1.tgz", + "integrity": "sha512-dGE8L+0EQ+GyU9ap9InqB/t/PmPG/bLj918q7OsJ29FuTdn8fK4OX3U4IQZhylHIA+/dQ/SXJk5n4yfah2XVvA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/lzma-win32-x64-msvc": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-win32-x64-msvc/-/lzma-win32-x64-msvc-1.5.1.tgz", + "integrity": "sha512-EKW4t/iqdCT/xnd5t9oXLvVER/PMNAWXKqUAl3fgvUcOILeZIIht77/dVnfFcc9htA/DCBXC/6YQWdW+LusjFA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.5.tgz", + "integrity": "sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-3.0.0.tgz", + "integrity": "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@oxc-minify/binding-android-arm-eabi": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm-eabi/-/binding-android-arm-eabi-0.151.0.tgz", + "integrity": "sha512-Y1kwFf+GCq62PWojA4u5ME99T1quxdM+VPB67kIC1x0wLmfGAWAhS9cwKIxe/bW95loAxGIruvkYDVMCrvOBvw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-android-arm64": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm64/-/binding-android-arm64-0.151.0.tgz", + "integrity": "sha512-IuRgG5pZ5Axv88yMK5nIeQHOQqrWkGd2Wcu4yUlGhV9NMr2C6N/HpJ7crLWwpflZSHgWXW5s/5AsmEN2CBJw0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-darwin-arm64": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-arm64/-/binding-darwin-arm64-0.151.0.tgz", + "integrity": "sha512-Uuo84npyREYIOJ8ohYdc7eA+QKVcZnX4524U81+6nhdmxkMp19AZHaBGmd/tN6c7KDfsF3ATXQUOxKkCOGGxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-darwin-x64": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-x64/-/binding-darwin-x64-0.151.0.tgz", + "integrity": "sha512-XiWlF2PpwoiX6RcqWmFTvcxW5hH+C96l9km164vbM9wisSBoapo95dvZjEzG7lEmffHOGzb4BOAlAeeZ/WlRWw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-freebsd-x64": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-freebsd-x64/-/binding-freebsd-x64-0.151.0.tgz", + "integrity": "sha512-fM6/wcqfGp1R+zxYxHXs+P+wBpTlhU1Nr7iiZyBoCg+mphrgyYS7drUiHWoWzAvUSpicnmFm6rag9bSSWTDUMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-arm-gnueabihf": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.151.0.tgz", + "integrity": "sha512-s/aBPTyIMW9uAD0mP+xSz7UbuxXfEIi/1rEpqTd1gGjVCz2Sl58sbc65FauI4K26S9nDpk7fGc7y9C9rjK9L+A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-arm-musleabihf": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.151.0.tgz", + "integrity": "sha512-9t44xCPN7E93Pmxsov9qwEGcTc0UJa+z0ZJzvjCk0LqXdLNOQhd15k8KgVuzVbWitI19TvOX/fEC3ZVF6LB/kw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-arm64-gnu": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.151.0.tgz", + "integrity": "sha512-a77EK4y+3fyD1GZiMnOUSr8x52Hx6eKjPnfIzeh4C9UgnUZBRYMsdHBbBDHLLOX1adjyluxtn4Tze7yTVByCeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-arm64-musl": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.151.0.tgz", + "integrity": "sha512-2AjX1jJsj/guky9OuM1jKmuwRVvy+8UUChK3uvrRWV89I/FyrQj9wKPj8TkuL0Ay5yL2xvZj/Ti1Qg0qiRsP+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-ppc64-gnu": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.151.0.tgz", + "integrity": "sha512-l3iUa60pK2WenCy9jhO4UTK/yz9RjVIXPXqfzMdz7DA0QQZ9dxAk/p2p3ERf4KZq/MEIfvs9e4LuFVYg5PFYdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-riscv64-gnu": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.151.0.tgz", + "integrity": "sha512-v+sdB36Rp8BxmQoP5Jt6ixz7G0aN9Nayh/LvdNBW/0nkKoLHFyEAcV/Uy+79R3oB0uBC1J6DM9XlDxCC1uMkbA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-riscv64-musl": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.151.0.tgz", + "integrity": "sha512-QER/ajZukltjbfFi4rGx6/jC5XEnImAma5P606Xnej0D3fyMC8rXPmae5Z3HyUJMt1Hd5POOkC3S5yQBNPppwQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-s390x-gnu": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.151.0.tgz", + "integrity": "sha512-+r7s5IPrWPtdz/x5LiNSk0ySmzvdP0/VLwt23ULFvcU6jsMrw8DseylMfp4HxvGlJcYyKAUj7JSGxwEmEACUvw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-x64-gnu": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.151.0.tgz", + "integrity": "sha512-O1Rs0HbgKvEhTiq1bVcZnsOY6q8f4LoPE6pgOieB19Coyz1XP/ugq7XILUD6evlszBGRKliRAwycRScbl2kjqg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-linux-x64-musl": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-musl/-/binding-linux-x64-musl-0.151.0.tgz", + "integrity": "sha512-RSbyV8xzLsvypVTo871IYAfL5We9/8JNyAQLMXiCRnQGD/daFm/bp+iLhtoy2jelgOa6kp4H3bkdl+ci5SSwDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-openharmony-arm64": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-openharmony-arm64/-/binding-openharmony-arm64-0.151.0.tgz", + "integrity": "sha512-WHwdIt3Kj0TQSVey3RiWXgyeZpXUz3Hapq/mdCXyxVCBkvRk/KHIxmHE32EGE/PRx+EQFHVo1+gm627XOde/qg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-win32-arm64-msvc": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.151.0.tgz", + "integrity": "sha512-mFL0B3HByMlBxspR+SeqyBR8b96QkoI2D8quQOwBXEUExR4Ozu3Ya0uyYR9MBdwvQHZZWQ2EWgum8bdHdTfl/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-win32-ia32-msvc": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.151.0.tgz", + "integrity": "sha512-p6QBBxYsg0A0jUQu5NRqW/UuPtoLtmA72SE8N7Rkhn43m/gSLNTE/nFjsLSsX6T9yM8d8k5PfnYvFnSUf+IlRw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-minify/binding-win32-x64-msvc": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.151.0.tgz", + "integrity": "sha512-lkP3SsNXm3JUrNX9c9Ijhl3Iipw0fWuCAOOxju+YjH2AolPUbTLE664KeEDdxt8kaLCh+wCBNyqnV67OLVHZWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.76.0.tgz", + "integrity": "sha512-1XJW/16CDmF5bHE7LAyPPmEEVnxSadDgdJz+xiLqBrmC4lfAeuAfRw3HlOygcPGr+AJsbD4Z5sFJMkwjbSZlQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.76.0.tgz", + "integrity": "sha512-yoQwSom8xsB+JdGsPUU0xxmxLKiF2kdlrK7I56WtGKZilixuBf/TmOwNYJYLRWkBoW5l2/pDZOhBm2luwmLiLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.76.0.tgz", + "integrity": "sha512-uRIopPLvr3pf2Xj7f5LKyCuqzIU6zOS+zEIR8UDYhcgJyZHnvBkfrYnfcztyIcrGdQehrFUi3uplmI09E7RdiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.76.0.tgz", + "integrity": "sha512-a0EOFvnOd2FqmDSvH6uWLROSlU6KV/JDKbsYDA/zRLyKcG6HCsmFnPsp8iV7/xr9WMbNgyJi6R5IMpePQlUq7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.76.0.tgz", + "integrity": "sha512-ikRYDHL3fOdZwfJKmcdqjlLgkeNZ3Ez0qM8wAev5zlHZ+lY/Ig7qG5SCqPlvuTu+nNQ6zrFFaKvvt69EBKXU/g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.76.0.tgz", + "integrity": "sha512-dtRv5J5MRCLR7x39K8ufIIW4svIc7gYFUaI0YFXmmeOBhK/K2t/CkguPnDroKtsmXIPHDRtmJ1JJYzNcgJl6Wg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.76.0.tgz", + "integrity": "sha512-IE4iiiggFH2snagQxHrY5bv6dDpRMMat+vdlMN/ibonA65eOmRLp8VLTXnDiNrcla/itJ1L9qGABHNKU+SnE8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.76.0.tgz", + "integrity": "sha512-wi9zQPMDHrBuRuT7Iurfidc9qlZh7cKa5vfYzOWNBCaqJdgxmNOFzvYen02wVUxSWGKhpiPHxrPX0jdRyJ8Npg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.76.0.tgz", + "integrity": "sha512-0tqqu1pqPee2lLGY8vtYlX1L415fFn89e0a3yp4q5N9f03j1rRs0R31qesTm3bt/UK8HYjECZ+56FCVPs2MEMQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.76.0.tgz", + "integrity": "sha512-y36Hh1a5TA+oIGtlc8lT7N9vdHXBlhBetQJW0p457KbiVQ7jF7AZkaPWhESkjHWAsTVKD2OjCa9ZqfaqhSI0FQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.76.0.tgz", + "integrity": "sha512-7/acaG9htovp3gp/J0kHgbItQTuHctl+rbqPPqZ9DRBYTz8iV8kv3QN8t8Or8i/hOmOjfZp9McDoSU1duoR4/A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.76.0.tgz", + "integrity": "sha512-AxFt0reY6Q2rfudABmMTFGR8tFFr58NlH2rRBQgcj+F+iEwgJ+jMwAPhXd2y1I2zaI8GspuahedUYQinqxWqjA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.76.0.tgz", + "integrity": "sha512-wHdkHdhf6AWBoO8vs5cpoR6zEFY1rB+fXWtq6j/xb9j/lu1evlujRVMkh8IM/M/pOUIrNkna3nzST/mRImiveQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.76.0.tgz", + "integrity": "sha512-G7ZlEWcb2hNwCK3qalzqJoyB6HaTigQ/GEa7CU8sAJ/WwMdG/NnPqiC9IqpEAEy1ARSo4XMALfKbKNuqbSs5mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.76.0.tgz", + "integrity": "sha512-0jLzzmnu8/mqNhKBnNS2lFUbPEzRdj5ReiZwHGHpjma0+ullmmwP2AqSEqx3ssHDK9CpcEMdKOK2LsbCfhHKIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", + "integrity": "sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.31.0.tgz", + "integrity": "sha512-2A7s+TmsY7xF3yM0VWXq2YJ82Z7Rd7AOKraotyp58Fbk7q9cFZKczW6Zrz/iaMaJYfR/UHDxF3kMR11vayflug==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.31.0.tgz", + "integrity": "sha512-3ppKOIf2lQv/BFhRyENWs/oarueppCEnPNo0Az2fKkz63JnenRuJPoHaGRrMHg1oFMUitdYy+YH29Cv5ISZWRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.31.0.tgz", + "integrity": "sha512-eFhNnle077DPRW6QPsBtl/wEzPoqgsB1LlzDRYbbztizObHdCo6Yo8T0hew9+HoYtnVMAP19zcRE7VG9OfqkMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.31.0.tgz", + "integrity": "sha512-9UQSunEqokhR1WnlQCgJjkjw13y8PSnBvR98L78beGudTtNSaPMgwE7t/T0IPDibtDTxeEt+IQVKoQJ+8Jo6Lg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.31.0.tgz", + "integrity": "sha512-FHo7ITkDku3kQ8/44nU6IGR1UNH22aqYM3LV2ytV40hWSMVllXFlM+xIVusT+I/SZBAtuFpwEWzyS+Jn4TkkAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.31.0.tgz", + "integrity": "sha512-o1NiDlJDO9SOoY5wH8AyPUX60yQcOwu5oVuepi2eetArBp0iFF9qIH1uLlZsUu4QQ6ywqxcJSMjXCqGKC5uQFg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.31.0.tgz", + "integrity": "sha512-VXiRxlBz7ivAIjhnnVBEYdjCQ66AsjM0YKxYAcliS0vPqhWKiScIT61gee0DPCVaw1XcuW8u19tfRwpfdYoreg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.31.0.tgz", + "integrity": "sha512-ryGPOtPViNcjs8N8Ap+wn7SM6ViiLzR9f0Pu7yprae+wjl6qwnNytzsUe7wcb+jT43DJYmvemFqE8tLVUavYbQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.31.0.tgz", + "integrity": "sha512-BA3Euxp4bfd+AU3cKPgmHL44BbuBtmQTyAQoVDhX/nqPgbS/auoGp71uQBE4SAPTsQM/FcXxfKmCAdBS7ygF9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.31.0.tgz", + "integrity": "sha512-wIiKHulVWE9s6PSftPItucTviyCvjugwPqEyUl1VD47YsFqa5UtQTknBN49NODHJvBgO+eqqUodgRqmNMp3xyw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.31.0.tgz", + "integrity": "sha512-6cM8Jt54bg9V/JoeUWhwnzHAS9Kvgc0oFsxql8PVs/njAGs0H4r+GEU4d+LXZPwI3b3ZUuzpbxlRJzer8KW+Cg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.31.0.tgz", + "integrity": "sha512-d+b05wXVRGaO6gobTaDqUdBvTXwYc0ro7k1UVC37k4VimLRQOzEZqTwVinqIX3LxTaFCmfO1yG00u9Pct3AKwQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.31.0.tgz", + "integrity": "sha512-Q+i2kj8e+two9jTZ3vxmxdNlg++qShe1ODL6xV4+Qt6SnJYniMxfcqphuXli4ft270kuHqd8HSVZs84CsSh1EA==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@inquirer/type": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", - "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.31.0.tgz", + "integrity": "sha512-F2Z5ffj2okhaQBi92MylwZddKvFPBjrsZnGvvRmVvWRf8WJ0WkKUTtombDgRYNDgoW7GBUUrNNNgWhdB7kVjBA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.31.0.tgz", + "integrity": "sha512-Vz7dZQd1yhE5wTWujGanPmZgDtzLZS1PQoeMmUj89p4eMTmpIkvWaIr3uquJCbh8dQd5cPZrFvMmdDgcY5z+GA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.31.0.tgz", + "integrity": "sha512-nm0gus6R5V9tM1XaELiiIduUzmdBuCefkwToWKL4UtuFoMCGkigVQnbzHwPTGLVWOEF6wTQucFA8Fn1U8hxxVw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@modelcontextprotocol/client": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/client/-/client-2.3.1.tgz", - "integrity": "sha512-mIGZXpHsjnZ6lD+gD/WCMpR5k8yVQQ8nNFH1N0Srf7AvnwTUMYD6pvTY8ng2+He5FfV7YMZLmrjL7cLa/cc3dQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@modelcontextprotocol/core": "2.3.1", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.8", - "jose": "^6.1.3", - "pkce-challenge": "^5.0.0", - "zod": "^4.2.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@modelcontextprotocol/core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.3.1.tgz", - "integrity": "sha512-laVmIhPGpWi7rG9q+0UigblRN0Hws/Yjlb6qLFtVqryXVLkc4h+yN8z731POD2LnAGQlFe7/tXhUm7Bi0YB91g==", - "license": "Apache-2.0", - "dependencies": { - "zod": "^4.2.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@modelcontextprotocol/server": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.3.1.tgz", - "integrity": "sha512-e59MfWuSssj6DoQ96JCTqdW1AXT5/XtnTl0WWd6MU1Ka434fFUGGosCLJbGNySDhHGvxQWoRWK137FXYFkYNWw==", - "license": "Apache-2.0", - "dependencies": { - "@modelcontextprotocol/core": "2.3.1", - "zod": "^4.2.0" - }, + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=20" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@mswjs/interceptors": { - "version": "0.41.9", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.9.tgz", - "integrity": "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==", + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.31.0.tgz", + "integrity": "sha512-mMpvvPpoLD97Q2TMhjWDJSn+ib3kN+H+F4gq9p88zpeef6sqWc9djorJ3JXM2sOZMJ6KZ+1kSJfe0rkji74Pog==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@mswjs/interceptors/node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-draft/deferred-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-3.0.0.tgz", - "integrity": "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.31.0.tgz", + "integrity": "sha512-zTngbPyrTDBYJFVQa4OJldM6w1Rqzi8c0/eFxAEbZRoj6x149GkyMkAY3kM+09ZhmszFitCML2S3p10NE2XmHA==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@oxc-project/types": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", - "integrity": "sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==", + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.31.0.tgz", + "integrity": "sha512-TB30D+iRLe6eUbc/utOA93+FNz5C6vXSb/TEhwvlODhKYZZSSKn/lFpYzZC7bdhx3a8m4Jq8fEUoCJ6lKnzdpA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/oxc-project" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-android-arm-eabi": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.31.0.tgz", - "integrity": "sha512-2A7s+TmsY7xF3yM0VWXq2YJ82Z7Rd7AOKraotyp58Fbk7q9cFZKczW6Zrz/iaMaJYfR/UHDxF3kMR11vayflug==", + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.46.0.tgz", + "integrity": "sha512-vLPcE+HcZ/W/0cVA1KLuAnoUSejGougDH/fDjBFf0Q+rbBIyBNLevOhgx3AnBNAt3hcIGY7U05ISbJCKZeVa3w==", "cpu": [ "arm" ], @@ -1440,10 +3467,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-android-arm64": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.31.0.tgz", - "integrity": "sha512-3ppKOIf2lQv/BFhRyENWs/oarueppCEnPNo0Az2fKkz63JnenRuJPoHaGRrMHg1oFMUitdYy+YH29Cv5ISZWRQ==", + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.46.0.tgz", + "integrity": "sha512-b8IqCczUsirdtJ3R/be4cRm64I5pMPafMO/9xyTAZvc+R/FxZHMQuhw0iNT9hQwRn+Uo5rNAoA8QS7QurG2QeA==", "cpu": [ "arm64" ], @@ -1457,10 +3484,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-darwin-arm64": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.31.0.tgz", - "integrity": "sha512-eFhNnle077DPRW6QPsBtl/wEzPoqgsB1LlzDRYbbztizObHdCo6Yo8T0hew9+HoYtnVMAP19zcRE7VG9OfqkMw==", + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.46.0.tgz", + "integrity": "sha512-CfC/KGnNMhI01dkfCMjquKnW4zby3kqD5o/9XA7+pgo9I4b+Nipm+JVFyZPWMNwKqLXNmi35GTLWjs9svPxlew==", "cpu": [ "arm64" ], @@ -1474,10 +3501,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-darwin-x64": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.31.0.tgz", - "integrity": "sha512-9UQSunEqokhR1WnlQCgJjkjw13y8PSnBvR98L78beGudTtNSaPMgwE7t/T0IPDibtDTxeEt+IQVKoQJ+8Jo6Lg==", + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.46.0.tgz", + "integrity": "sha512-m38mKPsV3rBdWOJ4TAGZiUjWU8RGrBxsmdSeMQ0bPr/8O6CUOm/RJkPBf0GAfPms2WRVcbkfEXvIiPshAeFkeA==", "cpu": [ "x64" ], @@ -1491,10 +3518,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-freebsd-x64": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.31.0.tgz", - "integrity": "sha512-FHo7ITkDku3kQ8/44nU6IGR1UNH22aqYM3LV2ytV40hWSMVllXFlM+xIVusT+I/SZBAtuFpwEWzyS+Jn4TkkAQ==", + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.46.0.tgz", + "integrity": "sha512-YaFRKslSAfuMwn7ejS1/wo9jENqQigpGBjjThX+mrpmEROLYGky+zIC5xSVGRng28U92VEDVbSNJ/sguz3dUAA==", "cpu": [ "x64" ], @@ -1508,10 +3535,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.31.0.tgz", - "integrity": "sha512-o1NiDlJDO9SOoY5wH8AyPUX60yQcOwu5oVuepi2eetArBp0iFF9qIH1uLlZsUu4QQ6ywqxcJSMjXCqGKC5uQFg==", + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.46.0.tgz", + "integrity": "sha512-Nlw+5mSZQtkg1Oj0N8ulxzG8ATpmSDz5V2DNaGhaYAVlcdR8NYSm/xTOnweOXc/UOOv3LwkPPYzqcfPhu2lEkA==", "cpu": [ "arm" ], @@ -1525,10 +3552,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-arm-musleabihf": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.31.0.tgz", - "integrity": "sha512-VXiRxlBz7ivAIjhnnVBEYdjCQ66AsjM0YKxYAcliS0vPqhWKiScIT61gee0DPCVaw1XcuW8u19tfRwpfdYoreg==", + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.46.0.tgz", + "integrity": "sha512-d3Y5y4ukMqAGnWLMKpwqj8ftNUaac7pA0NrId4AZ77JvHzezmxEcm2gswaBw2HW8y1pnq6KDB0vEPPvpTfDLrA==", "cpu": [ "arm" ], @@ -1542,10 +3569,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-arm64-gnu": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.31.0.tgz", - "integrity": "sha512-ryGPOtPViNcjs8N8Ap+wn7SM6ViiLzR9f0Pu7yprae+wjl6qwnNytzsUe7wcb+jT43DJYmvemFqE8tLVUavYbQ==", + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.46.0.tgz", + "integrity": "sha512-jkjx+XSOPuFR+C458prQmehO+v0VK19/3Hj2mOYDF4hHUf3CzmtA4fTmQUtkITZiGHnky7Oao6JeJX24mrX7WQ==", "cpu": [ "arm64" ], @@ -1559,10 +3586,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-arm64-musl": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.31.0.tgz", - "integrity": "sha512-BA3Euxp4bfd+AU3cKPgmHL44BbuBtmQTyAQoVDhX/nqPgbS/auoGp71uQBE4SAPTsQM/FcXxfKmCAdBS7ygF9w==", + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.46.0.tgz", + "integrity": "sha512-X/aPB1rpJUdykjWSeeGIbjk6qbD8VDulgLuTSMWgr/t6m1ljcAjqHb1g49pVG9bZl55zjECgzvlpPLWnfb4FMQ==", "cpu": [ "arm64" ], @@ -1576,10 +3603,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-ppc64-gnu": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.31.0.tgz", - "integrity": "sha512-wIiKHulVWE9s6PSftPItucTviyCvjugwPqEyUl1VD47YsFqa5UtQTknBN49NODHJvBgO+eqqUodgRqmNMp3xyw==", + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.46.0.tgz", + "integrity": "sha512-AymyOxGWwKY2KJa8b+h8iLrYJZbWKYCjqctSc2q6uIAkYPrCsxcWlge1JP6XZ14Sa80DVMwI/QvktbytSV+xVw==", "cpu": [ "ppc64" ], @@ -1593,10 +3620,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-riscv64-gnu": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.31.0.tgz", - "integrity": "sha512-6cM8Jt54bg9V/JoeUWhwnzHAS9Kvgc0oFsxql8PVs/njAGs0H4r+GEU4d+LXZPwI3b3ZUuzpbxlRJzer8KW+Cg==", + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.46.0.tgz", + "integrity": "sha512-PkeVdPKCDA59rlMuucsel2LjlNEpslQN5AhkMMorIJZItbbqi/0JSuACCzaiIcXYv0oNfbeQ8rbOBikv+aT6cg==", "cpu": [ "riscv64" ], @@ -1610,10 +3637,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-riscv64-musl": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.31.0.tgz", - "integrity": "sha512-d+b05wXVRGaO6gobTaDqUdBvTXwYc0ro7k1UVC37k4VimLRQOzEZqTwVinqIX3LxTaFCmfO1yG00u9Pct3AKwQ==", + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.46.0.tgz", + "integrity": "sha512-snQaRLO/X+Ry/CxX1px1g8GUbmXzymdRs+/RkP2bySHWZFhFDtbLm2hA1ujX/jKlTLMJDZn4hYzFGLDwG/Rh2w==", "cpu": [ "riscv64" ], @@ -1627,10 +3654,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-s390x-gnu": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.31.0.tgz", - "integrity": "sha512-Q+i2kj8e+two9jTZ3vxmxdNlg++qShe1ODL6xV4+Qt6SnJYniMxfcqphuXli4ft270kuHqd8HSVZs84CsSh1EA==", + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.46.0.tgz", + "integrity": "sha512-kZhDMwUe/sgDTluGao9c0Dqc1JzV6wPzfGo0l/FLQdh5Zmp39Yg1FbBsCgsJfVKmKl1fNqsHyFLTShWMOlOEhA==", "cpu": [ "s390x" ], @@ -1644,10 +3671,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-x64-gnu": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.31.0.tgz", - "integrity": "sha512-F2Z5ffj2okhaQBi92MylwZddKvFPBjrsZnGvvRmVvWRf8WJ0WkKUTtombDgRYNDgoW7GBUUrNNNgWhdB7kVjBA==", + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.46.0.tgz", + "integrity": "sha512-n5a7VtQTxHZ13cNAKQc3ziARv5bE1Fx868v/tnhZNVUjaRNYe5uiUrRJ/LZghdAzOxVuQGarjjq/q4QM2+9OPA==", "cpu": [ "x64" ], @@ -1661,10 +3688,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-linux-x64-musl": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.31.0.tgz", - "integrity": "sha512-Vz7dZQd1yhE5wTWujGanPmZgDtzLZS1PQoeMmUj89p4eMTmpIkvWaIr3uquJCbh8dQd5cPZrFvMmdDgcY5z+GA==", + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.46.0.tgz", + "integrity": "sha512-KpsDU/BhdVn3iKCLxMXAOZIpO8fS0jEA5iluRoK1rhHPwKtpzEm/OCwERsu/vboMSZm66qnoTUVXRPJ8M+iKVQ==", "cpu": [ "x64" ], @@ -1678,10 +3705,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-openharmony-arm64": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.31.0.tgz", - "integrity": "sha512-nm0gus6R5V9tM1XaELiiIduUzmdBuCefkwToWKL4UtuFoMCGkigVQnbzHwPTGLVWOEF6wTQucFA8Fn1U8hxxVw==", + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.46.0.tgz", + "integrity": "sha512-jtbqUyEXlsDlRmMtTZqNbw49+1V/WxqNAR5l0S3OEkdat9diI5I+eqq9IT+jb5cSDdszTGcXpn7S3+gUYSydxQ==", "cpu": [ "arm64" ], @@ -1695,10 +3722,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-win32-arm64-msvc": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.31.0.tgz", - "integrity": "sha512-mMpvvPpoLD97Q2TMhjWDJSn+ib3kN+H+F4gq9p88zpeef6sqWc9djorJ3JXM2sOZMJ6KZ+1kSJfe0rkji74Pog==", + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.46.0.tgz", + "integrity": "sha512-EE8NjpqEZPwHQVigNvdyJ11dZwWIfsfn4VeBAuiJeAdrnY4HFX27mIjJINJgP5ZdBYEFV1OWH/eb9fURCYel8w==", "cpu": [ "arm64" ], @@ -1712,10 +3739,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-win32-ia32-msvc": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.31.0.tgz", - "integrity": "sha512-zTngbPyrTDBYJFVQa4OJldM6w1Rqzi8c0/eFxAEbZRoj6x149GkyMkAY3kM+09ZhmszFitCML2S3p10NE2XmHA==", + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.46.0.tgz", + "integrity": "sha512-BHyk3H/HRdXs+uImGZ/2+qCET+B8lwGHOm7m54JiJEEUWf3zYCFX/Df1SPqtozWWmnBvioxoTG1J3mPRAr8KUA==", "cpu": [ "ia32" ], @@ -1729,10 +3756,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxfmt/binding-win32-x64-msvc": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.31.0.tgz", - "integrity": "sha512-TB30D+iRLe6eUbc/utOA93+FNz5C6vXSb/TEhwvlODhKYZZSSKn/lFpYzZC7bdhx3a8m4Jq8fEUoCJ6lKnzdpA==", + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.46.0.tgz", + "integrity": "sha512-DJbQsSJUr4KSi9uU0QqOgI7PX2C+fKGZX+YDprt3vM2sC0dWZsgVTLoN2vtkNyEWJSY2mnvRFUshWXT3bmo0Ug==", "cpu": [ "x64" ], @@ -1746,10 +3773,39 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.46.0.tgz", - "integrity": "sha512-vLPcE+HcZ/W/0cVA1KLuAnoUSejGougDH/fDjBFf0Q+rbBIyBNLevOhgx3AnBNAt3hcIGY7U05ISbJCKZeVa3w==", + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.11.tgz", + "integrity": "sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==", "cpu": [ "arm" ], @@ -1763,10 +3819,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.46.0.tgz", - "integrity": "sha512-b8IqCczUsirdtJ3R/be4cRm64I5pMPafMO/9xyTAZvc+R/FxZHMQuhw0iNT9hQwRn+Uo5rNAoA8QS7QurG2QeA==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.11.tgz", + "integrity": "sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==", "cpu": [ "arm64" ], @@ -1780,10 +3836,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.46.0.tgz", - "integrity": "sha512-CfC/KGnNMhI01dkfCMjquKnW4zby3kqD5o/9XA7+pgo9I4b+Nipm+JVFyZPWMNwKqLXNmi35GTLWjs9svPxlew==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.11.tgz", + "integrity": "sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==", "cpu": [ "arm64" ], @@ -1797,10 +3853,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.46.0.tgz", - "integrity": "sha512-m38mKPsV3rBdWOJ4TAGZiUjWU8RGrBxsmdSeMQ0bPr/8O6CUOm/RJkPBf0GAfPms2WRVcbkfEXvIiPshAeFkeA==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.11.tgz", + "integrity": "sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==", "cpu": [ "x64" ], @@ -1814,10 +3870,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.46.0.tgz", - "integrity": "sha512-YaFRKslSAfuMwn7ejS1/wo9jENqQigpGBjjThX+mrpmEROLYGky+zIC5xSVGRng28U92VEDVbSNJ/sguz3dUAA==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.11.tgz", + "integrity": "sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==", "cpu": [ "x64" ], @@ -1831,27 +3887,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.46.0.tgz", - "integrity": "sha512-Nlw+5mSZQtkg1Oj0N8ulxzG8ATpmSDz5V2DNaGhaYAVlcdR8NYSm/xTOnweOXc/UOOv3LwkPPYzqcfPhu2lEkA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.46.0.tgz", - "integrity": "sha512-d3Y5y4ukMqAGnWLMKpwqj8ftNUaac7pA0NrId4AZ77JvHzezmxEcm2gswaBw2HW8y1pnq6KDB0vEPPvpTfDLrA==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.11.tgz", + "integrity": "sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==", "cpu": [ "arm" ], @@ -1865,14 +3904,17 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.46.0.tgz", - "integrity": "sha512-jkjx+XSOPuFR+C458prQmehO+v0VK19/3Hj2mOYDF4hHUf3CzmtA4fTmQUtkITZiGHnky7Oao6JeJX24mrX7WQ==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.11.tgz", + "integrity": "sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1882,31 +3924,17 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.46.0.tgz", - "integrity": "sha512-X/aPB1rpJUdykjWSeeGIbjk6qbD8VDulgLuTSMWgr/t6m1ljcAjqHb1g49pVG9bZl55zjECgzvlpPLWnfb4FMQ==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.11.tgz", + "integrity": "sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.46.0.tgz", - "integrity": "sha512-AymyOxGWwKY2KJa8b+h8iLrYJZbWKYCjqctSc2q6uIAkYPrCsxcWlge1JP6XZ14Sa80DVMwI/QvktbytSV+xVw==", - "cpu": [ - "ppc64" + "libc": [ + "musl" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1916,31 +3944,17 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.46.0.tgz", - "integrity": "sha512-PkeVdPKCDA59rlMuucsel2LjlNEpslQN5AhkMMorIJZItbbqi/0JSuACCzaiIcXYv0oNfbeQ8rbOBikv+aT6cg==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.11.tgz", + "integrity": "sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==", "cpu": [ - "riscv64" + "ppc64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.46.0.tgz", - "integrity": "sha512-snQaRLO/X+Ry/CxX1px1g8GUbmXzymdRs+/RkP2bySHWZFhFDtbLm2hA1ujX/jKlTLMJDZn4hYzFGLDwG/Rh2w==", - "cpu": [ - "riscv64" + "libc": [ + "glibc" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1950,14 +3964,17 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.46.0.tgz", - "integrity": "sha512-kZhDMwUe/sgDTluGao9c0Dqc1JzV6wPzfGo0l/FLQdh5Zmp39Yg1FbBsCgsJfVKmKl1fNqsHyFLTShWMOlOEhA==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.11.tgz", + "integrity": "sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1967,14 +3984,17 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.46.0.tgz", - "integrity": "sha512-n5a7VtQTxHZ13cNAKQc3ziARv5bE1Fx868v/tnhZNVUjaRNYe5uiUrRJ/LZghdAzOxVuQGarjjq/q4QM2+9OPA==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.11.tgz", + "integrity": "sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1984,14 +4004,17 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.46.0.tgz", - "integrity": "sha512-KpsDU/BhdVn3iKCLxMXAOZIpO8fS0jEA5iluRoK1rhHPwKtpzEm/OCwERsu/vboMSZm66qnoTUVXRPJ8M+iKVQ==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.11.tgz", + "integrity": "sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2001,10 +4024,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.46.0.tgz", - "integrity": "sha512-jtbqUyEXlsDlRmMtTZqNbw49+1V/WxqNAR5l0S3OEkdat9diI5I+eqq9IT+jb5cSDdszTGcXpn7S3+gUYSydxQ==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.11.tgz", + "integrity": "sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==", "cpu": [ "arm64" ], @@ -2018,10 +4041,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.46.0.tgz", - "integrity": "sha512-EE8NjpqEZPwHQVigNvdyJ11dZwWIfsfn4VeBAuiJeAdrnY4HFX27mIjJINJgP5ZdBYEFV1OWH/eb9fURCYel8w==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.11.tgz", + "integrity": "sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==", "cpu": [ "arm64" ], @@ -2035,12 +4058,12 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.46.0.tgz", - "integrity": "sha512-BHyk3H/HRdXs+uImGZ/2+qCET+B8lwGHOm7m54JiJEEUWf3zYCFX/Df1SPqtozWWmnBvioxoTG1J3mPRAr8KUA==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.11.tgz", + "integrity": "sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==", "cpu": [ - "ia32" + "x64" ], "dev": true, "license": "MIT", @@ -2052,411 +4075,443 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.46.0.tgz", - "integrity": "sha512-DJbQsSJUr4KSi9uU0QqOgI7PX2C+fKGZX+YDprt3vM2sC0dWZsgVTLoN2vtkNyEWJSY2mnvRFUshWXT3bmo0Ug==", - "cpu": [ - "x64" - ], + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@poppinss/colors": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", - "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "node_modules/@speed-highlight/core": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.17.tgz", + "integrity": "sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "kleur": "^4.1.5" + "tslib": "^2.4.0" } }, - "node_modules/@poppinss/dumper": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", - "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { - "@poppinss/colors": "^4.1.5", - "@sindresorhus/is": "^7.0.2", - "supports-color": "^10.0.0" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/@poppinss/exception": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", - "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.11.tgz", - "integrity": "sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==", + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.6.tgz", + "integrity": "sha512-NNu0sjyNxpoiW3YuVFfNz7mxSQ+S4X2G28uqg2s+CzoqoQjLPsWSbsFFyztIAqt2vb8kfEAsJNepMGPTxFDx3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/set-cookie-parser": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", + "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", "cpu": [ - "arm" + "ppc64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "android" + "aix" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.11.tgz", - "integrity": "sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==", + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "android" + "darwin" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.11.tgz", - "integrity": "sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==", + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.11.tgz", - "integrity": "sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==", + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "darwin" + "freebsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.11.tgz", - "integrity": "sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==", + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "freebsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.11.tgz", - "integrity": "sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==", + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.11.tgz", - "integrity": "sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==", + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.11.tgz", - "integrity": "sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==", + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", "cpu": [ - "arm64" + "loong64" ], "dev": true, - "libc": [ - "musl" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" ], - "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.11.tgz", - "integrity": "sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==", + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", "cpu": [ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.11.tgz", - "integrity": "sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==", + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", "cpu": [ - "s390x" + "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.11.tgz", - "integrity": "sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==", + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", "cpu": [ - "x64" + "s390x" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.11.tgz", - "integrity": "sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==", + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.11.tgz", - "integrity": "sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==", + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "openharmony" + "netbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.11.tgz", - "integrity": "sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==", + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "netbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.11.tgz", - "integrity": "sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==", + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "openbsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=16.20.0" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", - "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "node": ">=16.20.0" } }, - "node_modules/@speed-highlight/core": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.17.tgz", - "integrity": "sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "25.0.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.6.tgz", - "integrity": "sha512-NNu0sjyNxpoiW3YuVFfNz7mxSQ+S4X2G28uqg2s+CzoqoQjLPsWSbsFFyztIAqt2vb8kfEAsJNepMGPTxFDx3Q==", + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/@types/set-cookie-parser": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", - "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" } }, - "node_modules/@types/statuses": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", - "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", - "dev": true, - "license": "MIT" - }, "node_modules/@vitest/expect": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", @@ -2570,6 +4625,45 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2606,6 +4700,55 @@ "node": ">=12" } }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/binaryen": { + "version": "132.0.0", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-132.0.0.tgz", + "integrity": "sha512-4Usg7yEvwO3FMso3Oov6qkOOHSod1IEv+boKkh77kTljM+eNBouqCTbqWswGzbG+vDNO/b/v2C4gfEh1WgB9Lg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "wasm-as": "bin/wasm-as", + "wasm-ctor-eval": "bin/wasm-ctor-eval", + "wasm-dis": "bin/wasm-dis", + "wasm-merge": "bin/wasm-merge", + "wasm-metadce": "bin/wasm-metadce", + "wasm-opt": "bin/wasm-opt", + "wasm-reduce": "bin/wasm-reduce", + "wasm-shell": "bin/wasm-shell", + "wasm2js": "bin/wasm2js" + } + }, "node_modules/blake3-wasm": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", @@ -2613,6 +4756,44 @@ "dev": true, "license": "MIT" }, + "node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -2623,6 +4804,16 @@ "node": ">=18" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", @@ -2675,6 +4866,39 @@ "dev": true, "license": "MIT" }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/componentize-qjs": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/componentize-qjs/-/componentize-qjs-0.4.5.tgz", + "integrity": "sha512-/Brt+/Ps7DQ1mYuUsDISTQTFSaZfCSoRHkHnh9Dm5WHCO6arc/vzVdD8TXssfyNex2Iv3UR8NHdahsqABPDh0w==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "componentize-qjs": "bin/componentize-qjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "@andreiltd/componentize-qjs-binding-darwin-arm64": "0.4.5", + "@andreiltd/componentize-qjs-binding-darwin-x64": "0.4.5", + "@andreiltd/componentize-qjs-binding-linux-arm64-gnu": "0.4.5", + "@andreiltd/componentize-qjs-binding-linux-arm64-musl": "0.4.5", + "@andreiltd/componentize-qjs-binding-linux-x64-gnu": "0.4.5", + "@andreiltd/componentize-qjs-binding-linux-x64-musl": "0.4.5", + "@andreiltd/componentize-qjs-binding-win32-arm64-msvc": "0.4.5", + "@andreiltd/componentize-qjs-binding-win32-x64-msvc": "0.4.5" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2793,6 +5017,26 @@ "@types/estree": "^1.0.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", @@ -2871,6 +5115,13 @@ } } }, + "node_modules/fflate": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "dev": true, + "license": "MIT" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2926,6 +5177,27 @@ "node": ">=16.9.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2960,6 +5232,19 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -3271,6 +5556,61 @@ "node": ">=22.0.0" } }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/msw": { "version": "2.14.6", "resolved": "https://registry.npmjs.org/msw/-/msw-2.14.6.tgz", @@ -3380,6 +5720,83 @@ "dev": true, "license": "MIT" }, + "node_modules/oxc-minify": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/oxc-minify/-/oxc-minify-0.151.0.tgz", + "integrity": "sha512-fYdJw3+WYswBWedCl3G0ReJPlHIR1msz3uf5cGAgpHOlQOxfrVu5nOp2gLnccA91Vs7Yw2nH00lj8pc0rjZvYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/oxc-project" + }, + "optionalDependencies": { + "@oxc-minify/binding-android-arm-eabi": "0.151.0", + "@oxc-minify/binding-android-arm64": "0.151.0", + "@oxc-minify/binding-darwin-arm64": "0.151.0", + "@oxc-minify/binding-darwin-x64": "0.151.0", + "@oxc-minify/binding-freebsd-x64": "0.151.0", + "@oxc-minify/binding-linux-arm-gnueabihf": "0.151.0", + "@oxc-minify/binding-linux-arm-musleabihf": "0.151.0", + "@oxc-minify/binding-linux-arm64-gnu": "0.151.0", + "@oxc-minify/binding-linux-arm64-musl": "0.151.0", + "@oxc-minify/binding-linux-ppc64-gnu": "0.151.0", + "@oxc-minify/binding-linux-riscv64-gnu": "0.151.0", + "@oxc-minify/binding-linux-riscv64-musl": "0.151.0", + "@oxc-minify/binding-linux-s390x-gnu": "0.151.0", + "@oxc-minify/binding-linux-x64-gnu": "0.151.0", + "@oxc-minify/binding-linux-x64-musl": "0.151.0", + "@oxc-minify/binding-openharmony-arm64": "0.151.0", + "@oxc-minify/binding-win32-arm64-msvc": "0.151.0", + "@oxc-minify/binding-win32-ia32-msvc": "0.151.0", + "@oxc-minify/binding-win32-x64-msvc": "0.151.0" + } + }, + "node_modules/oxc-parser": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.76.0.tgz", + "integrity": "sha512-l98B2e9evuhES7zN99rb1QGhbzx25829TJFaKi2j0ib3/K/G5z1FdGYz6HZkrU3U8jdH7v2FC8mX1j2l9JrOUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.76.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm64": "0.76.0", + "@oxc-parser/binding-darwin-arm64": "0.76.0", + "@oxc-parser/binding-darwin-x64": "0.76.0", + "@oxc-parser/binding-freebsd-x64": "0.76.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.76.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.76.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.76.0", + "@oxc-parser/binding-linux-arm64-musl": "0.76.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.76.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.76.0", + "@oxc-parser/binding-linux-x64-gnu": "0.76.0", + "@oxc-parser/binding-linux-x64-musl": "0.76.0", + "@oxc-parser/binding-wasm32-wasi": "0.76.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.76.0", + "@oxc-parser/binding-win32-x64-msvc": "0.76.0" + } + }, + "node_modules/oxc-parser/node_modules/@oxc-project/types": { + "version": "0.76.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.76.0.tgz", + "integrity": "sha512-CH3THIrSViKal8yV/Wh3FK0pFhp40nzW1MUDCik9fNuid2D/7JJXKJnfFOAvMxInGXDlvmgT6ACAzrl47TqzkQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, "node_modules/oxfmt": { "version": "0.31.0", "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.31.0.tgz", @@ -3558,6 +5975,101 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/regenerate": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.5.0.tgz", + "integrity": "sha512-1s+CxXjJ71i7LNVy8nYwg47XV4y6lAnOEhsMtSKq3WpmPfhl9LuKlTqKIn/3yUpE8lBz+W+TT88Bxyhnr0U4yw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.3.0.tgz", + "integrity": "sha512-9ns8odR8e9q3otKeHj3DE80jZYKg6zVeZKE+zQmRKXFoVUcuiTGeO6iusDhPRoIQQPVPRvH+SfBhrTud4eczuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.4.tgz", + "integrity": "sha512-EWV80YgFaVgFrjGCAsV7oybp4GOxbls5RzBg8OB0nKEVXsBJR1JlV8Di1JhCROg3MzTfe1RI8yitIm1eOs68iA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3609,6 +6121,27 @@ "@rolldown/binding-win32-x64-msvc": "1.2.11" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -3763,6 +6296,16 @@ "dev": true, "license": "MIT" }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -3817,6 +6360,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -3894,6 +6454,19 @@ "node": ">=16" } }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -3951,6 +6524,21 @@ "node": ">=14.17" } }, + "node_modules/typescript-compiler-api": { + "name": "typescript", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/undici": { "version": "7.29.1", "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz", @@ -3978,6 +6566,50 @@ "pathe": "^2.0.3" } }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/until-async": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", @@ -3988,6 +6620,13 @@ "url": "https://github.com/sponsors/kettanaito" } }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.1.tgz", @@ -4156,6 +6795,30 @@ } } }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4312,6 +6975,16 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/yaml": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", diff --git a/package.json b/package.json index 6ec72041..86bb6486 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,11 @@ "test:watch": "vitest", "check": "npm run format:check && npm run lint && npm run typecheck && npm run test", "seed:staging": "tsx scripts/seed-r2.ts staging", - "seed:prod": "tsx scripts/seed-r2.ts production" + "seed:prod": "tsx scripts/seed-r2.ts production", + "generate:tools": "tsx scripts/generate-tools.ts" }, "dependencies": { + "@cloudflare/forge-mcp": "file:vendor/cloudflare-forge-mcp-0.1.0.tgz", "@cloudflare/workers-oauth-provider": "^1.2.3", "@modelcontextprotocol/server": "2.3.1", "hono": "^4.13.7", @@ -28,6 +30,8 @@ "zod": "^4.3.5" }, "devDependencies": { + "@bytecodealliance/jco": "1.37.0", + "@cloudflare/forge": "https://pkg.pr.new/cloudflare/forge/@cloudflare/forge@ca70d7f5", "@cloudflare/vitest-plugin": "^1.4.0", "@modelcontextprotocol/client": "2.3.1", "@types/node": "^25.0.6", diff --git a/scripts/forge-tools.ts b/scripts/forge-tools.ts new file mode 100644 index 00000000..7dfb4a7a --- /dev/null +++ b/scripts/forge-tools.ts @@ -0,0 +1,34 @@ +import { execFileSync } from 'node:child_process' +import { mkdirSync, readFileSync } from 'node:fs' +import { join, resolve } from 'node:path' + +const root = resolve(import.meta.dirname, '..') +const bin = (name: string) => join(root, 'node_modules', '.bin', name) + +/** + * Builds the Cloudflare forge-mcp plugin and runs forge on an + * `openapi.forge.json`, writing `mcp-tools.json` into `outDir`. + * Returns the catalogue's path. + */ +export function generateForgeTools(spec: string, outDir: string): string { + mkdirSync(outDir, { recursive: true }) + const plugin = join(outDir, 'cloudflare-mcp.wasm') + execFileSync( + bin('forge-plugin'), + ['build', join(root, 'src/forge-tools/plugin-entry.ts'), '-o', plugin], + { + stdio: 'inherit' + } + ) + execFileSync(bin('forge'), [spec, '--target', `wasm://${plugin}`, '--out', outDir], { + stdio: 'inherit' + }) + + const path = join(outDir, 'mcp-tools.json') + const catalogue = JSON.parse(readFileSync(path, 'utf8')) as { + tools: unknown[] + skipped: unknown[] + } + console.log(`forge-mcp: ${catalogue.tools.length} tools, ${catalogue.skipped.length} skipped`) + return path +} diff --git a/scripts/generate-tools.ts b/scripts/generate-tools.ts new file mode 100644 index 00000000..bcc5c435 --- /dev/null +++ b/scripts/generate-tools.ts @@ -0,0 +1,24 @@ +// Generates the Cloudflare direct-tool catalogue into generated/forge/: +// +// npm run generate:tools [-- path/to/openapi.forge.json] +// +// Without a path, it downloads openapi.forge.json from the latest Forge release. +import { writeFileSync, mkdirSync } from 'node:fs' +import { join, resolve } from 'node:path' +import { generateForgeTools } from './forge-tools' + +export const FORGE_SPEC_URL = + 'https://github.com/cloudflare/forge/releases/latest/download/openapi.forge.json' + +const outDir = resolve(import.meta.dirname, '..', 'generated', 'forge') +let spec = process.argv[2] +if (!spec) { + mkdirSync(outDir, { recursive: true }) + spec = join(outDir, 'openapi.forge.json') + console.log(`Downloading ${FORGE_SPEC_URL}...`) + const response = await fetch(FORGE_SPEC_URL) + if (!response.ok) throw new Error(`Failed to fetch the Forge spec: ${response.status}`) + writeFileSync(spec, Buffer.from(await response.arrayBuffer())) +} + +console.log(`Wrote ${generateForgeTools(resolve(spec), outDir)}`) diff --git a/scripts/seed-r2.ts b/scripts/seed-r2.ts index 1ac3690a..069b868a 100644 --- a/scripts/seed-r2.ts +++ b/scripts/seed-r2.ts @@ -6,6 +6,8 @@ import { processSpec, extractProducts } from '../src/spec-processor' import { MCP_TOOLS_KEY, buildMcpTools, type OperationInfo } from '../src/openapi' import { fetchSkills } from '../src/skills/sync' import { SKILLS_MANIFEST_KEY, skillFileKey } from '../src/skills/types' +import { FORGE_TOOLS_KEY } from '../src/forge-tools/policy' +import { generateForgeTools } from './forge-tools' const OPENAPI_SPEC_URL = 'https://github.com/cloudflare/forge/releases/latest/download/openapi.forge.json' @@ -22,7 +24,8 @@ if (!response.ok) { throw new Error(`Failed to fetch spec: ${response.status}`) } -const rawSpec = (await response.json()) as Record +const rawSpecText = await response.text() +const rawSpec = JSON.parse(rawSpecText) as Record console.log('Processing spec, resolving $refs...') const processed = processSpec(rawSpec) @@ -48,6 +51,11 @@ const skillFilesDir = join(tmp, 'skill-files') const skillFilesListPath = join(tmp, 'skill-files.json') try { + // The forge-mcp catalogue (`?forge=true`) is generated by forge from the raw document. + const rawSpecPath = join(tmp, 'openapi.forge.json') + writeFileSync(rawSpecPath, rawSpecText) + const forgeToolsPath = generateForgeTools(rawSpecPath, join(tmp, 'forge')) + writeFileSync(specPath, specJson) writeFileSync(productsPath, productsJson) writeFileSync(mcpToolsPath, mcpToolsJson) @@ -71,7 +79,8 @@ try { ['spec.json', specPath], ['products.json', productsPath], [MCP_TOOLS_KEY, mcpToolsPath], - [SKILLS_MANIFEST_KEY, skillsManifestPath] + [SKILLS_MANIFEST_KEY, skillsManifestPath], + [FORGE_TOOLS_KEY, forgeToolsPath] ] as const) { console.log(`Uploading ${key} to R2 (--env ${env})...`) execSync( diff --git a/src/forge-tools/cloudflare-plugin.ts b/src/forge-tools/cloudflare-plugin.ts new file mode 100644 index 00000000..a83559fd --- /dev/null +++ b/src/forge-tools/cloudflare-plugin.ts @@ -0,0 +1,70 @@ +import type { Method } from '@cloudflare/forge/plugin' +import type { CatalogueTool } from '@cloudflare/forge-mcp/plugin' +import { + ACCOUNT_OR_ZONE_DESCRIPTION, + ACCOUNT_OR_ZONE_ID_DESCRIPTION, + ACCOUNT_OR_ZONE_VALUES, + FORGE_ACCOUNT_ID_DESCRIPTION, + PERMISSIONS_EXTENSION +} from './policy' + +type Properties = Record + +/** + * The Cloudflare policy on top of the generic forge-mcp tool: + * + * - `account_id` is optional with one description, so tool lists don't depend + * on the session; the server fills it in when the session has one account. + * - Forge merges methods that exist under both accounts and zones into + * `/{account_or_zone}/{account_or_zone_id}/…`. `account_or_zone` gets its + * two values, and `account_or_zone_id` is optional like `account_id`. + * - The API token permissions a method accepts (`x-api-token-group`) are kept + * in the tool's extensions, for explaining a refused call. Clients never see + * them. + */ +export function cloudflareTool(tool: CatalogueTool, method: Method): CatalogueTool { + const { required: currentRequired, properties: currentProperties, ...schema } = tool.inputSchema + const properties: Properties = { ...(currentProperties as Properties) } + const optional = new Set() + + if ('account_id' in properties) { + properties.account_id = { type: 'string', description: FORGE_ACCOUNT_ID_DESCRIPTION } + optional.add('account_id') + } + if ('account_or_zone' in properties) { + properties.account_or_zone = { + type: 'string', + enum: [...ACCOUNT_OR_ZONE_VALUES], + description: ACCOUNT_OR_ZONE_DESCRIPTION + } + } + if ('account_or_zone_id' in properties) { + properties.account_or_zone_id = { type: 'string', description: ACCOUNT_OR_ZONE_ID_DESCRIPTION } + optional.add('account_or_zone_id') + } + + const required = (Array.isArray(currentRequired) ? (currentRequired as string[]) : []).filter( + (key) => !optional.has(key) + ) + const permissions = permissionLabels(method.extension(PERMISSIONS_EXTENSION)) + + return { + ...tool, + inputSchema: { + ...schema, + type: 'object', + properties, + ...(required.length > 0 && { required }) + }, + ...(permissions && { extensions: { ...tool.extensions, [PERMISSIONS_EXTENSION]: permissions } }) + } +} + +/** A list of permission names, or undefined for anything else. */ +function permissionLabels(value: unknown): string[] | undefined { + return Array.isArray(value) && + value.length > 0 && + value.every((item) => typeof item === 'string' && item.length > 0) + ? value + : undefined +} diff --git a/src/forge-tools/plugin-entry.ts b/src/forge-tools/plugin-entry.ts new file mode 100644 index 00000000..7aaa37e5 --- /dev/null +++ b/src/forge-tools/plugin-entry.ts @@ -0,0 +1,10 @@ +// The forge plugin that generates the Cloudflare direct-tool catalogue: the +// generic forge-mcp tools with the Cloudflare policy applied. Built into a +// QuickJS component by `npm run generate:tools`; the Worker never imports it. +import { definePlugin } from '@cloudflare/forge/plugin' +import { catalogueFile } from '@cloudflare/forge-mcp/plugin' +import { cloudflareTool } from './cloudflare-plugin' + +export const { generate, generateGroup } = definePlugin({ + generate: (forge) => [catalogueFile(forge, { transform: cloudflareTool })] +}) diff --git a/src/forge-tools/policy.ts b/src/forge-tools/policy.ts new file mode 100644 index 00000000..9c43d2e7 --- /dev/null +++ b/src/forge-tools/policy.ts @@ -0,0 +1,32 @@ +/** + * What the Cloudflare forge-mcp plugin and the Worker that serves its catalogue + * agree on. No imports: the plugin is bundled into a QuickJS component, and the + * Worker imports this too. + */ + +/** R2 key of the catalogue the Cloudflare plugin generates. */ +export const FORGE_TOOLS_KEY = 'forge-mcp-tools.json' + +/** The generated tool that lists the caller's accounts. */ +export const ACCOUNTS_TOOL = 'accounts_list' + +/** Points callers at the generated account listing tool. */ +export const FORGE_ACCOUNT_DISCOVERY_GUIDANCE = `Call the ${ACCOUNTS_TOOL} tool to discover available accounts.` + +/** + * The `account_id` schema on every account-scoped tool: optional, with the same + * description for every session, because clients cache tool lists and may + * share them. The server fills it in when the session has one account. + */ +export const FORGE_ACCOUNT_ID_DESCRIPTION = `Cloudflare account ID. Optional when the session is authorized for exactly one account; otherwise required. ${FORGE_ACCOUNT_DISCOVERY_GUIDANCE}` + +/** The values of the `account_or_zone` path parameter Forge adds to methods it merged. */ +export const ACCOUNT_OR_ZONE_VALUES = ['accounts', 'zones'] as const + +export const ACCOUNT_OR_ZONE_DESCRIPTION = + 'Whether account_or_zone_id is an account ID (`accounts`) or a zone ID (`zones`).' + +export const ACCOUNT_OR_ZONE_ID_DESCRIPTION = `The account or zone ID that account_or_zone names. Optional for \`accounts\` when the session is authorized for exactly one account. ${FORGE_ACCOUNT_DISCOVERY_GUIDANCE}` + +/** The extension a tool's accepted API token permissions are kept under. */ +export const PERMISSIONS_EXTENSION = 'x-api-token-group' diff --git a/src/isolate-cache.ts b/src/isolate-cache.ts index 1a48a394..a6ac8a99 100644 --- a/src/isolate-cache.ts +++ b/src/isolate-cache.ts @@ -1,6 +1,8 @@ import { env } from 'cloudflare:workers' import type { Tool } from '@modelcontextprotocol/server' +import { catalogueTools, isCatalogue, type CatalogueTools } from '@cloudflare/forge-mcp' import { MCP_TOOLS_KEY, type McpTool } from './openapi' +import { FORGE_TOOLS_KEY } from './forge-tools/policy' import { SKILLS_MANIFEST_KEY, SkillsManifest, @@ -109,6 +111,19 @@ export function getMcpTools(): Promise { return mcpTools.get() } +const forgeTools = cached(async (): Promise => { + const catalogue: unknown = await (await required(FORGE_TOOLS_KEY)).json() + if (!isCatalogue(catalogue)) { + throw new Error(`${FORGE_TOOLS_KEY} is not a catalogue this Worker can serve`) + } + return catalogueTools(catalogue) +}) + +/** The forge-mcp direct tools (`?forge=true`): the `tools/list` payload and name lookup. */ +export function getForgeTools(): Promise { + return forgeTools.get() +} + const products = cached(async (): Promise => { const object = await env.SPEC_BUCKET.get('products.json') return object ? object.json() : [] @@ -181,6 +196,7 @@ export async function readSkillFile(file: SkillFile): Promise { /** Drop cached artifacts. For tests that re-seed R2 between cases. */ export function resetIsolateCache(): void { + forgeTools.reset() spec.reset() products.reset() mcpTools.reset() diff --git a/src/mcp-handler.ts b/src/mcp-handler.ts index 84424e35..8829a8c1 100644 --- a/src/mcp-handler.ts +++ b/src/mcp-handler.ts @@ -34,14 +34,17 @@ const ALLOWED_MCP_ORIGIN_HOSTNAMES = [ ] /** - * Read the server options from the MCP URL query string. Each option stays on - * unless the client passes exactly `false`, e.g. `/mcp?codemode=false`. + * Read the server options from the MCP URL query string. `codemode` and + * `truncateToolResult` stay on unless the client passes exactly `false`, e.g. + * `/mcp?codemode=false`; `forge` is off unless it is exactly `true`. */ function serverOptionsFromUrl(url: string): ServerOptions { const params = new URL(url).searchParams return { codemode: params.get('codemode') !== 'false', - truncateToolResult: params.get('truncateToolResult') !== 'false' + truncateToolResult: params.get('truncateToolResult') !== 'false', + // Off unless the client passes exactly `true`, e.g. `/mcp?forge=true`. + forge: params.get('forge') === 'true' } } diff --git a/src/server.ts b/src/server.ts index c7c6ba23..e4dce546 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,6 +1,7 @@ import { McpServer } from '@modelcontextprotocol/server' import { registerDocsTool } from './tools/docs-search' import { registerNonCodemodeTools } from './tools/non-codemode' +import { registerForgeTools } from './tools/forge-tools' import { registerSearchTool } from './tools/search' import { registerExecuteTool } from './tools/execute' import { registerWhoamiTool } from './tools/whoami' @@ -27,6 +28,12 @@ export interface ServerOptions { * whole. Defaults to `true`. */ readonly truncateToolResult?: boolean + /** + * Serve the direct tools generated by the forge-mcp plugin instead of + * Code Mode or the `mcp-tools.json` direct tools. Opt-in while it is tried + * out. Defaults to `false`. + */ + readonly forge?: boolean } /** What one authenticated request brings besides its credentials. */ @@ -54,7 +61,7 @@ export function directRequestContext(): RequestContext { */ export async function createServer( props: AuthProps, - { codemode = true, truncateToolResult = true }: ServerOptions = {}, + { codemode = true, truncateToolResult = true, forge = false }: ServerOptions = {}, { connection, scopeChallenge, events }: RequestContext = directRequestContext() ): Promise { const server = new McpServer(SERVER_INFO) @@ -67,6 +74,11 @@ export async function createServer( if (events) registerEventMethods(server, events.env, props, events.bearer) const formatResult = truncateToolResult ? truncateResponse : stringifyResponse + if (forge) { + await registerForgeTools(server, props, formatResult, connection, scopeChallenge) + return server + } + if (!codemode) { await registerNonCodemodeTools(server, props, formatResult, connection, scopeChallenge) return server diff --git a/src/tools/forge-tools.ts b/src/tools/forge-tools.ts new file mode 100644 index 00000000..ae96be25 --- /dev/null +++ b/src/tools/forge-tools.ts @@ -0,0 +1,172 @@ +import { z } from 'zod' +import { env } from 'cloudflare:workers' +import type { McpServer, CallToolResult } from '@modelcontextprotocol/server' +import { buildRequest, InvalidArguments, type CatalogueTool } from '@cloudflare/forge-mcp' +import type { FormatToolResult } from '../truncate' +import { fetchWithRetry } from '../utils/fetch-retry' +import { getForgeTools } from '../isolate-cache' +import { + autoResolvedAccountId, + missingAccountMessage, + unknownAccountHint +} from '../auth/account-access' +import { recordToolCall } from '../metrics' +import { DOCS_TOOL, runDocsTool } from './docs-search' +import { WHOAMI_TOOL, WhoamiInputSchema, runWhoamiTool } from './whoami' +import type { AuthProps } from '../auth/types' +import type { Connection } from '../api-permissions' +import { explainRefusalFor } from '../api-refusal-hint' +import { WWW_AUTHENTICATE_META_KEY, type ScopeChallenge } from '../scope-challenge' +import { FORGE_ACCOUNT_DISCOVERY_GUIDANCE, PERMISSIONS_EXTENSION } from '../forge-tools/policy' + +const ACCOUNT_OR_ZONE_PREFIX = '/{account_or_zone}/{account_or_zone_id}' + +/** + * Serve the forge-mcp catalogue (`?forge=true`): the direct tools the + * Cloudflare forge plugin generated from `openapi.forge.json`, alongside + * `docs` and `whoami`. + * + * `tools/list` returns the cached catalogue as generated. `tools/call` fills in + * the session's account, builds the request with forge-mcp, and sends it with + * the session's token. A refused call is explained, and asks for a step-up when + * a missing OAuth scope would let it through, as the other direct tools do. + */ +export async function registerForgeTools( + server: McpServer, + props: AuthProps, + formatResult: FormatToolResult, + connection: Connection, + scopeChallenge: ScopeChallenge +): Promise { + const tools = await getForgeTools() + + server.server.setRequestHandler('tools/list', () => ({ + tools: [DOCS_TOOL, WHOAMI_TOOL, ...tools.list] + })) + + server.server.setRequestHandler('tools/call', async (request) => { + const name = request.params.name + const args = request.params.arguments ?? {} + let result: CallToolResult + + try { + if (name === DOCS_TOOL.name) { + const parsed = z.object({ query: z.string() }).safeParse(args) + result = parsed.success + ? await runDocsTool(parsed.data.query) + : toolError(`Invalid arguments for tool ${name}: ${parsed.error.message}`) + } else if (name === WHOAMI_TOOL.name) { + const parsed = WhoamiInputSchema.safeParse(args) + result = parsed.success + ? runWhoamiTool(props) + : toolError(`Invalid arguments for tool ${name}: ${parsed.error.message}`) + } else { + const tool = tools.byName.get(name) + result = tool + ? await callForgeTool(tool, args, props, formatResult, { connection, scopeChallenge }) + : toolError(`Tool ${name} not found`) + } + } catch (error) { + result = toolError(error instanceof Error ? error.message : String(error)) + } + + recordToolCall(props, name, result.isError === true) + return result + }) +} + +async function callForgeTool( + tool: CatalogueTool, + given: Record, + props: AuthProps, + formatResult: FormatToolResult, + { connection, scopeChallenge }: { connection: Connection; scopeChallenge: ScopeChallenge } +): Promise { + const args = withSessionAccount(tool, given, props) + if (typeof args === 'string') return toolError(args) + + let request: Request + try { + request = buildRequest(tool, args, env.CLOUDFLARE_API_BASE) + } catch (error) { + if (error instanceof InvalidArguments) return toolError(error.message) + throw error + } + const headers = Object.fromEntries(request.headers) + headers['authorization'] = `Bearer ${props.accessToken}` + const body = + tool.request.body && args[tool.request.body.key] !== undefined + ? await request.text() + : undefined + + const response = await fetchWithRetry( + request.url, + { method: request.method, headers, body }, + { caller: 'forge_tool_call' } + ) + const contentType = response.headers.get('content-type') || '' + const result = contentType.includes('application/json') + ? await response.json() + : await response.text() + + if (response.ok) return { content: [{ type: 'text', text: formatResult(result) }] } + + const method = request.method + const refusal = explainRefusalFor(response.status, connection, method, template(tool, args), { + 'x-api-token-group': tool.extensions?.[PERMISSIONS_EXTENSION] + }) + const accountId = accountIdOf(args) + const notes = [refusal?.hint, accountId ? unknownAccountHint(props, accountId) : ''].filter( + Boolean + ) + const path = new URL(request.url).pathname.slice(new URL(env.CLOUDFLARE_API_BASE).pathname.length) + const text = [ + `Cloudflare API error: ${method} ${path} returned HTTP ${response.status}.`, + formatResult(result), + ...notes + ].join('\n\n') + const failure: CallToolResult = { content: [{ type: 'text', text }], isError: true } + // One refused request changed nothing, so the client can retry the call after stepping up. + const challenge = refusal?.scope ? scopeChallenge.require(refusal.scope) : undefined + return challenge ? { ...failure, _meta: { [WWW_AUTHENTICATE_META_KEY]: [challenge] } } : failure +} + +/** + * The arguments with the session's account filled in where the tool takes an + * account and the caller left it out, or a message saying which account to pick. + */ +function withSessionAccount( + tool: CatalogueTool, + args: Record, + props: AuthProps +): Record | string { + const pathKeys = new Set(tool.request.params.filter((p) => p.in === 'path').map((p) => p.key)) + const key = pathKeys.has('account_id') + ? 'account_id' + : pathKeys.has('account_or_zone_id') && args.account_or_zone === 'accounts' + ? 'account_or_zone_id' + : undefined + if (!key || args[key] !== undefined) return args + + const accountId = autoResolvedAccountId(props) + return accountId + ? { ...args, [key]: accountId } + : missingAccountMessage(props, FORGE_ACCOUNT_DISCOVERY_GUIDANCE) +} + +function accountIdOf(args: Record): string | undefined { + const id = args.account_or_zone === 'accounts' ? args.account_or_zone_id : args.account_id + return typeof id === 'string' ? id : undefined +} + +/** The endpoint's path template, with a merged account-or-zone path made concrete. */ +function template(tool: CatalogueTool, args: Record): string { + const path = tool.request.path + if (!path.startsWith(ACCOUNT_OR_ZONE_PREFIX)) return path + const scope = args.account_or_zone === 'zones' ? '/zones/{zone_id}' : '/accounts/{account_id}' + return scope + path.slice(ACCOUNT_OR_ZONE_PREFIX.length) +} + +function toolError(message: string): CallToolResult { + return { content: [{ type: 'text', text: message }], isError: true } +} diff --git a/tests/forge-tools-plugin.test.ts b/tests/forge-tools-plugin.test.ts new file mode 100644 index 00000000..c1fac54f --- /dev/null +++ b/tests/forge-tools-plugin.test.ts @@ -0,0 +1,52 @@ +import { describe, expect, it } from 'vitest' +import { cloudflareTool } from '../src/forge-tools/cloudflare-plugin' +import { + ACCOUNT_OR_ZONE_ID_DESCRIPTION, + FORGE_ACCOUNT_ID_DESCRIPTION +} from '../src/forge-tools/policy' +import { fakeMethod, genericTool } from './helpers/forge-tools' + +describe('Cloudflare forge-mcp plugin policy', () => { + it('makes account_id optional with one description', () => { + const tool = cloudflareTool( + genericTool( + 'workers_scripts_get', + 'GET', + '/accounts/{account_id}/workers/scripts/{script_name}' + ), + fakeMethod() + ) + + expect(tool.inputSchema.properties).toEqual({ + account_id: { type: 'string', description: FORGE_ACCOUNT_ID_DESCRIPTION }, + script_name: { type: 'string', description: 'Generic.' } + }) + expect(tool.inputSchema.required).toEqual(['script_name']) + }) + + it('names the two values of a merged account-or-zone path', () => { + const tool = cloudflareTool( + genericTool('access_apps_list', 'GET', '/{account_or_zone}/{account_or_zone_id}/access/apps'), + fakeMethod() + ) + + expect(tool.inputSchema.properties).toMatchObject({ + account_or_zone: { type: 'string', enum: ['accounts', 'zones'] }, + account_or_zone_id: { type: 'string', description: ACCOUNT_OR_ZONE_ID_DESCRIPTION } + }) + expect(tool.inputSchema.required).toEqual(['account_or_zone']) + }) + + it('keeps accepted permissions in extensions, and leaves other tools alone', () => { + const zoneTool = genericTool('dns_records_list', 'GET', '/zones/{zone_id}/dns_records') + const withPermissions = cloudflareTool( + zoneTool, + fakeMethod({ 'x-api-token-group': ['DNS Read'] }) + ) + const without = cloudflareTool(zoneTool, fakeMethod({ 'x-api-token-group': 'not a list' })) + + expect(withPermissions.extensions).toEqual({ 'x-api-token-group': ['DNS Read'] }) + expect(withPermissions.inputSchema).toEqual(zoneTool.inputSchema) + expect(without).toEqual(zoneTool) + }) +}) diff --git a/tests/forge-tools-worker.test.ts b/tests/forge-tools-worker.test.ts new file mode 100644 index 00000000..81094048 --- /dev/null +++ b/tests/forge-tools-worker.test.ts @@ -0,0 +1,190 @@ +import { env, exports } from 'cloudflare:workers' +import { http, HttpResponse } from 'msw' +import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import { API_BASE, cfError, cfSuccess, mockIdentityProbe } from './helpers/cloudflare-api' +import { clearKv } from './helpers/kv' +import { clearSpec, seedSpec } from './helpers/spec' +import { genericTool, seedForgeTools } from './helpers/forge-tools' +import { + MCP_URL, + mcpToolCallRequest, + mcpToolListRequest, + parseMcpResult, + toolText +} from './helpers/mcp' +import { server } from './setup/msw' + +/** + * The forge-mcp direct tools at /mcp?forge=true, through the real worker: + * auth, the transport, catalogue loading, account resolution and request + * building are real; the Cloudflare API is mocked with MSW. + */ + +const ACCOUNT_ID = '00000000000000000000000000000001' +const ACCOUNT_TOKEN = 'acct-token-forge' +const ZONE_ID = '0000000000000000000000000000000z' + +type ListedTool = { + name: string + inputSchema: { properties?: Record; required?: string[] } + [key: string]: unknown +} + +async function listForgeTools(token: string): Promise { + const req = new Request(`${MCP_URL}?forge=true`, mcpToolListRequest(token)) + const result = (await parseMcpResult(await exports.default.fetch(req))) as unknown as { + result?: { tools?: ListedTool[] } + } + return result.result?.tools ?? [] +} + +async function callForgeTool(token: string, name: string, args: Record) { + const req = new Request(`${MCP_URL}?forge=true`, mcpToolCallRequest(token, name, args)) + return parseMcpResult(await exports.default.fetch(req)) +} + +beforeEach(async () => { + await seedSpec({}) + await seedForgeTools([ + { + tool: genericTool('workers_scripts_list', 'GET', '/accounts/{account_id}/workers/scripts', { + query: ['tags'] + }), + permissions: ['Workers Scripts Read'] + }, + { + tool: genericTool('d1_database_create', 'POST', '/accounts/{account_id}/d1/database', { + body: true + }) + }, + { + tool: genericTool( + 'access_apps_list', + 'GET', + '/{account_or_zone}/{account_or_zone_id}/access/apps' + ) + } + ]) + mockIdentityProbe({ accounts: [{ id: ACCOUNT_ID, name: 'Acc' }] }) +}) + +afterEach(async () => { + await clearSpec() + await clearKv(env.OAUTH_KV) +}) + +describe('forge-mcp direct tools (?forge=true)', () => { + it('lists docs, whoami and the catalogue tools, without routes or extensions', async () => { + const tools = await listForgeTools(ACCOUNT_TOKEN) + + expect(tools.map((tool) => tool.name)).toEqual([ + 'docs', + 'whoami', + 'workers_scripts_list', + 'd1_database_create', + 'access_apps_list' + ]) + const workers = tools.find((tool) => tool.name === 'workers_scripts_list')! + expect(workers.inputSchema.required ?? []).not.toContain('account_id') + expect(workers).not.toHaveProperty('request') + expect(workers).not.toHaveProperty('extensions') + }) + + it("fills in the session's account and forwards query arguments", async () => { + let called: URL | undefined + let auth: string | null = null + server.use( + http.get(`${API_BASE}/accounts/${ACCOUNT_ID}/workers/scripts`, ({ request }) => { + called = new URL(request.url) + auth = request.headers.get('Authorization') + return HttpResponse.json(cfSuccess([{ id: 'worker-a' }])) + }) + ) + + const result = await callForgeTool(ACCOUNT_TOKEN, 'workers_scripts_list', { tags: 'prod' }) + + expect(result.result?.isError).toBeFalsy() + expect(toolText(result)).toContain('worker-a') + expect(called?.searchParams.get('tags')).toBe('prod') + expect(auth).toBe(`Bearer ${ACCOUNT_TOKEN}`) + }) + + it('sends the body argument as JSON', async () => { + let body: unknown + server.use( + http.post(`${API_BASE}/accounts/${ACCOUNT_ID}/d1/database`, async ({ request }) => { + body = await request.json() + return HttpResponse.json(cfSuccess({ uuid: 'db-1' })) + }) + ) + + const result = await callForgeTool(ACCOUNT_TOKEN, 'd1_database_create', { + body: { name: 'prod', primary_location_hint: 'weur' } + }) + + expect(result.result?.isError).toBeFalsy() + expect(body).toEqual({ name: 'prod', primary_location_hint: 'weur' }) + }) + + it('fills in the account for a merged path called with accounts, and needs the ID for zones', async () => { + server.use( + http.get(`${API_BASE}/accounts/${ACCOUNT_ID}/access/apps`, () => + HttpResponse.json(cfSuccess([{ id: 'app-1' }])) + ), + http.get(`${API_BASE}/zones/${ZONE_ID}/access/apps`, () => + HttpResponse.json(cfSuccess([{ id: 'zone-app' }])) + ) + ) + + const accounts = await callForgeTool(ACCOUNT_TOKEN, 'access_apps_list', { + account_or_zone: 'accounts' + }) + const zoneWithoutId = await callForgeTool(ACCOUNT_TOKEN, 'access_apps_list', { + account_or_zone: 'zones' + }) + const zone = await callForgeTool(ACCOUNT_TOKEN, 'access_apps_list', { + account_or_zone: 'zones', + account_or_zone_id: ZONE_ID + }) + + expect(toolText(accounts)).toContain('app-1') + expect(zoneWithoutId.result?.isError).toBe(true) + expect(toolText(zoneWithoutId)).toBe('Missing path parameter: account_or_zone_id') + expect(toolText(zone)).toContain('zone-app') + }) + + it("explains a refused call and names the token's account", async () => { + server.use( + http.get(`${API_BASE}/accounts/not-mine/workers/scripts`, () => + HttpResponse.json(cfError([{ code: 9109, message: 'Unauthorized' }]), { status: 403 }) + ) + ) + + const result = await callForgeTool(ACCOUNT_TOKEN, 'workers_scripts_list', { + account_id: 'not-mine' + }) + + expect(result.result?.isError).toBe(true) + const text = toolText(result) + expect(text).toContain( + 'Cloudflare API error: GET /accounts/not-mine/workers/scripts returned HTTP 403.' + ) + expect(text).toContain("account_id not-mine is not this token's account.") + }) + + it('reports an unknown tool', async () => { + const result = await callForgeTool(ACCOUNT_TOKEN, 'nope', {}) + + expect(result.result?.isError).toBe(true) + expect(toolText(result)).toBe('Tool nope not found') + }) + + it('leaves the other tool surfaces alone without ?forge=true', async () => { + const req = new Request(`${MCP_URL}?codemode=false`, mcpToolListRequest(ACCOUNT_TOKEN)) + const result = (await parseMcpResult(await exports.default.fetch(req))) as unknown as { + result?: { tools?: Array<{ name: string }> } + } + + expect(result.result?.tools?.map((tool) => tool.name)).not.toContain('workers_scripts_list') + }) +}) diff --git a/tests/helpers/forge-tools.ts b/tests/helpers/forge-tools.ts new file mode 100644 index 00000000..e94f8d58 --- /dev/null +++ b/tests/helpers/forge-tools.ts @@ -0,0 +1,68 @@ +import { env } from 'cloudflare:workers' +import type { Catalogue, CatalogueTool } from '@cloudflare/forge-mcp' +import type { Method } from '@cloudflare/forge/plugin' +import { resetIsolateCache } from '../../src/isolate-cache' +import { cloudflareTool } from '../../src/forge-tools/cloudflare-plugin' +import { FORGE_TOOLS_KEY } from '../../src/forge-tools/policy' + +/** A method as the Cloudflare plugin reads it: only its extensions. */ +export function fakeMethod(extensions: Record = {}): Method { + return { extension: (name: string) => extensions[name] } as unknown as Method +} + +/** A generic forge-mcp tool for `method path`, with path parameters required. */ +export function genericTool( + name: string, + method: string, + path: string, + options: { query?: string[]; body?: boolean } = {} +): CatalogueTool { + const pathParams = [...path.matchAll(/\{([^}]+)\}/g)].map((match) => match[1]!) + const properties: Record = {} + for (const key of [...pathParams, ...(options.query ?? [])]) { + properties[key] = { type: 'string', description: 'Generic.' } + } + if (options.body) properties.body = { type: 'object' } + const required = [...pathParams, ...(options.body ? ['body'] : [])] + return { + name, + description: `${method} ${path}`, + inputSchema: { type: 'object', properties, ...(required.length > 0 && { required }) }, + annotations: { + readOnlyHint: method === 'GET', + destructiveHint: method === 'DELETE', + idempotentHint: method !== 'POST', + openWorldHint: true + }, + request: { + method, + path, + params: [ + ...pathParams.map((key) => ({ key, name: key, in: 'path' as const })), + ...(options.query ?? []).map((key) => ({ + key, + name: key, + in: 'query' as const, + explode: true + })) + ], + ...(options.body && { body: { key: 'body', mediaType: 'application/json' } }) + } + } +} + +/** Seed R2 with a catalogue of `tools`, each passed through the Cloudflare plugin's policy. */ +export async function seedForgeTools( + tools: Array<{ tool: CatalogueTool; permissions?: string[] }> +): Promise { + const catalogue: Catalogue = { + format: 'forge-mcp/1', + api: { version: '4.0.0', baseUrl: 'https://api.cloudflare.com/client/v4' }, + tools: tools.map(({ tool, permissions }) => + cloudflareTool(tool, fakeMethod(permissions ? { 'x-api-token-group': permissions } : {})) + ), + skipped: [] + } + await env.SPEC_BUCKET.put(FORGE_TOOLS_KEY, JSON.stringify(catalogue)) + resetIsolateCache() +} diff --git a/vendor/cloudflare-forge-mcp-0.1.0.tgz b/vendor/cloudflare-forge-mcp-0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..cff8cbec2d46b71466a2a122223f1cdcd757754c GIT binary patch literal 711994 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 kR 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
Added\n\n${list(added)}\n\n
` : '' + ] + .filter(Boolean) + .join('\n') +} diff --git a/scripts/seed-r2.ts b/scripts/seed-r2.ts index 069b868a..1ac3690a 100644 --- a/scripts/seed-r2.ts +++ b/scripts/seed-r2.ts @@ -6,8 +6,6 @@ import { processSpec, extractProducts } from '../src/spec-processor' import { MCP_TOOLS_KEY, buildMcpTools, type OperationInfo } from '../src/openapi' import { fetchSkills } from '../src/skills/sync' import { SKILLS_MANIFEST_KEY, skillFileKey } from '../src/skills/types' -import { FORGE_TOOLS_KEY } from '../src/forge-tools/policy' -import { generateForgeTools } from './forge-tools' const OPENAPI_SPEC_URL = 'https://github.com/cloudflare/forge/releases/latest/download/openapi.forge.json' @@ -24,8 +22,7 @@ if (!response.ok) { throw new Error(`Failed to fetch spec: ${response.status}`) } -const rawSpecText = await response.text() -const rawSpec = JSON.parse(rawSpecText) as Record +const rawSpec = (await response.json()) as Record console.log('Processing spec, resolving $refs...') const processed = processSpec(rawSpec) @@ -51,11 +48,6 @@ const skillFilesDir = join(tmp, 'skill-files') const skillFilesListPath = join(tmp, 'skill-files.json') try { - // The forge-mcp catalogue (`?forge=true`) is generated by forge from the raw document. - const rawSpecPath = join(tmp, 'openapi.forge.json') - writeFileSync(rawSpecPath, rawSpecText) - const forgeToolsPath = generateForgeTools(rawSpecPath, join(tmp, 'forge')) - writeFileSync(specPath, specJson) writeFileSync(productsPath, productsJson) writeFileSync(mcpToolsPath, mcpToolsJson) @@ -79,8 +71,7 @@ try { ['spec.json', specPath], ['products.json', productsPath], [MCP_TOOLS_KEY, mcpToolsPath], - [SKILLS_MANIFEST_KEY, skillsManifestPath], - [FORGE_TOOLS_KEY, forgeToolsPath] + [SKILLS_MANIFEST_KEY, skillsManifestPath] ] as const) { console.log(`Uploading ${key} to R2 (--env ${env})...`) execSync( diff --git a/src/forge-tools/cloudflare-plugin.ts b/src/forge-tools/cloudflare-plugin.ts deleted file mode 100644 index a83559fd..00000000 --- a/src/forge-tools/cloudflare-plugin.ts +++ /dev/null @@ -1,70 +0,0 @@ -import type { Method } from '@cloudflare/forge/plugin' -import type { CatalogueTool } from '@cloudflare/forge-mcp/plugin' -import { - ACCOUNT_OR_ZONE_DESCRIPTION, - ACCOUNT_OR_ZONE_ID_DESCRIPTION, - ACCOUNT_OR_ZONE_VALUES, - FORGE_ACCOUNT_ID_DESCRIPTION, - PERMISSIONS_EXTENSION -} from './policy' - -type Properties = Record - -/** - * The Cloudflare policy on top of the generic forge-mcp tool: - * - * - `account_id` is optional with one description, so tool lists don't depend - * on the session; the server fills it in when the session has one account. - * - Forge merges methods that exist under both accounts and zones into - * `/{account_or_zone}/{account_or_zone_id}/…`. `account_or_zone` gets its - * two values, and `account_or_zone_id` is optional like `account_id`. - * - The API token permissions a method accepts (`x-api-token-group`) are kept - * in the tool's extensions, for explaining a refused call. Clients never see - * them. - */ -export function cloudflareTool(tool: CatalogueTool, method: Method): CatalogueTool { - const { required: currentRequired, properties: currentProperties, ...schema } = tool.inputSchema - const properties: Properties = { ...(currentProperties as Properties) } - const optional = new Set() - - if ('account_id' in properties) { - properties.account_id = { type: 'string', description: FORGE_ACCOUNT_ID_DESCRIPTION } - optional.add('account_id') - } - if ('account_or_zone' in properties) { - properties.account_or_zone = { - type: 'string', - enum: [...ACCOUNT_OR_ZONE_VALUES], - description: ACCOUNT_OR_ZONE_DESCRIPTION - } - } - if ('account_or_zone_id' in properties) { - properties.account_or_zone_id = { type: 'string', description: ACCOUNT_OR_ZONE_ID_DESCRIPTION } - optional.add('account_or_zone_id') - } - - const required = (Array.isArray(currentRequired) ? (currentRequired as string[]) : []).filter( - (key) => !optional.has(key) - ) - const permissions = permissionLabels(method.extension(PERMISSIONS_EXTENSION)) - - return { - ...tool, - inputSchema: { - ...schema, - type: 'object', - properties, - ...(required.length > 0 && { required }) - }, - ...(permissions && { extensions: { ...tool.extensions, [PERMISSIONS_EXTENSION]: permissions } }) - } -} - -/** A list of permission names, or undefined for anything else. */ -function permissionLabels(value: unknown): string[] | undefined { - return Array.isArray(value) && - value.length > 0 && - value.every((item) => typeof item === 'string' && item.length > 0) - ? value - : undefined -} diff --git a/src/forge-tools/cloudflare.ts b/src/forge-tools/cloudflare.ts new file mode 100644 index 00000000..56eb9e96 --- /dev/null +++ b/src/forge-tools/cloudflare.ts @@ -0,0 +1,60 @@ +import type { InputSchema, JsonSchema, Tool } from '../generated/forge-mcp' +import { + ACCOUNT_OR_ZONE_DESCRIPTION, + ACCOUNT_OR_ZONE_ID_DESCRIPTION, + ACCOUNT_OR_ZONE_VALUES, + FORGE_ACCOUNT_ID_DESCRIPTION, + PERMISSIONS_EXTENSION +} from './policy' + +/** + * The Cloudflare policy on top of a generated tool: + * + * - `account_id` is optional with one description, so tool lists don't depend + * on the session; the server fills it in when the session has one account. + * - Forge merges methods that exist under both accounts and zones into + * `/{account_or_zone}/{account_or_zone_id}/…`. `account_or_zone` gets its + * two values, and `account_or_zone_id` is optional like `account_id`. + * + * The tool's request code is kept, so calls build the same requests. + */ +export function cloudflareTool(tool: Tool): Tool { + const properties = tool.inputSchema.properties + if (!properties || !('account_id' in properties || 'account_or_zone' in properties)) return tool + + const changed: Record = { ...properties } + const optional = new Set() + if ('account_id' in changed) { + changed.account_id = { type: 'string', description: FORGE_ACCOUNT_ID_DESCRIPTION } + optional.add('account_id') + } + if ('account_or_zone' in changed) { + changed.account_or_zone = { + type: 'string', + enum: [...ACCOUNT_OR_ZONE_VALUES], + description: ACCOUNT_OR_ZONE_DESCRIPTION + } + } + if ('account_or_zone_id' in changed) { + changed.account_or_zone_id = { type: 'string', description: ACCOUNT_OR_ZONE_ID_DESCRIPTION } + optional.add('account_or_zone_id') + } + const required = (tool.inputSchema.required ?? []).filter((key) => !optional.has(key)) + const { required: _required, ...schema } = tool.inputSchema + const inputSchema: InputSchema = { + ...schema, + properties: changed, + ...(required.length > 0 && { required }) + } + return { ...tool, inputSchema } +} + +/** The API token permissions `tool` accepts, if its method lists them. */ +export function permissionsOf(tool: Tool): string[] | undefined { + const value = tool.extensions?.[PERMISSIONS_EXTENSION] + return Array.isArray(value) && + value.length > 0 && + value.every((item) => typeof item === 'string' && item.length > 0) + ? value + : undefined +} diff --git a/src/forge-tools/plugin-entry.ts b/src/forge-tools/plugin-entry.ts deleted file mode 100644 index 7aaa37e5..00000000 --- a/src/forge-tools/plugin-entry.ts +++ /dev/null @@ -1,10 +0,0 @@ -// The forge plugin that generates the Cloudflare direct-tool catalogue: the -// generic forge-mcp tools with the Cloudflare policy applied. Built into a -// QuickJS component by `npm run generate:tools`; the Worker never imports it. -import { definePlugin } from '@cloudflare/forge/plugin' -import { catalogueFile } from '@cloudflare/forge-mcp/plugin' -import { cloudflareTool } from './cloudflare-plugin' - -export const { generate, generateGroup } = definePlugin({ - generate: (forge) => [catalogueFile(forge, { transform: cloudflareTool })] -}) diff --git a/src/forge-tools/policy.ts b/src/forge-tools/policy.ts index 9c43d2e7..c4bd38cc 100644 --- a/src/forge-tools/policy.ts +++ b/src/forge-tools/policy.ts @@ -1,11 +1,4 @@ -/** - * What the Cloudflare forge-mcp plugin and the Worker that serves its catalogue - * agree on. No imports: the plugin is bundled into a QuickJS component, and the - * Worker imports this too. - */ - -/** R2 key of the catalogue the Cloudflare plugin generates. */ -export const FORGE_TOOLS_KEY = 'forge-mcp-tools.json' +/** The Cloudflare policy for the tools forge generates (`src/generated/forge-mcp`). */ /** The generated tool that lists the caller's accounts. */ export const ACCOUNTS_TOOL = 'accounts_list' diff --git a/src/generated/forge-mcp/README.md b/src/generated/forge-mcp/README.md new file mode 100644 index 00000000..3a5989e3 --- /dev/null +++ b/src/generated/forge-mcp/README.md @@ -0,0 +1,37 @@ + + +# MCP tools + +3053 tools in 1074 groups. `index.ts` exports them as `tools`, and the runtime in `_/` that serves them. + +## Methods without a tool + +| Method | Path | Why | +| --- | --- | --- | +| `POST` | `/accounts/{account_id}/addressing/loa_documents` | the request body is not JSON (multipart/form-data) | +| `POST` | `/accounts/{account_id}/analytics_engine/sql` | the request body is not JSON (text/plain) | +| `POST` | `/accounts/{account_id}/cloudforce-one/binary` | the request body is not JSON (multipart/form-data) | +| `POST` | `/zones/{zone_id}/dns_records/import` | the request body is not JSON (multipart/form-data) | +| `POST` | `/accounts/{account_id}/images/v1` | the request body is not JSON (multipart/form-data) | +| `POST` | `/accounts/{account_id}/images/v2/direct_upload` | the request body is not JSON (multipart/form-data) | +| `PUT` | `/accounts/{account_id}/intel/indicator-feeds/{feed_id}/snapshot` | the request body is not JSON (multipart/form-data) | +| `PUT` | `/accounts/{account_id}/storage/kv/namespaces/{namespace_id}/values/{key_name}` | the request body is not JSON (application/octet-stream, multipart/form-data) | +| `POST` | `/accounts/{account_id}/brand-protection/logos` | the request body is not JSON (application/x-www-form-urlencoded) | +| `POST` | `/{account_or_zone}/{account_or_zone_id}/logs/explorer/query/sql` | the request body is not JSON (text/plain) | +| `POST` | `/accounts/{account_id}/pages/projects/{project_name}/deployments` | the request body is not JSON (multipart/form-data) | +| `POST` | `/accounts/{account_id}/pay-per-use/usage-reports` | the request body is not JSON (application/jsonl) | +| `PUT` | `/accounts/{account_id}/r2/buckets/{bucket_name}/objects/{object_key}` | the request body is not JSON (application/octet-stream) | +| `PUT` | `/zones/{zone_id}/snippets/{snippet_name}` | the request body is not JSON (multipart/form-data) | +| `PUT` | `/accounts/{account_id}/stream/{identifier}/captions/{language}` | the request body is not JSON (multipart/form-data) | +| `POST` | `/accounts/{account_id}/vectorize/v2/indexes/{index_name}/insert` | the request body is not JSON (application/x-ndjson) | +| `POST` | `/accounts/{account_id}/vectorize/v2/indexes/{index_name}/upsert` | the request body is not JSON (application/x-ndjson) | +| `POST` | `/accounts/{account_id}/workers/assets/upload` | the request body is not JSON (multipart/form-data) | +| `PUT` | `/accounts/{account_id}/workers/scripts/{script_name}` | the request body is not JSON (application/javascript, multipart/form-data, text/javascript) | +| `PUT` | `/accounts/{account_id}/workers/scripts/{script_name}/content` | the request body is not JSON (multipart/form-data) | +| `PATCH` | `/accounts/{account_id}/workers/scripts/{script_name}/settings` | the request body is not JSON (multipart/form-data) | +| `POST` | `/accounts/{account_id}/workers/scripts/{script_name}/versions` | the request body is not JSON (multipart/form-data) | +| `PUT` | `/accounts/{account_id}/workers/dispatch/namespaces/{dispatch_namespace}/scripts/{script_name}` | the request body is not JSON (application/javascript, multipart/form-data, text/javascript) | +| `PUT` | `/accounts/{account_id}/workers/dispatch/namespaces/{dispatch_namespace}/scripts/{script_name}/content` | the request body is not JSON (multipart/form-data) | +| `PATCH` | `/accounts/{account_id}/workers/dispatch/namespaces/{dispatch_namespace}/scripts/{script_name}/settings` | the request body is not JSON (multipart/form-data) | +| `POST` | `/accounts/{account_id}/dlp/datasets/{dataset_id}/upload/{version}` | the request body is not JSON (application/octet-stream) | +| `PUT` | `/accounts/{account_id}/dlp/document_fingerprints/{document_fingerprint_id}` | the request body is not JSON (multipart/form-data) | diff --git a/src/generated/forge-mcp/_/index.ts b/src/generated/forge-mcp/_/index.ts new file mode 100644 index 00000000..2c39f0a4 --- /dev/null +++ b/src/generated/forge-mcp/_/index.ts @@ -0,0 +1,19 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +export { + buildRequest, + InvalidArguments, + listTools, + pathParam, + toolsByName, + type ApiRequest, + type Args, + type HeaderParam, + type InputSchema, + type JsonSchema, + type QueryParam, + type Tool, + type ToolAnnotations, +} from './tool.js'; +export { callTool, createHandler, readBody, serveTools, type CallContext, type HandlerOptions } from './server.js'; diff --git a/src/generated/forge-mcp/_/server.ts b/src/generated/forge-mcp/_/server.ts new file mode 100644 index 00000000..e0edd791 --- /dev/null +++ b/src/generated/forge-mcp/_/server.ts @@ -0,0 +1,156 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { + createMcpHandler, + McpServer, + type CallToolResult, + type Implementation, + type Tool as McpTool, +} from '@modelcontextprotocol/server'; + +import { buildRequest, InvalidArguments, listTools, toolsByName, type Args, type Tool } from './tool.js'; + +/** What a tool call needs besides the tool and its arguments. */ +export interface CallContext { + /** The API's base URL. */ + readonly baseUrl: string; + /** Headers every API request sends, such as `Authorization`. */ + readonly headers?: HeadersInit; + readonly fetch?: (request: Request) => Promise; + /** + * Returns the text of the result. By default a JSON body is pretty-printed, + * text is kept, and an error starts with the status. + */ + readonly formatResult?: (body: unknown, response: Response) => string; +} + +/** + * Serves `tools` on `server` with low-level `tools/list` and `tools/call` + * handlers, rather than registering each tool, which for thousands of tools + * costs more than the request. `call` makes the API request, and `extra` + * tools the server serves itself are listed first. + */ +export function serveTools( + server: McpServer, + tools: readonly Tool[], + call: (tool: Tool, args: Args) => Promise, + extra: readonly McpTool[] = [], +): void { + const listing = extra.length > 0 ? [...extra, ...listTools(tools)] : listTools(tools); + const byName = toolsByName(tools); + server.server.registerCapabilities({ tools: { listChanged: false } }); + // The SDK types the list as mutable; it only serializes it. + server.server.setRequestHandler('tools/list', () => ({ tools: listing as McpTool[] })); + server.server.setRequestHandler('tools/call', async (request) => { + const tool = byName.get(request.params.name); + if (!tool) { + return errorResult(`Unknown tool: ${request.params.name}`); + } + return call(tool, request.params.arguments ?? {}); + }); +} + +/** + * Calls `tool`: builds its request, sends it, and returns the response as the + * result. A response that isn't 2xx is a result with `isError: true` rather + * than a protocol error, so the model sees what the API said. + */ +export async function callTool(tool: Tool, args: Args, context: CallContext): Promise { + let request: Request; + try { + request = buildRequest(tool, args, context.baseUrl); + } catch (err) { + if (err instanceof InvalidArguments) { + return errorResult(err.message); + } + throw err; + } + for (const [name, value] of new Headers(context.headers)) { + request.headers.set(name, value); + } + const response = await (context.fetch ?? fetch)(request); + const body = await readBody(response); + const text = (context.formatResult ?? defaultFormat)(body, response); + return response.ok ? { content: [{ type: 'text', text }] } : errorResult(text); +} + +/** + * Returns the body of `response`: parsed JSON, text, or for anything else a + * sentence saying what it was, since a tool result can't carry the bytes. + */ +export async function readBody(response: Response): Promise { + const type = response.headers.get('Content-Type') ?? ''; + if (/json/i.test(type)) { + const text = await response.text(); + try { + return text ? JSON.parse(text) : text; + } catch { + return text; + } + } + if (type === '' || /^text\/|xml|javascript|yaml|csv/i.test(type)) { + return response.text(); + } + const size = (await response.arrayBuffer()).byteLength; + return `The response is ${size} bytes of ${type}, which this tool can't show.`; +} + +function defaultFormat(body: unknown, response: Response): string { + const text = typeof body === 'string' ? body : JSON.stringify(body, null, 2); + return response.ok ? text : `${response.status} ${response.statusText}\n${text}`.trim(); +} + +function errorResult(text: string): CallToolResult { + return { content: [{ type: 'text', text }], isError: true }; +} + +/** What {@link createHandler} serves. */ +export interface HandlerOptions { + readonly tools: readonly Tool[]; + /** The API's base URL. */ + readonly baseUrl: string; + readonly serverInfo: Implementation; + readonly instructions?: string; + /** + * Called before each MCP request is served. Returns the headers its API + * requests send, such as the caller's `Authorization`, or a response that + * refuses it. + */ + readonly authorize?: ( + request: Request, + ) => HeadersInit | Response | undefined | Promise; + readonly fetch?: (request: Request) => Promise; + readonly formatResult?: CallContext['formatResult']; +} + +/** + * Returns a `fetch` that serves `tools` over MCP's Streamable HTTP transport: + * for a Worker, or any server with web-standard requests. Each request gets a + * fresh, stateless server. + */ +export function createHandler(options: HandlerOptions): { fetch(request: Request): Promise } { + return { + async fetch(request) { + const authorized = options.authorize ? await options.authorize(request) : undefined; + if (authorized instanceof Response) { + return authorized; + } + const context: CallContext = { + baseUrl: options.baseUrl, + ...(authorized && { headers: authorized }), + ...(options.fetch && { fetch: options.fetch }), + ...(options.formatResult && { formatResult: options.formatResult }), + }; + const handler = createMcpHandler(() => { + const server = new McpServer( + options.serverInfo, + options.instructions ? { instructions: options.instructions } : {}, + ); + serveTools(server, options.tools, (tool, args) => callTool(tool, args, context)); + return server; + }); + return handler.fetch(request); + }, + }; +} diff --git a/src/generated/forge-mcp/_/tool.ts b/src/generated/forge-mcp/_/tool.ts new file mode 100644 index 00000000..3a31e9d8 --- /dev/null +++ b/src/generated/forge-mcp/_/tool.ts @@ -0,0 +1,183 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { Tool as McpTool } from '@modelcontextprotocol/server'; + +/** The arguments of a tool call, as the client sent them. */ +export type Args = Readonly>; + +/** A JSON Schema, as plain JSON. */ +export type JsonSchema = { readonly [key: string]: unknown }; + +/** The JSON Schema of a tool's arguments: always an object. */ +export type InputSchema = JsonSchema & { + readonly type: 'object'; + readonly properties?: { readonly [key: string]: JsonSchema }; + readonly required?: readonly string[]; +}; + +/** What a tool says about calling it. The hints describe the API method; they don't authorize anything. */ +export interface ToolAnnotations { + readonly title?: string; + readonly readOnlyHint: boolean; + readonly destructiveHint: boolean; + readonly idempotentHint: boolean; + readonly openWorldHint: boolean; +} + +/** A query parameter: its name, its value, and whether an array or object value is exploded. */ +export type QueryParam = readonly [name: string, value: unknown, explode: boolean]; + +/** A header parameter: its name and its value. */ +export type HeaderParam = readonly [name: string, value: unknown]; + +/** + * The request a tool call makes, relative to the API's base URL. The path has + * its parameters substituted and encoded; query and header values are + * serialized by {@link buildRequest}, which leaves out those that are + * `undefined` or `null`. + */ +export interface ApiRequest { + readonly path: string; + readonly query?: readonly QueryParam[]; + readonly headers?: readonly HeaderParam[]; + readonly body?: { readonly value: unknown; readonly mediaType: string }; +} + +/** + * A generated tool: what `tools/list` sends for it, and the code that makes + * its API request. + */ +export interface Tool { + readonly name: string; + readonly title?: string; + readonly description: string; + readonly inputSchema: InputSchema; + readonly annotations: ToolAnnotations; + /** The HTTP method of the API method, such as `GET`. */ + readonly method: string; + /** The path template of the API method, such as `/zones/{zone_id}`. */ + readonly path: string; + /** + * The OpenAPI extensions of the method's operation that forge doesn't read + * itself, such as `x-api-token-group`. For the server; clients never see them. + */ + readonly extensions?: { readonly [name: string]: unknown }; + /** Returns the API request for `args`. Throws {@link InvalidArguments}. */ + request(args: Args): ApiRequest; +} + +/** Arguments a tool can't be called with, such as a missing path parameter. */ +export class InvalidArguments extends Error { + override name = 'InvalidArguments'; +} + +/** + * Returns the argument `key`, for the path: a string, number or boolean, + * percent-encoded. Throws {@link InvalidArguments} when it is missing. + */ +export function pathParam(args: Args, key: string): string { + const value = args[key]; + if (value === undefined || value === null || value === '') { + throw new InvalidArguments(`Missing path parameter: ${key}`); + } + return encodeURIComponent(scalar(key, value)); +} + +/** + * Returns the HTTP request that calling `tool` with `args` makes, at + * `baseUrl`. Query parameters are serialized in OpenAPI's default `form` + * style. Values are not validated against the schema; the API does that. + */ +export function buildRequest(tool: Tool, args: Args, baseUrl: string): Request { + const missing = (tool.inputSchema.required ?? []).filter((key) => args[key] === undefined); + if (missing.length > 0) { + throw new InvalidArguments(`Missing required arguments: ${missing.join(', ')}`); + } + const api = tool.request(args); + const url = new URL(baseUrl.replace(/\/+$/, '') + api.path); + for (const [name, value, explode] of api.query ?? []) { + appendQuery(url.searchParams, name, value, explode); + } + const headers = new Headers({ Accept: 'application/json' }); + for (const [name, value] of api.headers ?? []) { + if (value !== undefined && value !== null) { + headers.set(name, Array.isArray(value) ? value.map((item) => scalar(name, item)).join(',') : scalar(name, value)); + } + } + const init: RequestInit = { method: tool.method, headers }; + if (api.body && api.body.value !== undefined) { + headers.set('Content-Type', api.body.mediaType); + init.body = JSON.stringify(api.body.value); + } + return new Request(url, init); +} + +/** Appends a query parameter in the `form` style: `a=1&a=2` exploded, `a=1,2` not. */ +function appendQuery(query: URLSearchParams, name: string, value: unknown, explode: boolean): void { + if (value === undefined || value === null) { + return; + } + if (Array.isArray(value)) { + const items = value.map((item) => scalar(name, item)); + if (explode) { + for (const item of items) { + query.append(name, item); + } + } else { + query.append(name, items.join(',')); + } + return; + } + if (typeof value === 'object') { + const entries = Object.entries(value).filter(([, item]) => item !== undefined && item !== null); + if (explode) { + for (const [key, item] of entries) { + query.append(key, scalar(name, item)); + } + } else { + query.append(name, entries.flatMap(([key, item]) => [key, scalar(name, item)]).join(',')); + } + return; + } + query.append(name, scalar(name, value)); +} + +function scalar(name: string, value: unknown): string { + if (typeof value === 'string') { + return value; + } + if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') { + return String(value); + } + throw new InvalidArguments(`${name} must be a string, number or boolean`); +} + +const listings = new WeakMap(); +const indexes = new WeakMap>(); + +/** + * Returns `tools` as `tools/list` sends them, without their request code, + * method, path and extensions. It is built once for each array of tools, and + * the same array every time after. + */ +export function listTools(tools: readonly Tool[]): readonly McpTool[] { + let listing = listings.get(tools); + if (!listing) { + listing = tools.map( + ({ request: _request, method: _method, path: _path, extensions: _extensions, ...tool }) => tool as McpTool, + ); + listings.set(tools, listing); + } + return listing; +} + +/** Returns `tools` by name. It is built once for each array of tools. */ +export function toolsByName(tools: readonly Tool[]): ReadonlyMap { + let index = indexes.get(tools); + if (!index) { + index = new Map(tools.map((tool) => [tool.name, tool])); + indexes.set(tools, index); + } + return index; +} diff --git a/src/generated/forge-mcp/abuseReports/appeals/tools.ts b/src/generated/forge-mcp/abuseReports/appeals/tools.ts new file mode 100644 index 00000000..f287165e --- /dev/null +++ b/src/generated/forge-mcp/abuseReports/appeals/tools.ts @@ -0,0 +1,50 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `abuse_reports.appeals`. + */ +export const tools: readonly Tool[] = [ + { + name: "abuse_reports_appeals_eligibility", + title: "Check whether a report can be appealed", + description: "Returns whether the report is currently appealable, along with the signals behind that decision: whether it already has an open appeal, how many appeals have been submitted against it, and whether it has at least one mitigation that an appeal could reverse.\nReport-level appeals are currently available only for DMCA (copyright) reports. For other report types this operation returns the same `404 Report not found` response as a report that does not exist for the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID", + "type": "string" + }, + "report_id": { + "description": "Abuse Report ID", + "type": "string" + } + }, + required: [ + "account_id", + "report_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Check whether a report can be appealed" + }, + method: "GET", + path: "/accounts/{account_id}/abuse-reports/{report_id}/appeals/eligibility", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/abuse-reports/${pathParam(args, "report_id")}/appeals/eligibility`, + }), + }, +]; diff --git a/src/generated/forge-mcp/abuseReports/emails/tools.ts b/src/generated/forge-mcp/abuseReports/emails/tools.ts new file mode 100644 index 00000000..810c983a --- /dev/null +++ b/src/generated/forge-mcp/abuseReports/emails/tools.ts @@ -0,0 +1,114 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `abuse_reports.emails`. + */ +export const tools: readonly Tool[] = [ + { + name: "abuse_reports_emails_list", + title: "List abuse report emails", + description: "List emails sent to the customer for an abuse report. Returns all successful customer emails sent for the specified abuse report. Does not include emails sent to hosts or submitters.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID", + "type": "string" + }, + "page": { + "description": "Page number to retrieve (default 1)", + "type": "integer" + }, + "per_page": { + "description": "Number of emails per page (default 20, max 100)", + "type": "integer" + }, + "report_id": { + "description": "Abuse Report ID", + "type": "string" + } + }, + required: [ + "account_id", + "report_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List abuse report emails" + }, + method: "GET", + path: "/accounts/{account_id}/abuse-reports/{report_id}/emails", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/abuse-reports/${pathParam(args, "report_id")}/emails`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, + { + name: "abuse_reports_emails_list_submitted", + title: "List emails sent to an abuse report submitter", + description: "List successful emails sent to the submitter of a report submitted by the account. Does not include emails sent to customers or hosts.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID", + "type": "string" + }, + "page": { + "description": "Page number to retrieve (default 1).", + "type": "integer" + }, + "per_page": { + "description": "Number of emails per page (default 20, max 100).", + "type": "integer" + }, + "report_id": { + "description": "Public report code.", + "type": "string" + } + }, + required: [ + "account_id", + "report_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List emails sent to an abuse report submitter" + }, + method: "GET", + path: "/accounts/{account_id}/abuse-reports/submitted/{report_id}/emails", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/abuse-reports/submitted/${pathParam(args, "report_id")}/emails`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/abuseReports/mitigations/schemas.ts b/src/generated/forge-mcp/abuseReports/mitigations/schemas.ts new file mode 100644 index 00000000..06a81f34 --- /dev/null +++ b/src/generated/forge-mcp/abuseReports/mitigations/schemas.ts @@ -0,0 +1,165 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `abuse-reports_AppealReason`. + */ +export const abuse_reports_AppealReason: JsonSchema = { + "description": "Reason why the customer is appealing.", + "enum": [ + "removed", + "misclassified" + ], + "type": "string" +}; + +/** + * The schema of `abuse-reports_AppealType`. + */ +export const abuse_reports_AppealType: JsonSchema = { + "description": "The type of appeal being submitted.", + "enum": [ + "counter_notice", + "content_removed" + ], + "type": "string" +}; + +/** + * The schema of `abuse-reports_DMCACounterNotice`. + */ +export const abuse_reports_DMCACounterNotice: JsonSchema = { + "description": "Counter-notice details supporting an appeal.", + "properties": { + "city": { + "type": "string" + }, + "company": { + "type": "string" + }, + "counter_notice_response": { + "type": "string" + }, + "country": { + "type": "string" + }, + "email": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "jurisdiction_consent": { + "type": "boolean" + }, + "perjury_attestation": { + "type": "boolean" + }, + "phone_number": { + "type": "string" + }, + "signature": { + "type": "string" + }, + "state": { + "type": "string" + }, + "street_address": { + "type": "string" + }, + "urls": { + "items": { + "type": "string" + }, + "type": "array" + }, + "zip_code": { + "type": "string" + } + }, + "required": [ + "city", + "country", + "email", + "full_name", + "jurisdiction_consent", + "perjury_attestation", + "phone_number", + "signature", + "state", + "street_address", + "urls", + "zip_code" + ], + "type": "object" +}; + +/** + * The schema of `abuse-reports_MitigatedEntityType`. + */ +export const abuse_reports_MitigatedEntityType: JsonSchema = { + "description": "The type of entity targeted by a mitigation.", + "enum": [ + "url_pattern", + "account", + "zone", + "custom_expression" + ], + "type": "string" +}; + +/** + * The schema of `abuse-reports_MitigationAppeal`. + */ +export const abuse_reports_MitigationAppeal: JsonSchema = { + "properties": { + "id": { + "description": "ID of the mitigation to appeal.", + "type": "string" + }, + "reason": { + "$ref": "#/$defs/abuse-reports_AppealReason", + "description": "Reason why the customer is appealing." + } + }, + "required": [ + "id", + "reason" + ], + "type": "object" +}; + +/** + * The schema of `abuse-reports_MitigationAppealRequest`. + */ +export const abuse_reports_MitigationAppealRequest: JsonSchema = { + "description": "Submit an appeal for a report. Provide either a list of mitigations to appeal, or an appeal type with its supporting details, but not both. When type is \"counter_notice\", the counter-notice details are required.", + "properties": { + "appeals": { + "description": "List of mitigations to appeal.", + "items": { + "$ref": "#/$defs/abuse-reports_MitigationAppeal" + }, + "type": "array" + }, + "data": { + "$ref": "#/$defs/abuse-reports_DMCACounterNotice", + "description": "Counter-notice details supporting an appeal." + }, + "type": { + "$ref": "#/$defs/abuse-reports_AppealType", + "description": "The type of appeal being submitted." + } + }, + "type": "object" +}; + +/** + * The schema of `abuse-reports_MitigationType`. + */ +export const abuse_reports_MitigationType: JsonSchema = { + "description": "The type of mitigation applied to a reported entity.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/abuseReports/mitigations/tools.ts b/src/generated/forge-mcp/abuseReports/mitigations/tools.ts new file mode 100644 index 00000000..5c8fecca --- /dev/null +++ b/src/generated/forge-mcp/abuseReports/mitigations/tools.ts @@ -0,0 +1,168 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { abuse_reports_MitigationStatus } from "../schemas.js"; +import { + abuse_reports_AppealReason, + abuse_reports_AppealType, + abuse_reports_DMCACounterNotice, + abuse_reports_MitigatedEntityType, + abuse_reports_MitigationAppeal, + abuse_reports_MitigationAppealRequest, + abuse_reports_MitigationType, +} from "./schemas.js"; + +/** + * The tools of `abuse_reports.mitigations`. + */ +export const tools: readonly Tool[] = [ + { + name: "abuse_reports_mitigations_list", + title: "List abuse report mitigations", + description: "List mitigations done to remediate the abuse report.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID", + "type": "string" + }, + "effective_after": { + "description": "Returns mitigation that were dispatched after the given date", + "type": "string" + }, + "effective_before": { + "description": "Returns mitigations that were dispatched before the given date", + "type": "string" + }, + "entity_type": { + "$ref": "#/$defs/abuse-reports_MitigatedEntityType", + "description": "Filter by the type of entity the mitigation impacts." + }, + "page": { + "description": "Where in pagination to start listing abuse reports", + "type": "integer" + }, + "per_page": { + "description": "How many abuse reports per page to list", + "type": "integer" + }, + "report_id": { + "description": "Abuse Report ID", + "type": "string" + }, + "sort": { + "description": "A property to sort by, followed by the order", + "enum": [ + "type,asc", + "type,desc", + "effective_date,asc", + "effective_date,desc", + "status,asc", + "status,desc", + "entity_type,asc", + "entity_type,desc" + ], + "type": "string" + }, + "status": { + "$ref": "#/$defs/abuse-reports_MitigationStatus", + "description": "Filter by the status of the mitigation." + }, + "type": { + "$ref": "#/$defs/abuse-reports_MitigationType", + "description": "Filter by the type of mitigation. This filter parameter can be specified multiple times to include multiple types of mitigations in the result set." + } + }, + required: [ + "account_id", + "report_id" + ], + $defs: { + "abuse-reports_MitigatedEntityType": abuse_reports_MitigatedEntityType, + "abuse-reports_MitigationStatus": abuse_reports_MitigationStatus, + "abuse-reports_MitigationType": abuse_reports_MitigationType, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List abuse report mitigations" + }, + method: "GET", + path: "/accounts/{account_id}/abuse-reports/{report_id}/mitigations", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/abuse-reports/${pathParam(args, "report_id")}/mitigations`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["sort", args["sort"], true], + ["type", args["type"], true], + ["effective_before", args["effective_before"], true], + ["effective_after", args["effective_after"], true], + ["status", args["status"], true], + ["entity_type", args["entity_type"], true], + ], + }), + }, + { + name: "abuse_reports_mitigations_review", + title: "Request review on mitigations", + description: "Request a review of mitigations applied because of an abuse report, or submit a report-level appeal.\n\n- To request a review of specific mitigations, send `appeals` with the mitigation IDs and reasons. Repeating a request for a mitigation with an unresolved appeal is idempotent and returns that mitigation in the in-review state.\n- To submit a report-level appeal, send `type` and, for a `counter_notice`, the counter-notice details in `data`. Report-level appeals are currently available only for DMCA (copyright) reports.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID", + "type": "string" + }, + "body": { + "$ref": "#/$defs/abuse-reports_MitigationAppealRequest" + }, + "report_id": { + "description": "Abuse Report ID", + "type": "string" + } + }, + required: [ + "account_id", + "report_id", + "body" + ], + $defs: { + "abuse-reports_AppealReason": abuse_reports_AppealReason, + "abuse-reports_AppealType": abuse_reports_AppealType, + "abuse-reports_DMCACounterNotice": abuse_reports_DMCACounterNotice, + "abuse-reports_MitigationAppeal": abuse_reports_MitigationAppeal, + "abuse-reports_MitigationAppealRequest": abuse_reports_MitigationAppealRequest, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Request review on mitigations" + }, + method: "POST", + path: "/accounts/{account_id}/abuse-reports/{report_id}/mitigations/appeal", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/abuse-reports/${pathParam(args, "report_id")}/mitigations/appeal`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/abuseReports/schemas.ts b/src/generated/forge-mcp/abuseReports/schemas.ts new file mode 100644 index 00000000..d965668f --- /dev/null +++ b/src/generated/forge-mcp/abuseReports/schemas.ts @@ -0,0 +1,928 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../_/index.js"; + +/** + * The schema of `abuse-reports_CSAMReport`. + */ +export const abuse_reports_CSAMReport: JsonSchema = { + "properties": { + "act": { + "enum": [ + "abuse_children" + ], + "type": "string" + }, + "comments": { + "description": "Any additional comments about the infringement not exceeding 2000 characters. Comments are kept internal to Cloudflare and not shared with the host or customer as part of regular processing. For delegated reports, comments may be shared in full.", + "type": "string" + }, + "company": { + "description": "Text not exceeding 100 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "country": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).\n", + "type": "string" + }, + "email": { + "description": "A valid email of the abuse reporter. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email2": { + "description": "Should match the value provided in `email`", + "type": "string" + }, + "host_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon" + ], + "type": "string" + }, + "justification": { + "description": "A detailed description of the infringement, including any necessary access details and the exact steps needed to view the content, not exceeding 5000 characters.\n", + "type": "string" + }, + "name": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "ncmec_notification": { + "description": "Notification type based on the abuse type. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon" + ], + "type": "string" + }, + "owner_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon", + "none" + ], + "type": "string" + }, + "reported_country": { + "description": "Text containing 2 characters", + "type": "string" + }, + "reported_user_agent": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "tele": { + "description": "Text not exceeding 20 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "title": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "urls": { + "description": "A list of valid URLs separated by ‘\\n’ (new line character). The list of the URLs should not exceed 250 URLs. All URLs should have the same hostname. Each URL should be unique. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + } + }, + "required": [ + "act", + "email", + "email2", + "name", + "urls", + "host_notification", + "justification", + "ncmec_notification", + "owner_notification" + ], + "type": "object" +}; + +/** + * The schema of `abuse-reports_DMCAReport`. + */ +export const abuse_reports_DMCAReport: JsonSchema = { + "properties": { + "act": { + "enum": [ + "abuse_dmca" + ], + "type": "string" + }, + "address1": { + "description": "Text not exceeding 100 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "agent_name": { + "description": "The name of the copyright holder. Text not exceeding 60 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "agree": { + "description": "Can be `0` for false or `1` for true. Must be value: 1 for DMCA reports", + "enum": [ + 1 + ], + "type": "integer" + }, + "city": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "comments": { + "description": "Any additional comments about the infringement not exceeding 2000 characters. Comments are kept internal to Cloudflare and not shared with the host or customer as part of regular processing. For delegated reports, comments may be shared in full.", + "type": "string" + }, + "company": { + "description": "Text not exceeding 100 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "country": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).\n", + "type": "string" + }, + "email": { + "description": "A valid email of the abuse reporter. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email2": { + "description": "Should match the value provided in `email`", + "type": "string" + }, + "host_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send" + ], + "type": "string" + }, + "name": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "original_work": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).\n", + "type": "string" + }, + "owner_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send" + ], + "type": "string" + }, + "reported_country": { + "description": "Text containing 2 characters", + "type": "string" + }, + "reported_user_agent": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "signature": { + "description": "Required for DMCA reports, should be same as Name. An affirmation that all information in the report is true and accurate while agreeing to the policies of Cloudflare's abuse reports", + "type": "string" + }, + "state": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "tele": { + "description": "Text not exceeding 20 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "title": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "urls": { + "description": "A list of valid URLs separated by ‘\\n’ (new line character). The list of the URLs should not exceed 250 URLs. All URLs should have the same hostname. Each URL should be unique. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + } + }, + "required": [ + "act", + "email", + "email2", + "name", + "urls", + "address1", + "agent_name", + "agree", + "city", + "country", + "host_notification", + "original_work", + "owner_notification", + "signature", + "state" + ], + "type": "object" +}; + +/** + * The schema of `abuse-reports_GeneralReport`. + */ +export const abuse_reports_GeneralReport: JsonSchema = { + "properties": { + "act": { + "enum": [ + "abuse_general" + ], + "type": "string" + }, + "comments": { + "description": "Any additional comments about the infringement not exceeding 2000 characters. Comments are kept internal to Cloudflare and not shared with the host or customer as part of regular processing. For delegated reports, comments may be shared in full.", + "type": "string" + }, + "company": { + "description": "Text not exceeding 100 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "destination_ips": { + "description": "A list of IP addresses separated by ‘\\n’ (new line character). The list of destination IPs should not exceed 30 IP addresses. Each one of the IP addresses ought to be unique.", + "type": "string" + }, + "email": { + "description": "A valid email of the abuse reporter. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email2": { + "description": "Should match the value provided in `email`", + "type": "string" + }, + "host_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon" + ], + "type": "string" + }, + "justification": { + "description": "A detailed description of the infringement, including any necessary access details and the exact steps needed to view the content, not exceeding 5000 characters.\n", + "type": "string" + }, + "name": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "owner_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon" + ], + "type": "string" + }, + "ports_protocols": { + "description": "A comma separated list of ports and protocols e.g. 80/TCP, 22/UDP. The total size of the field should not exceed 2000 characters. Each individual port/protocol should not exceed 100 characters. The list should not have more than 30 unique ports and protocols.", + "type": "string" + }, + "reported_country": { + "description": "Text containing 2 characters", + "type": "string" + }, + "reported_user_agent": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "source_ips": { + "description": "A list of IP addresses separated by ‘\\n’ (new line character). The list of source IPs should not exceed 30 IP addresses. Each one of the IP addresses ought to be unique.", + "type": "string" + }, + "tele": { + "description": "Text not exceeding 20 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "title": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "urls": { + "description": "A list of valid URLs separated by ‘\\n’ (new line character). The list of the URLs should not exceed 250 URLs. All URLs should have the same hostname. Each URL should be unique. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + } + }, + "required": [ + "act", + "email", + "email2", + "name", + "urls", + "host_notification", + "justification", + "owner_notification" + ], + "type": "object" +}; + +/** + * The schema of `abuse-reports_MitigationStatus`. + */ +export const abuse_reports_MitigationStatus: JsonSchema = { + "description": "The status of a mitigation", + "enum": [ + "pending", + "active", + "in_review", + "cancelled", + "removed" + ], + "type": "string" +}; + +/** + * The schema of `abuse-reports_NCSEIReport`. + */ +export const abuse_reports_NCSEIReport: JsonSchema = { + "properties": { + "act": { + "enum": [ + "abuse_ncsei" + ], + "type": "string" + }, + "comments": { + "description": "Any additional comments about the infringement not exceeding 2000 characters. Comments are kept internal to Cloudflare and not shared with the host or customer as part of regular processing. For delegated reports, comments may be shared in full.", + "type": "string" + }, + "company": { + "description": "Text not exceeding 100 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "country": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).\n", + "type": "string" + }, + "email": { + "description": "A valid email of the abuse reporter. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email2": { + "description": "Should match the value provided in `email`", + "type": "string" + }, + "host_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon" + ], + "type": "string" + }, + "name": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "ncsei_subject_representation": { + "description": "If the submitter is the target of NCSEI in the URLs of the abuse report.", + "type": "boolean" + }, + "owner_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon", + "none" + ], + "type": "string" + }, + "reported_country": { + "description": "Text containing 2 characters", + "type": "string" + }, + "reported_user_agent": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "tele": { + "description": "Text not exceeding 20 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "title": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "urls": { + "description": "A list of valid URLs separated by ‘\\n’ (new line character). The list of the URLs should not exceed 250 URLs. All URLs should have the same hostname. Each URL should be unique. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + } + }, + "required": [ + "act", + "email", + "email2", + "name", + "urls", + "host_notification", + "ncsei_subject_representation", + "owner_notification" + ], + "type": "object" +}; + +/** + * The schema of `abuse-reports_PhishingReport`. + */ +export const abuse_reports_PhishingReport: JsonSchema = { + "properties": { + "act": { + "enum": [ + "abuse_phishing" + ], + "type": "string" + }, + "comments": { + "description": "Any additional comments about the infringement not exceeding 2000 characters. Comments are kept internal to Cloudflare and not shared with the host or customer as part of regular processing. For delegated reports, comments may be shared in full.", + "type": "string" + }, + "company": { + "description": "Text not exceeding 100 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email": { + "description": "A valid email of the abuse reporter. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email2": { + "description": "Should match the value provided in `email`", + "type": "string" + }, + "host_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon" + ], + "type": "string" + }, + "justification": { + "description": "A detailed description of the infringement, including any necessary access details and the exact steps needed to view the content, not exceeding 5000 characters.\n", + "type": "string" + }, + "name": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "original_work": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).\n", + "type": "string" + }, + "owner_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon" + ], + "type": "string" + }, + "reported_country": { + "description": "Text containing 2 characters", + "type": "string" + }, + "reported_user_agent": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "tele": { + "description": "Text not exceeding 20 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "title": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "urls": { + "description": "A list of valid URLs separated by ‘\\n’ (new line character). The list of the URLs should not exceed 250 URLs. All URLs should have the same hostname. Each URL should be unique. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + } + }, + "required": [ + "act", + "email", + "email2", + "name", + "urls", + "host_notification", + "justification", + "owner_notification" + ], + "type": "object" +}; + +/** + * The schema of `abuse-reports_RegistrarWhoIsFields`. + */ +export const abuse_reports_RegistrarWhoIsFields: JsonSchema = { + "description": "RDP-mandated fields for registrar WHOIS data disclosure requests.", + "properties": { + "reg_who_authorization_statement": { + "description": "Optional authorization statement or power of attorney per RDP 10.2.1.3.", + "type": "string" + }, + "reg_who_good_faith_affirmation": { + "description": "Affirmation that the request is made in good faith per RDP 10.2.4. Must be true.", + "type": "boolean" + }, + "reg_who_lawful_processing_agreement": { + "description": "Agreement to process data lawfully per RDP 10.2.5. Must be true.", + "type": "boolean" + }, + "reg_who_legal_basis": { + "description": "Legal rights and rationale for the request per RDP 10.2.3. Required for all WHOIS requests.", + "type": "string" + }, + "reg_who_request_type": { + "description": "The type of WHOIS data request per RDP procedure.", + "enum": [ + "disclosure", + "invalid_whois" + ], + "type": "string" + }, + "reg_who_requested_data_elements": { + "description": "The specific WHOIS data elements being requested per RDP 10.2.2. Required for all WHOIS requests.", + "items": { + "enum": [ + "registrant_name", + "registrant_organization", + "registrant_email", + "registrant_phone", + "registrant_address", + "registrant_address_country", + "registrant_address_postal_code", + "admin_name", + "admin_organization", + "admin_email", + "admin_phone", + "admin_address", + "tech_name", + "tech_organization", + "tech_email", + "tech_phone", + "tech_address" + ], + "type": "string" + }, + "maxItems": 17, + "minItems": 1, + "type": "array" + }, + "reg_who_requestor_type": { + "description": "The nature of the requestor per RDP 10.2.1.2.", + "enum": [ + "government", + "corporation", + "individual" + ], + "type": "string" + } + }, + "required": [ + "reg_who_good_faith_affirmation", + "reg_who_lawful_processing_agreement", + "reg_who_legal_basis", + "reg_who_request_type", + "reg_who_requested_data_elements" + ], + "type": "object" +}; + +/** + * The schema of `abuse-reports_RegistrarWhoisReport`. + */ +export const abuse_reports_RegistrarWhoisReport: JsonSchema = { + "properties": { + "act": { + "enum": [ + "abuse_registrar_whois" + ], + "type": "string" + }, + "comments": { + "description": "Any additional comments about the infringement not exceeding 2000 characters. Comments are kept internal to Cloudflare and not shared with the host or customer as part of regular processing. For delegated reports, comments may be shared in full.", + "type": "string" + }, + "company": { + "description": "Text not exceeding 100 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email": { + "description": "A valid email of the abuse reporter. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email2": { + "description": "Should match the value provided in `email`", + "type": "string" + }, + "name": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "owner_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon", + "none" + ], + "type": "string" + }, + "reg_who_request": { + "$ref": "#/$defs/abuse-reports_RegistrarWhoIsFields", + "description": "RDP-mandated fields for registrar WHOIS data disclosure requests." + }, + "reported_country": { + "description": "Text containing 2 characters", + "type": "string" + }, + "reported_user_agent": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "tele": { + "description": "Text not exceeding 20 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "title": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "urls": { + "description": "A list of valid URLs separated by ‘\\n’ (new line character). The list of the URLs should not exceed 250 URLs. All URLs should have the same hostname. Each URL should be unique. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + } + }, + "required": [ + "act", + "email", + "email2", + "name", + "urls", + "owner_notification" + ], + "type": "object" +}; + +/** + * The schema of `abuse-reports_ReportStatus`. + */ +export const abuse_reports_ReportStatus: JsonSchema = { + "description": "An enum value that represents the status of an abuse record", + "enum": [ + "accepted", + "in_review" + ], + "type": "string" +}; + +/** + * The schema of `abuse-reports_ReportType`. + */ +export const abuse_reports_ReportType: JsonSchema = { + "description": "The abuse report type", + "enum": [ + "PHISH", + "GEN", + "THREAT", + "DMCA", + "EMER", + "TM", + "REG_WHO", + "NCSEI", + "NETWORK" + ], + "type": "string" +}; + +/** + * The schema of `abuse-reports_SubmitReportRequest`. + */ +export const abuse_reports_SubmitReportRequest: JsonSchema = { + "oneOf": [ + { + "$ref": "#/$defs/abuse-reports_DMCAReport" + }, + { + "$ref": "#/$defs/abuse-reports_TrademarkReport" + }, + { + "$ref": "#/$defs/abuse-reports_GeneralReport" + }, + { + "$ref": "#/$defs/abuse-reports_PhishingReport" + }, + { + "$ref": "#/$defs/abuse-reports_CSAMReport" + }, + { + "$ref": "#/$defs/abuse-reports_ThreatReport" + }, + { + "$ref": "#/$defs/abuse-reports_RegistrarWhoisReport" + }, + { + "$ref": "#/$defs/abuse-reports_NCSEIReport" + } + ] +}; + +/** + * The schema of `abuse-reports_SubmittedAbuseReportStatus`. + */ +export const abuse_reports_SubmittedAbuseReportStatus: JsonSchema = { + "description": "Status visible to the account that submitted the report.", + "enum": [ + "submitted", + "accepted", + "denied" + ], + "type": "string" +}; + +/** + * The schema of `abuse-reports_ThreatReport`. + */ +export const abuse_reports_ThreatReport: JsonSchema = { + "properties": { + "act": { + "enum": [ + "abuse_threat" + ], + "type": "string" + }, + "comments": { + "description": "Any additional comments about the infringement not exceeding 2000 characters. Comments are kept internal to Cloudflare and not shared with the host or customer as part of regular processing. For delegated reports, comments may be shared in full.", + "type": "string" + }, + "company": { + "description": "Text not exceeding 100 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email": { + "description": "A valid email of the abuse reporter. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email2": { + "description": "Should match the value provided in `email`", + "type": "string" + }, + "host_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon" + ], + "type": "string" + }, + "justification": { + "description": "A detailed description of the infringement, including any necessary access details and the exact steps needed to view the content, not exceeding 5000 characters.\n", + "type": "string" + }, + "name": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "owner_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send", + "send-anon" + ], + "type": "string" + }, + "reported_country": { + "description": "Text containing 2 characters", + "type": "string" + }, + "reported_user_agent": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "tele": { + "description": "Text not exceeding 20 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "title": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "urls": { + "description": "A list of valid URLs separated by ‘\\n’ (new line character). The list of the URLs should not exceed 250 URLs. All URLs should have the same hostname. Each URL should be unique. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + } + }, + "required": [ + "act", + "email", + "email2", + "name", + "urls", + "host_notification", + "justification", + "owner_notification" + ], + "type": "object" +}; + +/** + * The schema of `abuse-reports_TrademarkReport`. + */ +export const abuse_reports_TrademarkReport: JsonSchema = { + "properties": { + "act": { + "enum": [ + "abuse_trademark" + ], + "type": "string" + }, + "comments": { + "description": "Any additional comments about the infringement not exceeding 2000 characters. Comments are kept internal to Cloudflare and not shared with the host or customer as part of regular processing. For delegated reports, comments may be shared in full.", + "type": "string" + }, + "company": { + "description": "Text not exceeding 100 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email": { + "description": "A valid email of the abuse reporter. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "email2": { + "description": "Should match the value provided in `email`", + "type": "string" + }, + "host_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send" + ], + "type": "string" + }, + "justification": { + "description": "A detailed description of the infringement, including any necessary access details and the exact steps needed to view the content, not exceeding 5000 characters.\n", + "type": "string" + }, + "name": { + "description": "Text not exceeding 255 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "owner_notification": { + "description": "Notification type based on the abuse type. For delegated reports, the report—including contact information and comments—will be forwarded to the customer in full regardless of this value. NOTE: Copyright (DMCA) and Trademark reports cannot be anonymous.\n", + "enum": [ + "send" + ], + "type": "string" + }, + "reported_country": { + "description": "Text containing 2 characters", + "type": "string" + }, + "reported_user_agent": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "tele": { + "description": "Text not exceeding 20 characters. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + }, + "title": { + "description": "Text not exceeding 255 characters", + "type": "string" + }, + "trademark_number": { + "description": "Text not exceeding 1000 characters", + "type": "string" + }, + "trademark_office": { + "description": "Text not exceeding 1000 characters", + "type": "string" + }, + "trademark_symbol": { + "description": "Text not exceeding 1000 characters", + "type": "string" + }, + "urls": { + "description": "A list of valid URLs separated by ‘\\n’ (new line character). The list of the URLs should not exceed 250 URLs. All URLs should have the same hostname. Each URL should be unique. This field may be released by Cloudflare to third parties such as the Lumen Database (https://lumendatabase.org/).", + "type": "string" + } + }, + "required": [ + "act", + "email", + "email2", + "name", + "urls", + "host_notification", + "justification", + "owner_notification", + "trademark_number", + "trademark_office", + "trademark_symbol" + ], + "type": "object" +}; diff --git a/src/generated/forge-mcp/abuseReports/tools.ts b/src/generated/forge-mcp/abuseReports/tools.ts new file mode 100644 index 00000000..9a8b460e --- /dev/null +++ b/src/generated/forge-mcp/abuseReports/tools.ts @@ -0,0 +1,353 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; +import { + abuse_reports_CSAMReport, + abuse_reports_DMCAReport, + abuse_reports_GeneralReport, + abuse_reports_MitigationStatus, + abuse_reports_NCSEIReport, + abuse_reports_PhishingReport, + abuse_reports_RegistrarWhoIsFields, + abuse_reports_RegistrarWhoisReport, + abuse_reports_ReportStatus, + abuse_reports_ReportType, + abuse_reports_SubmitReportRequest, + abuse_reports_SubmittedAbuseReportStatus, + abuse_reports_ThreatReport, + abuse_reports_TrademarkReport, +} from "./schemas.js"; + +/** + * The tools of `abuse_reports`. + */ +export const tools: readonly Tool[] = [ + { + name: "abuse_reports_create", + title: "Submit an abuse report", + description: "Submit an abuse report of a particular type.\n\nRequires the abuse-reports entitlement on the account (Enterprise\naccounts have it by default; other accounts must request access) and an\nAPI token with the `Trust and Safety Write` permission. If the account\nis not entitled, the request is rejected with an HTTP `401` response\n(see below).\n\nDelegated reports: In limited circumstances, Cloudflare works with\nselect customers who have established abuse-handling programs. For\nthese customers, Cloudflare may forward abuse reports directly and in\nfull—including reporter contact information, comments, and supporting\nevidence—without redaction or preprocessing by Cloudflare. This allows\nthe customer to investigate and respond using their own policies and\nprocesses. For delegated reports, the report—including contact\ninformation and comments—will be forwarded to the customer in full\nregardless of the `host_notification` and `owner_notification` values.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID", + "type": "string" + }, + "body": { + "$ref": "#/$defs/abuse-reports_SubmitReportRequest" + }, + "report_type": { + "description": "The report type to be submitted. Example: abuse_general", + "type": "string" + } + }, + required: [ + "account_id", + "report_type", + "body" + ], + $defs: { + "abuse-reports_CSAMReport": abuse_reports_CSAMReport, + "abuse-reports_DMCAReport": abuse_reports_DMCAReport, + "abuse-reports_GeneralReport": abuse_reports_GeneralReport, + "abuse-reports_NCSEIReport": abuse_reports_NCSEIReport, + "abuse-reports_PhishingReport": abuse_reports_PhishingReport, + "abuse-reports_RegistrarWhoIsFields": abuse_reports_RegistrarWhoIsFields, + "abuse-reports_RegistrarWhoisReport": abuse_reports_RegistrarWhoisReport, + "abuse-reports_SubmitReportRequest": abuse_reports_SubmitReportRequest, + "abuse-reports_ThreatReport": abuse_reports_ThreatReport, + "abuse-reports_TrademarkReport": abuse_reports_TrademarkReport, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Submit an abuse report" + }, + method: "POST", + path: "/accounts/{account_id}/abuse-reports/{report_param}", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/abuse-reports/${pathParam(args, "report_type")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "abuse_reports_get", + title: "Get an abuse report against the account", + description: "Retrieve the details of an abuse report made against a domain or other content associated with the account. To retrieve a report that the account submitted, use the submitted abuse report endpoint instead.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID", + "type": "string" + }, + "report_id": { + "description": "Public report ID.", + "type": "string" + } + }, + required: [ + "account_id", + "report_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get an abuse report against the account" + }, + method: "GET", + path: "/accounts/{account_id}/abuse-reports/{report_param}", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/abuse-reports/${pathParam(args, "report_id")}`, + }), + }, + { + name: "abuse_reports_get_submitted", + title: "Get a submitted abuse report", + description: "Retrieve a report submitted by the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID", + "type": "string" + }, + "report_id": { + "description": "Public report code.", + "type": "string" + } + }, + required: [ + "account_id", + "report_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a submitted abuse report" + }, + method: "GET", + path: "/accounts/{account_id}/abuse-reports/submitted/{report_id}", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/abuse-reports/submitted/${pathParam(args, "report_id")}`, + }), + }, + { + name: "abuse_reports_list", + title: "List abuse reports against the account", + description: "List abuse reports made against domains or other content associated with the account. To list reports that the account submitted, use the submitted abuse reports endpoint instead.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID", + "type": "string" + }, + "created_after": { + "description": "Returns reports created after the specified date", + "type": "string" + }, + "created_before": { + "description": "Returns reports created before the specified date", + "type": "string" + }, + "domain": { + "description": "Filter by domain name related to the abuse report", + "type": "string" + }, + "mitigation_status": { + "$ref": "#/$defs/abuse-reports_MitigationStatus", + "description": "Filter reports that have any mitigations in the given status." + }, + "page": { + "description": "Where in pagination to start listing abuse reports", + "type": "integer" + }, + "per_page": { + "description": "How many abuse reports per page to list", + "type": "integer" + }, + "search": { + "description": "Free-text search. Returns reports whose report ID starts with the term or whose domain contains the term, both case-insensitively. Surrounding whitespace is ignored, and an empty value is treated as absent. Combined with the other filters using AND.", + "type": "string" + }, + "sort": { + "description": "A property to sort by, followed by the order (id, cdate, domain, type, status)", + "type": "string" + }, + "status": { + "$ref": "#/$defs/abuse-reports_ReportStatus", + "description": "Filter by the status of the report." + }, + "type": { + "$ref": "#/$defs/abuse-reports_ReportType", + "description": "Filter by the type of the report." + } + }, + required: [ + "account_id" + ], + $defs: { + "abuse-reports_MitigationStatus": abuse_reports_MitigationStatus, + "abuse-reports_ReportStatus": abuse_reports_ReportStatus, + "abuse-reports_ReportType": abuse_reports_ReportType, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List abuse reports against the account" + }, + method: "GET", + path: "/accounts/{account_id}/abuse-reports", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/abuse-reports`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["sort", args["sort"], true], + ["search", args["search"], true], + ["domain", args["domain"], true], + ["created_before", args["created_before"], true], + ["created_after", args["created_after"], true], + ["status", args["status"], true], + ["type", args["type"], true], + ["mitigation_status", args["mitigation_status"], true], + ], + }), + }, + { + name: "abuse_reports_list_submitted", + title: "List submitted abuse reports", + description: "List abuse reports submitted by the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID", + "type": "string" + }, + "created_after": { + "description": "Return reports submitted after this time.", + "format": "date-time", + "type": "string" + }, + "created_before": { + "description": "Return reports submitted before this time.", + "format": "date-time", + "type": "string" + }, + "domain": { + "description": "Filter by reported domain. This parameter can be specified multiple times.", + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "description": "Filter by report code.", + "type": "string" + }, + "page": { + "default": 1, + "description": "Page of submitted reports to return.", + "type": "integer" + }, + "per_page": { + "default": 100, + "description": "Number of submitted reports per page.", + "type": "integer" + }, + "sort": { + "description": "A property and direction to sort by (id, cdate, domain, type, status).", + "type": "string" + }, + "status": { + "description": "Filter by submitter-facing status. This parameter can be specified multiple times.", + "items": { + "$ref": "#/$defs/abuse-reports_SubmittedAbuseReportStatus" + }, + "type": "array" + }, + "type": { + "description": "Filter by report type. This parameter can be specified multiple times.", + "items": { + "$ref": "#/$defs/abuse-reports_ReportType" + }, + "type": "array" + } + }, + required: [ + "account_id" + ], + $defs: { + "abuse-reports_ReportType": abuse_reports_ReportType, + "abuse-reports_SubmittedAbuseReportStatus": abuse_reports_SubmittedAbuseReportStatus, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List submitted abuse reports" + }, + method: "GET", + path: "/accounts/{account_id}/abuse-reports/submitted", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/abuse-reports/submitted`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["sort", args["sort"], true], + ["id", args["id"], true], + ["domain", args["domain"], true], + ["created_before", args["created_before"], true], + ["created_after", args["created_after"], true], + ["status", args["status"], true], + ["type", args["type"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/applications/schemas.ts b/src/generated/forge-mcp/accounts/applications/schemas.ts new file mode 100644 index 00000000..e385d714 --- /dev/null +++ b/src/generated/forge-mcp/accounts/applications/schemas.ts @@ -0,0 +1,201 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `alexandria_application_hostnames`. + */ +export const alexandria_application_hostnames: JsonSchema = { + "description": "Hostnames matched by the application.", + "items": { + "type": "string" + }, + "type": "array" +}; + +/** + * The schema of `alexandria_application_human_id`. + */ +export const alexandria_application_human_id: JsonSchema = { + "description": "Human-readable identifier for the application.", + "type": "string" +}; + +/** + * The schema of `alexandria_application_ip_subnets`. + */ +export const alexandria_application_ip_subnets: JsonSchema = { + "description": "IP subnets for this application. Custom application create and update requests accept IPv4 prefix lengths /8 through /32 and IPv6 prefix lengths /32 through /128.", + "items": { + "type": "string" + }, + "type": "array" +}; + +/** + * The schema of `alexandria_application_name`. + */ +export const alexandria_application_name: JsonSchema = { + "description": "Application name.", + "type": "string" +}; + +/** + * The schema of `alexandria_application_port_protocols`. + */ +export const alexandria_application_port_protocols: JsonSchema = { + "description": "Ports matched by the application, in `protocol/port` or inclusive `protocol/start-end` format (for example, `tcp/443` or `udp/10000-20000`). TCP and UDP ports must be between 0 and 65535.", + "items": { + "type": "string" + }, + "type": "array" +}; + +/** + * The schema of `alexandria_application_support_domains`. + */ +export const alexandria_application_support_domains: JsonSchema = { + "description": "Support domains matched by the application.", + "items": { + "type": "string" + }, + "type": "array" +}; + +/** + * The schema of `alexandria_create_application_request`. + */ +export const alexandria_create_application_request: JsonSchema = { + "allOf": [ + { + "properties": { + "category_id": { + "$ref": "#/$defs/alexandria_category_id", + "description": "Numeric identifier for an application category." + }, + "hostnames": { + "$ref": "#/$defs/alexandria_application_hostnames", + "description": "Hostnames matched by the application." + }, + "human_id": { + "$ref": "#/$defs/alexandria_application_human_id", + "description": "Human-readable identifier for the application." + }, + "ip_subnets": { + "$ref": "#/$defs/alexandria_application_ip_subnets", + "description": "IP subnets for this application. Custom application create and update requests accept IPv4 prefix lengths /8 through /32 and IPv6 prefix lengths /32 through /128." + }, + "name": { + "$ref": "#/$defs/alexandria_application_name", + "description": "Application name." + }, + "port_protocols": { + "$ref": "#/$defs/alexandria_application_port_protocols", + "description": "Ports matched by the application, in `protocol/port` or inclusive `protocol/start-end` format (for example, `tcp/443` or `udp/10000-20000`). TCP and UDP ports must be between 0 and 65535." + }, + "support_domains": { + "$ref": "#/$defs/alexandria_application_support_domains", + "description": "Support domains matched by the application." + } + }, + "required": [ + "category_id", + "human_id", + "name" + ], + "type": "object" + }, + { + "anyOf": [ + { + "properties": { + "hostnames": { + "allOf": [ + { + "$ref": "#/$defs/alexandria_application_hostnames" + }, + { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + } + ] + } + }, + "required": [ + "hostnames" + ], + "type": "object" + }, + { + "properties": { + "ip_subnets": { + "allOf": [ + { + "$ref": "#/$defs/alexandria_application_ip_subnets" + }, + { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + } + ] + } + }, + "required": [ + "ip_subnets" + ], + "type": "object" + } + ] + } + ], + "description": "Defines a custom application. At least one hostname or IP subnet is required.\nSupport domains and port/protocol pairs do not satisfy this requirement.\nA NUL character (U+0000) in any string value returns `400`.\n" +}; + +/** + * The schema of `alexandria_lookup_applications_request`. + */ +export const alexandria_lookup_applications_request: JsonSchema = { + "properties": { + "lookup": { + "description": "Rule sentence to search for complete application names. Leading and trailing\nwhitespace is trimmed before the length is checked. Control characters other\nthan tab and line breaks return `400`.\n", + "type": "string" + } + }, + "required": [ + "lookup" + ], + "type": "object" +}; + +/** + * The schema of `alexandria_update_application_request`. + */ +export const alexandria_update_application_request: JsonSchema = { + "description": "Update the network matchers for the application. The service preserves omitted\nmatcher lists; send an empty array to clear a list. The resulting application must\ncontain at least one hostname or IP subnet. Support domains and port/protocol pairs\ndo not satisfy this requirement.\nA NUL character (U+0000) in any string value returns `400`.\n", + "properties": { + "hostnames": { + "$ref": "#/$defs/alexandria_application_hostnames", + "description": "Hostnames matched by the application." + }, + "ip_subnets": { + "$ref": "#/$defs/alexandria_application_ip_subnets", + "description": "IP subnets for this application. Custom application create and update requests accept IPv4 prefix lengths /8 through /32 and IPv6 prefix lengths /32 through /128." + }, + "port_protocols": { + "$ref": "#/$defs/alexandria_application_port_protocols", + "description": "Ports matched by the application, in `protocol/port` or inclusive `protocol/start-end` format (for example, `tcp/443` or `udp/10000-20000`). TCP and UDP ports must be between 0 and 65535." + }, + "support_domains": { + "$ref": "#/$defs/alexandria_application_support_domains", + "description": "Support domains matched by the application." + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/accounts/applications/tools.ts b/src/generated/forge-mcp/accounts/applications/tools.ts new file mode 100644 index 00000000..880e883a --- /dev/null +++ b/src/generated/forge-mcp/accounts/applications/tools.ts @@ -0,0 +1,308 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { alexandria_category_id } from "../schemas.js"; +import { + alexandria_application_hostnames, + alexandria_application_human_id, + alexandria_application_ip_subnets, + alexandria_application_name, + alexandria_application_port_protocols, + alexandria_application_support_domains, + alexandria_create_application_request, + alexandria_lookup_applications_request, + alexandria_update_application_request, +} from "./schemas.js"; + +/** + * The tools of `accounts.applications`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_applications_create", + title: "Create application", + description: "Create a custom application for an account from a name, category, and optional network matchers.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account ID.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/alexandria_create_application_request" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "alexandria_application_hostnames": alexandria_application_hostnames, + "alexandria_application_human_id": alexandria_application_human_id, + "alexandria_application_ip_subnets": alexandria_application_ip_subnets, + "alexandria_application_name": alexandria_application_name, + "alexandria_application_port_protocols": alexandria_application_port_protocols, + "alexandria_application_support_domains": alexandria_application_support_domains, + "alexandria_category_id": alexandria_category_id, + "alexandria_create_application_request": alexandria_create_application_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create application" + }, + method: "POST", + path: "/accounts/{account_id}/resource-library/applications", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/resource-library/applications`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_applications_delete", + title: "Delete application", + description: "Delete a custom application and all of its versions. Deletion is rejected when other resources reference the application.\n\nConfirm with the user before calling this tool. This operation deletes the custom application and all of its versions. This action cannot be undone.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account ID.", + "type": "string" + }, + "id": { + "description": "Application ID.", + "type": "string" + } + }, + required: [ + "account_id", + "id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete application" + }, + method: "DELETE", + path: "/accounts/{account_id}/resource-library/applications/{id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/resource-library/applications/${pathParam(args, "id")}`, + }), + }, + { + name: "accounts_applications_get", + title: "Get application", + description: "Retrieve an application available to the account by its numeric application ID.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account ID.", + "type": "string" + }, + "id": { + "description": "Application ID.", + "type": "string" + } + }, + required: [ + "account_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get application" + }, + method: "GET", + path: "/accounts/{account_id}/resource-library/applications/{id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/resource-library/applications/${pathParam(args, "id")}`, + }), + }, + { + name: "accounts_applications_list", + title: "List applications", + description: "List the applications available to an account, both the applications Cloudflare\ncurates and the custom applications the account has defined.\n\nResults are paginated. Page with `cursor` so that applications added or removed\nbetween requests do not make other results repeat or go missing; `offset` paging can\nrepeat or miss results when the list changes between requests. Use `filter` and\n`search` to narrow the list, `order_by` to sort it, and `fields` to reduce each result\nto only the properties you need.\nUse `lookup` to find complete application names mentioned in a rule sentence,\nignoring case. Lookup does not correct misspellings. It ranks matches by\nrelevance and uses the same filters, fields, and pagination as listing.\n`lookup` cannot be combined with `search`.\n\nInvalid UTF-8 or a NUL character (U+0000) in any query parameter name or value\nreturns `400`.\n\nThe authenticated principal must have access to the account identified by\n`account_id`.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account ID.", + "type": "string" + }, + "cursor": { + "description": "Opaque value from `result_info.cursor` of the previous response. Returns the\nresults that follow it. Send the same `filter`, `search`, `lookup`, and\n`order_by` values as the request that returned it; `limit` and `fields` may\nchange. An empty value is the same as no cursor. A modified cursor, or one used\nwith different values, returns `400`.\n", + "type": "string" + }, + "fields": { + "description": "Return only the listed properties on each application, as a comma-separated list.\nUse this to keep responses small when you only need part of each application, for\nexample populating a picker with `fields=id,name` instead of downloading every\nhostname and IP subnet.\n\nOmit this parameter to receive the full application object, including\nwhen lookup is used.\n\n`id` is always returned.\n\nSelectable properties: `id`, `name`, `human_id`, `version`, `hostnames`,\n`support_domains`, `ip_subnets`, `port_protocols`, `supported`, `gen_ai_score`,\n`application_confidence_score`, `created_at`, `updated_at`, `review_status`.\n\nUnknown or empty property names return `400`.\n", + "type": "string" + }, + "filter": { + "description": "Filter applications using `key:value` format. Supported filter keys:\n- `name`: application name (for example, `name:HR`).\n- `id`: application ID (for example, `id:498`).\n- `human_id`: human-readable ID (for example, `human_id:HR`).\n- `hostname`: hostname or support domain (for example, `hostname:portal.example.com`).\n- `source`: application source name (for example, `source:cloudflare`).\n- `ip_subnet`: CIDR containment; returns applications where a stored subnet contains the search value (for example, `ip_subnet:10.0.1.5/32` matches `10.0.0.0/16`).\n- `category_id`: category ID (for example, `category_id:12`).\n- `category_name`: category name (for example, `category_name:HR`).\n- `supported`: supported Cloudflare product. Values: `GATEWAY`, `ACCESS`, `CASB`.\n- `review_status`: account-specific Gateway review status. Values: `approved`, `unapproved`, `in_review`, `unreviewed`.\n", + "type": "string" + }, + "limit": { + "default": 25, + "description": "Number of results to return. Defaults to 25; values are clamped to 1–250.", + "type": "integer" + }, + "lookup": { + "description": "Find complete, case-insensitive application name mentions in a phrase or\nrule sentence. Misspelled names do not match. Returns matching applications\nranked by relevance. Must be between 2 and 1000 characters, with no control\ncharacters other than tab and line breaks. Uses the same\nfilters, fields, and pagination as listing. `search` cannot be combined\nwith lookup. Results are ranked by relevance, so `order_by` is ignored.\nTo keep the text out of URLs, send it to `POST .../applications/lookup` instead.\n", + "type": "string" + }, + "offset": { + "default": 0, + "description": "Number of results to skip. Defaults to 0; negative values are clamped to 0. Ignored when `cursor` is provided.", + "type": "integer" + }, + "order_by": { + "description": "Order results using field:direction format. Supported fields are name, id, human_id,\ncategory_id, application_type, application_confidence_score, and gen_ai_score.\nSupported directions are asc and desc. Ignored when search is provided; results are\nranked by relevance instead. Also ignored when lookup is provided.\n", + "type": "string" + }, + "search": { + "description": "Fuzzy search across application name and hostnames. Results are ranked by relevance. Must be between 2 and 200 characters. Can be combined with filter parameters.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List applications" + }, + method: "GET", + path: "/accounts/{account_id}/resource-library/applications", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/resource-library/applications`, + query: [ + ["filter", args["filter"], true], + ["limit", args["limit"], true], + ["offset", args["offset"], true], + ["cursor", args["cursor"], true], + ["order_by", args["order_by"], true], + ["search", args["search"], true], + ["lookup", args["lookup"], true], + ["fields", args["fields"], true], + ], + }), + }, + { + name: "accounts_applications_lookup", + title: "Look up applications in a rule sentence", + description: "Find complete application names mentioned in a rule sentence, ignoring case.\nLookup does not correct misspellings. Matches are ranked by relevance.\n\nThis endpoint takes the rule sentence in the request body, so the text stays out\nof URLs and request logs. Use it instead of the `lookup` query parameter on the\nlist endpoint when the text may contain sensitive content.\n\n`fields`, `limit`, and `filter` work the same way as on the list endpoint and are\npassed as query parameters. Results are not paged: `offset`, `cursor`, `order_by`,\n`search`, and `lookup` query parameters return `400`. Unknown request body properties also\nreturn `400`. Invalid UTF-8 or a NUL character (U+0000) in any query parameter\nname or value returns `400`.\n\nThe authenticated principal must have access to the account identified by\n`account_id`.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account ID.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/alexandria_lookup_applications_request" + }, + "fields": { + "description": "Return only the listed properties on each application, as a comma-separated list.\nAccepts the same properties as the list endpoint. `id` is always returned.\nOmit this parameter to receive the full application object.\n", + "type": "string" + }, + "filter": { + "description": "Filter matches using the same `key:value` filters as the list endpoint.", + "type": "string" + }, + "limit": { + "default": 25, + "description": "Maximum number of matches to return. Defaults to 25; values are clamped to 1–250.", + "type": "integer" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "alexandria_lookup_applications_request": alexandria_lookup_applications_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Look up applications in a rule sentence" + }, + method: "POST", + path: "/accounts/{account_id}/resource-library/applications/lookup", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/resource-library/applications/lookup`, + query: [ + ["filter", args["filter"], true], + ["limit", args["limit"], true], + ["fields", args["fields"], true], + ], + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_applications_update", + title: "Update application", + description: "Replace the supplied network matchers for a custom application and create a new version. Omitted matcher lists remain unchanged; send an empty list to clear a matcher type.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account ID.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/alexandria_update_application_request" + }, + "id": { + "description": "Application ID.", + "type": "string" + } + }, + required: [ + "account_id", + "id", + "body" + ], + $defs: { + "alexandria_application_hostnames": alexandria_application_hostnames, + "alexandria_application_ip_subnets": alexandria_application_ip_subnets, + "alexandria_application_port_protocols": alexandria_application_port_protocols, + "alexandria_application_support_domains": alexandria_application_support_domains, + "alexandria_update_application_request": alexandria_update_application_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update application" + }, + method: "PATCH", + path: "/accounts/{account_id}/resource-library/applications/{id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/resource-library/applications/${pathParam(args, "id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/billing/history/tools.ts b/src/generated/forge-mcp/accounts/billing/history/tools.ts new file mode 100644 index 00000000..e67e66fb --- /dev/null +++ b/src/generated/forge-mcp/accounts/billing/history/tools.ts @@ -0,0 +1,80 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `accounts.billing.history`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_billing_history_list", + title: "Get Account Billing History", + description: "Gets the billing history for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Number of items per page.", + "type": "integer" + }, + "status": { + "description": "Filter billing history by status.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Account Billing History" + }, + method: "GET", + path: "/accounts/{account_id}/billing/history", + extensions: { + "x-api-token-group": [ + "Billing Write", + "Billing Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read" + ], + "x-fern-enum": { + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/history`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["status", args["status"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/billing/paymentMethods/schemas.ts b/src/generated/forge-mcp/accounts/billing/paymentMethods/schemas.ts new file mode 100644 index 00000000..b60653c7 --- /dev/null +++ b/src/generated/forge-mcp/accounts/billing/paymentMethods/schemas.ts @@ -0,0 +1,109 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `bill-subs-api_payment_method`. + */ +export const bill_subs_api_payment_method: JsonSchema = { + "properties": { + "address": { + "description": "Billing address line 1.", + "type": "string" + }, + "address2": { + "description": "Billing address line 2.", + "type": "string" + }, + "bank_account_type": { + "description": "Bank account type.", + "type": "string" + }, + "bank_code": { + "description": "Bank code.", + "type": "string" + }, + "bank_country": { + "description": "Bank country.", + "type": "string" + }, + "bank_name": { + "description": "Bank name for bank-based payment methods.", + "type": "string" + }, + "bank_routing_number": { + "description": "Bank routing number.", + "type": "string" + }, + "cashapp_cash_tag": { + "description": "Cash App cash tag.", + "type": "string" + }, + "city": { + "description": "Billing city.", + "type": "string" + }, + "country": { + "description": "Billing country.", + "type": "string" + }, + "default": { + "description": "Whether this is the default payment method.", + "type": "boolean" + }, + "device_data": { + "description": "Device data for fraud prevention.", + "type": "string" + }, + "first_name": { + "description": "Billing first name.", + "type": "string" + }, + "last_name": { + "description": "Billing last name.", + "type": "string" + }, + "nick_name": { + "description": "A nickname for the payment method.", + "type": "string" + }, + "payment_account_email": { + "description": "Email associated with the payment account.", + "type": "string" + }, + "payment_email": { + "description": "Payment email address.", + "type": "string" + }, + "payment_gateway": { + "description": "The payment gateway used.", + "type": "string" + }, + "payment_nonce": { + "description": "Payment nonce for tokenized payments.", + "type": "string" + }, + "state": { + "description": "Billing state.", + "type": "string" + }, + "type": { + "description": "The payment method type.", + "enum": [ + "CREDIT_CARD", + "PAYPAL", + "CASHAPP", + "SEPA_DEBIT", + "LINK", + "ACH_DIRECT_DEBIT" + ], + "type": "string" + }, + "zipcode": { + "description": "Billing zip code.", + "type": "string" + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/accounts/billing/paymentMethods/tools.ts b/src/generated/forge-mcp/accounts/billing/paymentMethods/tools.ts new file mode 100644 index 00000000..ca312dde --- /dev/null +++ b/src/generated/forge-mcp/accounts/billing/paymentMethods/tools.ts @@ -0,0 +1,375 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { bill_subs_api_payment_method } from "./schemas.js"; + +/** + * The tools of `accounts.billing.payment_methods`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_billing_payment_methods_create", + title: "Create Payment Method", + description: "Creates a new payment method for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "$ref": "#/$defs/bill-subs-api_payment_method" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "bill-subs-api_payment_method": bill_subs_api_payment_method, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Payment Method" + }, + method: "POST", + path: "/accounts/{account_id}/payment-methods", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read", + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + }, + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/payment-methods`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_billing_payment_methods_delete", + title: "Delete Payment Method", + description: "Deletes a payment method from an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "payment_method_id": { + "description": "Payment method identifier.", + "type": "string" + } + }, + required: [ + "account_id", + "payment_method_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Payment Method" + }, + method: "DELETE", + path: "/accounts/{account_id}/payment-methods/{payment_method_id}", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/payment-methods/${pathParam(args, "payment_method_id")}`, + }), + }, + { + name: "accounts_billing_payment_methods_get", + title: "Get Payment Method", + description: "Gets a specific payment method for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "payment_method_id": { + "description": "Payment method identifier.", + "type": "string" + } + }, + required: [ + "account_id", + "payment_method_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Payment Method" + }, + method: "GET", + path: "/accounts/{account_id}/payment-methods/{payment_method_id}", + extensions: { + "x-api-token-group": [ + "Billing Write", + "Billing Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read" + ], + "x-fern-enum": { + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/payment-methods/${pathParam(args, "payment_method_id")}`, + }), + }, + { + name: "accounts_billing_payment_methods_list", + title: "List Payment Methods", + description: "Lists all payment methods for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Number of items per page.", + "type": "integer" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Payment Methods" + }, + method: "GET", + path: "/accounts/{account_id}/payment-methods", + extensions: { + "x-api-token-group": [ + "Billing Write", + "Billing Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read" + ], + "x-fern-enum": { + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/payment-methods`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, + { + name: "accounts_billing_payment_methods_set_default", + title: "Set Default Payment Method", + description: "Sets a payment method as the default for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "payment_method_id": { + "description": "Payment method identifier.", + "type": "string" + } + }, + required: [ + "account_id", + "payment_method_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Set Default Payment Method" + }, + method: "POST", + path: "/accounts/{account_id}/payment-methods/{payment_method_id}/set-as-default", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read", + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + }, + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/payment-methods/${pathParam(args, "payment_method_id")}/set-as-default`, + }), + }, + { + name: "accounts_billing_payment_methods_update", + title: "Update Payment Method", + description: "Updates a payment method for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "$ref": "#/$defs/bill-subs-api_payment_method" + }, + "payment_method_id": { + "description": "Payment method identifier.", + "type": "string" + } + }, + required: [ + "account_id", + "payment_method_id", + "body" + ], + $defs: { + "bill-subs-api_payment_method": bill_subs_api_payment_method, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Payment Method" + }, + method: "PUT", + path: "/accounts/{account_id}/payment-methods/{payment_method_id}", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read", + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + }, + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/payment-methods/${pathParam(args, "payment_method_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/billing/tools.ts b/src/generated/forge-mcp/accounts/billing/tools.ts new file mode 100644 index 00000000..c883b767 --- /dev/null +++ b/src/generated/forge-mcp/accounts/billing/tools.ts @@ -0,0 +1,376 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `accounts.billing`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_billing_create_setup_intent", + title: "Create Setup Intent", + description: "Creates a Stripe setup intent for adding a payment method to an account. Returns a client secret for frontend payment method collection.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Setup Intent" + }, + method: "POST", + path: "/accounts/{account_id}/client-secret", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/client-secret`, + }), + }, + { + name: "accounts_billing_get_bad_debt", + title: "Get Account Bad Debt", + description: "Gets bad debt information for an account, including outstanding invoices and total debt amount.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Account Bad Debt" + }, + method: "GET", + path: "/accounts/{account_id}/billing/bad-debt", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/bad-debt`, + }), + }, + { + name: "accounts_billing_get_credits", + title: "Get Account Credits", + description: "Gets the credit balance and eligibility for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Account Credits" + }, + method: "GET", + path: "/accounts/{account_id}/billing/credits", + extensions: { + "x-api-token-group": [ + "Billing Write", + "Billing Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read" + ], + "x-fern-enum": { + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/credits`, + }), + }, + { + name: "accounts_billing_get_receipt_pdf", + title: "Get Receipt PDF", + description: "Downloads a receipt as a PDF document.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "doctype": { + "description": "The document type to generate.", + "type": "string" + }, + "receipt_id": { + "description": "Receipt identifier.", + "type": "string" + } + }, + required: [ + "account_id", + "receipt_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Receipt PDF" + }, + method: "GET", + path: "/accounts/{account_id}/receipts/{receipt_id}/pdf", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/receipts/${pathParam(args, "receipt_id")}/pdf`, + query: [ + ["doctype", args["doctype"], true], + ], + }), + }, + { + name: "accounts_billing_get_unpaid_invoices", + title: "Get Unpaid Invoices", + description: "Gets unpaid invoice information for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Unpaid Invoices" + }, + method: "GET", + path: "/accounts/{account_id}/billing/unpaid-invoice", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/unpaid-invoice`, + }), + }, + { + name: "accounts_billing_pay_bad_debt", + title: "Pay Bad Debt", + description: "Pays outstanding bad debt for an account. Discovers all debt automatically and handles invoice deduplication.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "properties": { + "payment_method_id": { + "description": "The payment method to use. If omitted, the default payment method is used.", + "type": "string" + } + }, + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Pay Bad Debt" + }, + method: "POST", + path: "/accounts/{account_id}/pay-bad-debt", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/pay-bad-debt`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_billing_pay_invoice", + title: "Pay Invoice", + description: "Pays an outstanding invoice for an account. Returns a Stripe client secret when Strong Customer Authentication (SCA) is required to complete the payment.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "properties": { + "invoice_id": { + "description": "The identifier of the invoice to pay.", + "type": "string" + }, + "payment_method_id": { + "description": "The payment method to use. If omitted, the default payment method is used.", + "type": "string" + }, + "validate_payment_method": { + "description": "Whether to validate the payment method before processing.", + "type": "boolean" + } + }, + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Pay Invoice" + }, + method: "POST", + path: "/accounts/{account_id}/pay-invoice", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/pay-invoice`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_billing_toggle_pdf_invoices", + title: "Toggle PDF Invoices", + description: "Toggles PDF invoice generation for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "properties": { + "toggle": { + "description": "Whether to enable or disable PDF invoice generation.", + "type": "boolean" + } + }, + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Toggle PDF Invoices" + }, + method: "PATCH", + path: "/accounts/{account_id}/invoices", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/invoices`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/categories/tools.ts b/src/generated/forge-mcp/accounts/categories/tools.ts new file mode 100644 index 00000000..1f01ea25 --- /dev/null +++ b/src/generated/forge-mcp/accounts/categories/tools.ts @@ -0,0 +1,92 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `accounts.categories`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_categories_get", + title: "Get application category", + description: "Retrieve an application category by its numeric ID.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account ID.", + "type": "string" + }, + "id": { + "description": "Application category ID.", + "type": "string" + } + }, + required: [ + "account_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get application category" + }, + method: "GET", + path: "/accounts/{account_id}/resource-library/categories/{id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/resource-library/categories/${pathParam(args, "id")}`, + }), + }, + { + name: "accounts_categories_list", + title: "List application categories", + description: "List the categories available for classifying applications, ordered by name.\nResults are paginated by `offset` or `cursor`.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account ID.", + "type": "string" + }, + "cursor": { + "description": "Opaque value from `result_info.cursor` of the previous response. Returns the\ncategories that follow it. `limit` may change between requests. An empty value\nis the same as no cursor. A modified cursor, or one returned by a different list,\nreturns `400`.\n", + "type": "string" + }, + "limit": { + "default": 25, + "description": "Number of results to return. Defaults to 25; values are clamped to 1–250.", + "type": "integer" + }, + "offset": { + "default": 0, + "description": "Number of results to skip. Defaults to 0; negative values are clamped to 0. Ignored when `cursor` is provided.", + "type": "integer" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List application categories" + }, + method: "GET", + path: "/accounts/{account_id}/resource-library/categories", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/resource-library/categories`, + query: [ + ["limit", args["limit"], true], + ["offset", args["offset"], true], + ["cursor", args["cursor"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/logs/audit/tools.ts b/src/generated/forge-mcp/accounts/logs/audit/tools.ts new file mode 100644 index 00000000..56cd1c16 --- /dev/null +++ b/src/generated/forge-mcp/accounts/logs/audit/tools.ts @@ -0,0 +1,642 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `accounts.logs.audit`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_logs_audit_history", + title: "Get resource change history from an account audit log entry (Version 2)", + description: "Returns the chronological change history for the resource identified by the given audit log entry.\n\nThe endpoint first locates the source audit log entry by `id` (using `action_time` to narrow the lookup window), derives identifying filters from that entry, and then returns matching audit logs within the `since`/`before` window.\n\nThe `result_info.history_status` field indicates the quality of the resource identification used:\n- `exact`: Resource was identified by the resource URI.\n- `approximate`: Resource was identified without the resource URI.\n- `unavailable`: The source audit log entry did not contain enough information to identify the resource; an empty result is returned.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The unique ID that identifies the account.", + "type": "string" + }, + "action_time": { + "description": "RFC3339 timestamp of the source audit log entry's action time. Used to narrow the source-entry lookup window. Provide the `action.time` value from the audit log identified by `id`.", + "format": "date-time", + "type": "string" + }, + "before": { + "description": "Limits the returned results to logs older than the specified date. This can be a date string 2019-04-30 (interpreted in UTC) or an absolute timestamp that conforms to RFC3339.", + "format": "date", + "type": "string" + }, + "cursor": { + "description": "The cursor is an opaque token used to paginate through large sets of records. It indicates the position from which to continue when requesting the next set of records. A valid cursor value can be obtained from the cursor object in the result_info structure of a previous response.", + "type": "string" + }, + "direction": { + "default": "desc", + "description": "Sets sorting order.", + "enum": [ + "desc", + "asc" + ], + "type": "string" + }, + "id": { + "description": "The ID of the audit log to fetch resource history for.", + "format": "uuid", + "type": "string" + }, + "limit": { + "default": 100, + "description": "The number limits the objects to return. The cursor attribute may be used to iterate over the next batch of objects if there are more than the limit.", + "type": "number" + }, + "since": { + "description": "Limits the returned results to logs newer than the specified date. This can be a date string 2019-04-30 (interpreted in UTC) or an absolute timestamp that conforms to RFC3339.", + "format": "date", + "type": "string" + } + }, + required: [ + "account_id", + "id", + "action_time", + "since", + "before" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get resource change history from an account audit log entry (Version 2)" + }, + method: "GET", + path: "/accounts/{account_id}/logs/audit/{id}/history", + extensions: { + "x-api-token-group": [ + "Account Settings Write", + "Account Settings Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/logs/audit/${pathParam(args, "id")}/history`, + query: [ + ["action_time", args["action_time"], true], + ["since", args["since"], true], + ["before", args["before"], true], + ["direction", args["direction"], true], + ["limit", args["limit"], true], + ["cursor", args["cursor"], true], + ], + }), + }, + { + name: "accounts_logs_audit_list", + title: "Get account audit logs (Version 2)", + description: "Gets a list of audit logs for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The unique id that identifies the account.", + "type": "string" + }, + "account_name": { + "description": "Filters by the account name.", + "items": { + "type": "string" + }, + "type": "array" + }, + "account_name_not": { + "description": "Filters out audit logs by the account name.", + "items": { + "type": "string" + }, + "type": "array" + }, + "action_result": { + "description": "Filters by whether the action was successful or not.", + "items": { + "enum": [ + "success", + "failure" + ], + "type": "string" + }, + "type": "array" + }, + "action_result_not": { + "description": "Filters out audit logs by whether the action was successful or not.", + "items": { + "enum": [ + "success", + "failure" + ], + "type": "string" + }, + "type": "array" + }, + "action_type": { + "description": "Filters by the action type.", + "items": { + "enum": [ + "create", + "delete", + "view", + "update" + ], + "type": "string" + }, + "type": "array" + }, + "action_type_not": { + "description": "Filters out audit logs by the action type.", + "items": { + "enum": [ + "create", + "delete", + "view", + "update" + ], + "type": "string" + }, + "type": "array" + }, + "actor_context": { + "description": "Filters by the actor context.\n- `api`: The action was performed through the API. The specific credential type was not recorded.\n- `api_key`: The action was authenticated with a Cloudflare Global API Key.\n- `api_token`: The action was authenticated with an API token.\n- `dash`: The action was performed through the Cloudflare dashboard.\n- `oauth`: The action was authenticated with an OAuth token.\n- `origin_ca_key`: The action was authenticated with an Origin CA key.\n", + "items": { + "enum": [ + "api", + "api_key", + "api_token", + "dash", + "oauth", + "origin_ca_key" + ], + "type": "string" + }, + "type": "array" + }, + "actor_context_not": { + "description": "Filters out audit logs by the actor context.\n- `api`: The action was performed through the API. The specific credential type was not recorded.\n- `api_key`: The action was authenticated with a Cloudflare Global API Key.\n- `api_token`: The action was authenticated with an API token.\n- `dash`: The action was performed through the Cloudflare dashboard.\n- `oauth`: The action was authenticated with an OAuth token.\n- `origin_ca_key`: The action was authenticated with an Origin CA key.\n", + "items": { + "enum": [ + "api", + "api_key", + "api_token", + "dash", + "oauth", + "origin_ca_key" + ], + "type": "string" + }, + "type": "array" + }, + "actor_email": { + "description": "Filters by the actor's email address.", + "items": { + "type": "string" + }, + "type": "array" + }, + "actor_email_not": { + "description": "Filters out audit logs by the actor's email address.", + "items": { + "type": "string" + }, + "type": "array" + }, + "actor_id": { + "description": "Filters by the actor ID. This can be either the Account ID or User ID.", + "items": { + "type": "string" + }, + "type": "array" + }, + "actor_id_not": { + "description": "Filters out audit logs by the actor ID. This can be either the Account ID or User ID.", + "items": { + "type": "string" + }, + "type": "array" + }, + "actor_ip_address": { + "description": "The IP address where the action was initiated.", + "items": { + "type": "string" + }, + "type": "array" + }, + "actor_ip_address_not": { + "description": "Filters out audit logs IP address where the action was initiated.", + "items": { + "type": "string" + }, + "type": "array" + }, + "actor_token_id": { + "description": "Filters by the API token ID when the actor context is an api_token or oauth.", + "items": { + "type": "string" + }, + "type": "array" + }, + "actor_token_id_not": { + "description": "Filters out audit logs by the API token ID when the actor context is an api_token or oauth.", + "items": { + "type": "string" + }, + "type": "array" + }, + "actor_token_name": { + "description": "Filters by the API token name when the actor context is an api_token or oauth.", + "items": { + "type": "string" + }, + "type": "array" + }, + "actor_token_name_not": { + "description": "Filters out audit logs by the API token name when the actor context is an api_token or oauth.", + "items": { + "type": "string" + }, + "type": "array" + }, + "actor_type": { + "description": "Filters by the actor type.", + "items": { + "enum": [ + "account", + "cloudflare_admin", + "delegated_service", + "system", + "user" + ], + "type": "string" + }, + "type": "array" + }, + "actor_type_not": { + "description": "Filters out audit logs by the actor type.", + "items": { + "enum": [ + "account", + "cloudflare_admin", + "delegated_service", + "system", + "user" + ], + "type": "string" + }, + "type": "array" + }, + "audit_log_id": { + "description": "Finds a specific log by its ID.", + "items": { + "type": "string" + }, + "type": "array" + }, + "audit_log_id_not": { + "description": "Filters out audit logs by their IDs.", + "items": { + "type": "string" + }, + "type": "array" + }, + "before": { + "description": "Limits the returned results to logs older than the specified date. This can be a date string 2019-04-30 (interpreted in UTC) or an absolute timestamp that conforms to RFC3339.", + "format": "date", + "type": "string" + }, + "cursor": { + "description": "The cursor is an opaque token used to paginate through large sets of records. It indicates the position from which to continue when requesting the next set of records. A valid cursor value can be obtained from the cursor object in the result_info structure of a previous response.", + "type": "string" + }, + "direction": { + "default": "desc", + "description": "Sets sorting order.", + "enum": [ + "desc", + "asc" + ], + "type": "string" + }, + "id": { + "description": "Finds a specific log by its ID.", + "items": { + "type": "string" + }, + "type": "array" + }, + "id_not": { + "description": "Filters out audit logs by their IDs.", + "items": { + "type": "string" + }, + "type": "array" + }, + "limit": { + "default": 100, + "description": "The number limits the objects to return. The cursor attribute may be used to iterate over the next batch of objects if there are more than the limit.", + "type": "number" + }, + "product_category": { + "description": "Filters audit logs by one or more predefined product categories. Each product category expands into a curated set of resource_product values and is unioned with any explicit resource_product filter. Matched case-insensitively; unknown product categories return 400. Repeatable. Use the audit log product categories endpoint to discover the available values.", + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_cf_ray_id": { + "description": "Filters by the response CF Ray ID.", + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_cf_ray_id_not": { + "description": "Filters out audit logs by the response CF Ray ID.", + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_method": { + "description": "The HTTP method for the API call.", + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_method_not": { + "description": "Filters out audit logs by the HTTP method for the API call.", + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_status_code": { + "description": "The response status code that was returned.", + "items": { + "type": "integer" + }, + "type": "array" + }, + "raw_status_code_not": { + "description": "Filters out audit logs by the response status code that was returned.", + "items": { + "type": "integer" + }, + "type": "array" + }, + "raw_uri": { + "description": "Filters by the request URI.", + "items": { + "type": "string" + }, + "type": "array" + }, + "raw_uri_not": { + "description": "Filters out audit logs by the request URI.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resource_id": { + "description": "Filters by the resource ID.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resource_id_not": { + "description": "Filters out audit logs by the resource ID.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resource_product": { + "description": "Filters audit logs by the Cloudflare product associated with the changed resource.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resource_product_not": { + "description": "Filters out audit logs by the Cloudflare product associated with the changed resource.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resource_scope": { + "description": "Filters by the resource scope, specifying whether the resource is associated with an user, an account, a zone, or a membership.", + "items": { + "enum": [ + "accounts", + "user", + "zones", + "memberships" + ], + "type": "string" + }, + "type": "array" + }, + "resource_scope_not": { + "description": "Filters out audit logs by the resource scope, specifying whether the resource is associated with an user, an account, a zone, or a membership.", + "items": { + "enum": [ + "accounts", + "user", + "zones", + "memberships" + ], + "type": "string" + }, + "type": "array" + }, + "resource_type": { + "description": "Filters audit logs based on the unique type of resource changed by the action.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resource_type_not": { + "description": "Filters out audit logs based on the unique type of resource changed by the action.", + "items": { + "type": "string" + }, + "type": "array" + }, + "since": { + "description": "Limits the returned results to logs newer than the specified date. This can be a date string 2019-04-30 (interpreted in UTC) or an absolute timestamp that conforms to RFC3339.", + "format": "date", + "type": "string" + }, + "zone_id": { + "description": "Filters by the zone ID.", + "items": { + "type": "string" + }, + "type": "array" + }, + "zone_id_not": { + "description": "Filters out audit logs by the zone ID.", + "items": { + "type": "string" + }, + "type": "array" + }, + "zone_name": { + "description": "Filters by the zone name associated with the change.", + "items": { + "type": "string" + }, + "type": "array" + }, + "zone_name_not": { + "description": "Filters out audit logs by the zone name associated with the change.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + required: [ + "account_id", + "since", + "before" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get account audit logs (Version 2)" + }, + method: "GET", + path: "/accounts/{account_id}/logs/audit", + extensions: { + "x-api-token-group": [ + "Account Settings Write", + "Account Settings Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/logs/audit`, + query: [ + ["account_name", args["account_name"], true], + ["action_result", args["action_result"], true], + ["action_type", args["action_type"], true], + ["actor_context", args["actor_context"], true], + ["actor_email", args["actor_email"], true], + ["actor_id", args["actor_id"], true], + ["actor_ip_address", args["actor_ip_address"], true], + ["actor_token_id", args["actor_token_id"], true], + ["actor_token_name", args["actor_token_name"], true], + ["actor_type", args["actor_type"], true], + ["audit_log_id", args["audit_log_id"], true], + ["id", args["id"], true], + ["raw_cf_ray_id", args["raw_cf_ray_id"], true], + ["raw_method", args["raw_method"], true], + ["raw_status_code", args["raw_status_code"], true], + ["raw_uri", args["raw_uri"], true], + ["resource_id", args["resource_id"], true], + ["resource_product", args["resource_product"], true], + ["resource_type", args["resource_type"], true], + ["resource_scope", args["resource_scope"], true], + ["product_category", args["product_category"], true], + ["zone_id", args["zone_id"], true], + ["zone_name", args["zone_name"], true], + ["account_name.not", args["account_name_not"], true], + ["action_result.not", args["action_result_not"], true], + ["action_type.not", args["action_type_not"], true], + ["actor_context.not", args["actor_context_not"], true], + ["actor_email.not", args["actor_email_not"], true], + ["actor_id.not", args["actor_id_not"], true], + ["actor_ip_address.not", args["actor_ip_address_not"], true], + ["actor_token_id.not", args["actor_token_id_not"], true], + ["actor_token_name.not", args["actor_token_name_not"], true], + ["actor_type.not", args["actor_type_not"], true], + ["audit_log_id.not", args["audit_log_id_not"], true], + ["id.not", args["id_not"], true], + ["raw_cf_ray_id.not", args["raw_cf_ray_id_not"], true], + ["raw_method.not", args["raw_method_not"], true], + ["raw_status_code.not", args["raw_status_code_not"], true], + ["raw_uri.not", args["raw_uri_not"], true], + ["resource_id.not", args["resource_id_not"], true], + ["resource_product.not", args["resource_product_not"], true], + ["resource_type.not", args["resource_type_not"], true], + ["resource_scope.not", args["resource_scope_not"], true], + ["zone_id.not", args["zone_id_not"], true], + ["zone_name.not", args["zone_name_not"], true], + ["since", args["since"], true], + ["before", args["before"], true], + ["direction", args["direction"], true], + ["limit", args["limit"], true], + ["cursor", args["cursor"], true], + ], + }), + }, + { + name: "accounts_logs_audit_product_categories", + title: "List account audit log product categories (Version 2)", + description: "Lists the available audit log product categories and the resource products each one expands to. Use these values with the product_category filter on the account audit logs endpoint.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The unique id that identifies the account.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List account audit log product categories (Version 2)" + }, + method: "GET", + path: "/accounts/{account_id}/logs/audit/product_categories", + extensions: { + "x-api-token-group": [ + "Account Settings Write", + "Account Settings Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/logs/audit/product_categories`, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/members/schemas.ts b/src/generated/forge-mcp/accounts/members/schemas.ts new file mode 100644 index 00000000..5cda1c29 --- /dev/null +++ b/src/generated/forge-mcp/accounts/members/schemas.ts @@ -0,0 +1,194 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `iam_create-member-with-policies`. + */ +export const iam_create_member_with_policies: JsonSchema = { + "description": "Add Member with Policies", + "properties": { + "email": { + "$ref": "#/$defs/iam_email", + "description": "The contact email address of the user." + }, + "policies": { + "description": "Array of policies associated with this member.", + "items": { + "$ref": "#/$defs/iam_create_member_policy" + }, + "type": "array" + }, + "status": { + "$ref": "#/$defs/iam_member-invitation-status", + "description": "Status of the member invitation. If not provided during creation, defaults to 'pending'.\nChanging from 'accepted' back to 'pending' will trigger a replacement of the member resource in Terraform.\n" + } + }, + "required": [ + "email", + "policies" + ], + "type": "object" +}; + +/** + * The schema of `iam_create-member-with-roles`. + */ +export const iam_create_member_with_roles: JsonSchema = { + "description": "Add Member with Account Roles", + "properties": { + "email": { + "$ref": "#/$defs/iam_email", + "description": "The contact email address of the user." + }, + "roles": { + "description": "Array of roles associated with this member.", + "items": { + "$ref": "#/$defs/iam_role_components-schemas-identifier" + }, + "type": "array" + }, + "status": { + "$ref": "#/$defs/iam_member-invitation-status", + "description": "Status of the member invitation. If not provided during creation, defaults to 'pending'.\nChanging from 'accepted' back to 'pending' will trigger a replacement of the member resource in Terraform.\n" + } + }, + "required": [ + "email", + "roles" + ], + "type": "object" +}; + +/** + * The schema of `iam_create_member_policy`. + */ +export const iam_create_member_policy: JsonSchema = { + "description": "create_member_policy", + "properties": { + "access": { + "$ref": "#/$defs/iam_access", + "description": "Allow or deny operations against the resources." + }, + "permission_groups": { + "$ref": "#/$defs/iam_member_permission_groups", + "description": "A set of permission groups that are specified to the policy." + }, + "resource_groups": { + "$ref": "#/$defs/iam_member_resource_groups", + "description": "A list of resource groups that the policy applies to." + } + }, + "required": [ + "access", + "permission_groups", + "resource_groups" + ], + "type": "object" +}; + +/** + * The schema of `iam_member-invitation-status`. + */ +export const iam_member_invitation_status: JsonSchema = { + "description": "Status of the member invitation. If not provided during creation, defaults to 'pending'.\nChanging from 'accepted' back to 'pending' will trigger a replacement of the member resource in Terraform.\n", + "enum": [ + "accepted", + "pending" + ], + "type": "string" +}; + +/** + * The schema of `iam_member_permission_group`. + */ +export const iam_member_permission_group: JsonSchema = { + "description": "A group of permissions.", + "properties": { + "id": { + "description": "Identifier of the group.", + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" +}; + +/** + * The schema of `iam_member_permission_groups`. + */ +export const iam_member_permission_groups: JsonSchema = { + "description": "A set of permission groups that are specified to the policy.", + "items": { + "$ref": "#/$defs/iam_member_permission_group" + }, + "type": "array" +}; + +/** + * The schema of `iam_member_resource_group`. + */ +export const iam_member_resource_group: JsonSchema = { + "description": "A group of scoped resources.", + "properties": { + "id": { + "description": "Identifier of the group.", + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" +}; + +/** + * The schema of `iam_member_resource_groups`. + */ +export const iam_member_resource_groups: JsonSchema = { + "description": "A list of resource groups that the policy applies to.", + "items": { + "$ref": "#/$defs/iam_member_resource_group" + }, + "type": "array" +}; + +/** + * The schema of `iam_update-member-with-policies`. + */ +export const iam_update_member_with_policies: JsonSchema = { + "description": "Update Member with Policies", + "properties": { + "policies": { + "description": "Array of policies associated with this member.", + "items": { + "$ref": "#/$defs/iam_create_member_policy" + }, + "type": "array" + } + }, + "required": [ + "policies" + ], + "type": "object" +}; + +/** + * The schema of `iam_update-member-with-roles`. + */ +export const iam_update_member_with_roles: JsonSchema = { + "description": "Update Member with Account Roles", + "properties": { + "roles": { + "description": "Roles assigned to this member.", + "items": { + "$ref": "#/$defs/iam_role" + }, + "type": "array" + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/accounts/members/tools.ts b/src/generated/forge-mcp/accounts/members/tools.ts new file mode 100644 index 00000000..bc5bb4a6 --- /dev/null +++ b/src/generated/forge-mcp/accounts/members/tools.ts @@ -0,0 +1,399 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + iam_access, + iam_email, + iam_grants, + iam_permissions, +} from "../../schemas.js"; +import { + iam_role, + iam_role_components_schemas_identifier, +} from "../schemas.js"; +import { + iam_create_member_policy, + iam_create_member_with_policies, + iam_create_member_with_roles, + iam_member_invitation_status, + iam_member_permission_group, + iam_member_permission_groups, + iam_member_resource_group, + iam_member_resource_groups, + iam_update_member_with_policies, + iam_update_member_with_roles, +} from "./schemas.js"; + +/** + * The tools of `accounts.members`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_members_create", + title: "Add Member", + description: "Add a user to the list of members for this account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "body": { + "oneOf": [ + { + "$ref": "#/$defs/iam_create-member-with-roles" + }, + { + "$ref": "#/$defs/iam_create-member-with-policies" + } + ] + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "iam_access": iam_access, + "iam_create-member-with-policies": iam_create_member_with_policies, + "iam_create-member-with-roles": iam_create_member_with_roles, + "iam_create_member_policy": iam_create_member_policy, + "iam_email": iam_email, + "iam_member-invitation-status": iam_member_invitation_status, + "iam_member_permission_group": iam_member_permission_group, + "iam_member_permission_groups": iam_member_permission_groups, + "iam_member_resource_group": iam_member_resource_group, + "iam_member_resource_groups": iam_member_resource_groups, + "iam_role_components-schemas-identifier": iam_role_components_schemas_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Add Member" + }, + method: "POST", + path: "/accounts/{account_id}/members", + extensions: { + "x-api-token-group": [ + "SCIM Provisioning", + "Account Settings Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#organization:edit" + ], + "x-fern-enum": { + "#organization:edit": { + "name": "organization_edit" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/members`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_members_delete", + title: "Remove Member", + description: "Remove a member from an account.\n\nConfirm with the user before calling this tool. Are you sure you want to remove this user from the account?", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "member_id": { + "description": "Membership identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "member_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Remove Member" + }, + method: "DELETE", + path: "/accounts/{account_id}/members/{member_id}", + extensions: { + "x-api-token-group": [ + "SCIM Provisioning", + "Account Settings Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#organization:edit" + ], + "x-fern-enum": { + "#organization:edit": { + "name": "organization_edit" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/members/${pathParam(args, "member_id")}`, + }), + }, + { + name: "accounts_members_get", + title: "Member Details", + description: "Get information about a specific member of an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "member_id": { + "description": "Membership identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "member_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Member Details" + }, + method: "GET", + path: "/accounts/{account_id}/members/{member_id}", + extensions: { + "x-api-token-group": [ + "SCIM Provisioning", + "Account Settings Write", + "Account Settings Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#organization:read" + ], + "x-fern-enum": { + "#organization:read": { + "name": "organization_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/members/${pathParam(args, "member_id")}`, + }), + }, + { + name: "accounts_members_list", + title: "List Members", + description: "List all members of an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "direction": { + "description": "Direction to order results.", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "order": { + "description": "Field to order results by.", + "enum": [ + "user.first_name", + "user.last_name", + "user.email", + "status" + ], + "type": "string" + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "number" + }, + "per_page": { + "default": 20, + "description": "Maximum number of results per page.", + "type": "number" + }, + "status": { + "description": "A member's status in the account.", + "enum": [ + "accepted", + "pending", + "rejected" + ], + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Members" + }, + method: "GET", + path: "/accounts/{account_id}/members", + extensions: { + "x-api-token-group": [ + "SCIM Provisioning", + "Account Settings Write", + "Account Settings Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#organization:read" + ], + "x-fern-enum": { + "#organization:read": { + "name": "organization_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/members`, + query: [ + ["order", args["order"], true], + ["status", args["status"], true], + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["direction", args["direction"], true], + ], + }), + }, + { + name: "accounts_members_update", + title: "Update Member", + description: "Modify an account member.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "body": { + "oneOf": [ + { + "$ref": "#/$defs/iam_update-member-with-roles" + }, + { + "$ref": "#/$defs/iam_update-member-with-policies" + } + ] + }, + "member_id": { + "description": "Membership identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "member_id", + "body" + ], + $defs: { + "iam_access": iam_access, + "iam_create_member_policy": iam_create_member_policy, + "iam_grants": iam_grants, + "iam_member_permission_group": iam_member_permission_group, + "iam_member_permission_groups": iam_member_permission_groups, + "iam_member_resource_group": iam_member_resource_group, + "iam_member_resource_groups": iam_member_resource_groups, + "iam_permissions": iam_permissions, + "iam_role": iam_role, + "iam_role_components-schemas-identifier": iam_role_components_schemas_identifier, + "iam_update-member-with-policies": iam_update_member_with_policies, + "iam_update-member-with-roles": iam_update_member_with_roles, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Member" + }, + method: "PUT", + path: "/accounts/{account_id}/members/{member_id}", + extensions: { + "x-api-token-group": [ + "SCIM Provisioning", + "Account Settings Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#organization:edit" + ], + "x-fern-enum": { + "#organization:edit": { + "name": "organization_edit" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/members/${pathParam(args, "member_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/organization/tools.ts b/src/generated/forge-mcp/accounts/organization/tools.ts new file mode 100644 index 00000000..b1bd1742 --- /dev/null +++ b/src/generated/forge-mcp/accounts/organization/tools.ts @@ -0,0 +1,43 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `accounts.organization`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_organization_list", + title: "List account organizations", + description: "Retrieve a list of the organizations that \"contain\" this account or are\nmanaging it.\n\nThe returned list will be in order from \"root\" to \"leaf\", where the \"leaf\"\nwill be the organization that _immediately_ contains the specified\naccount.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List account organizations" + }, + method: "GET", + path: "/accounts/{account_id}/organizations", + extensions: { + "x-api-token-group": [ + "Account Settings Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/organizations`, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/profile/tools.ts b/src/generated/forge-mcp/accounts/profile/tools.ts new file mode 100644 index 00000000..cfccc4ae --- /dev/null +++ b/src/generated/forge-mcp/accounts/profile/tools.ts @@ -0,0 +1,87 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { organizations_api_Profile } from "../../schemas.js"; + +/** + * The tools of `accounts.profile`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_profile_get", + title: "Get account profile", + description: "Retrieves the business profile (name, email, phone, address, and external metadata)\nassociated with this account's parent organization customer record. Profiles can be shared\nacross accounts and organizations. Only available to members of an organization that\ncontains the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The ID of the account whose business profile to retrieve.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get account profile" + }, + method: "GET", + path: "/accounts/{account_id}/profile", + extensions: { + "x-api-token-group": [ + "Account Settings Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/profile`, + }), + }, + { + name: "accounts_profile_update", + title: "Update account profile", + description: "Updates the business profile (name, email, phone, address, and external metadata) associated\nwith this account's parent organization customer record. Changes apply to every account and\norganization sharing that profile. Omitted or empty fields are left unchanged. Only\navailable to members of an organization that contains the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The ID of the account whose business profile to update.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/organizations-api_Profile" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "organizations-api_Profile": organizations_api_Profile, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update account profile" + }, + method: "PUT", + path: "/accounts/{account_id}/profile", + extensions: { + "x-api-token-group": [ + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/profile`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/schemas.ts b/src/generated/forge-mcp/accounts/schemas.ts new file mode 100644 index 00000000..36359d1c --- /dev/null +++ b/src/generated/forge-mcp/accounts/schemas.ts @@ -0,0 +1,118 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../_/index.js"; + +/** + * The schema of `alexandria_category_id`. + */ +export const alexandria_category_id: JsonSchema = { + "description": "Numeric identifier for an application category.", + "type": "integer" +}; + +/** + * The schema of `iam_account`. + */ +export const iam_account: JsonSchema = { + "properties": { + "id": { + "$ref": "#/$defs/iam_common_components-schemas-identifier", + "description": "Identifier" + }, + "managed_by": { + "$ref": "#/$defs/iam_account_managed_by", + "description": "Parent container details" + }, + "name": { + "description": "Account name", + "type": "string" + }, + "settings": { + "$ref": "#/$defs/iam_account_settings", + "description": "Account settings" + }, + "type": { + "$ref": "#/$defs/iam_account-type" + } + }, + "required": [ + "id", + "name", + "type" + ], + "type": "object" +}; + +/** + * The schema of `iam_create-account`. + */ +export const iam_create_account: JsonSchema = { + "description": "Create Account", + "properties": { + "name": { + "description": "Account name", + "type": "string" + }, + "standalone": { + "description": "Set to `true` and omit `unit` to create a standalone Free Account. If provided, this field must be `true`.", + "enum": [ + true + ], + "type": "boolean" + }, + "type": { + "$ref": "#/$defs/iam_account-type" + }, + "unit": { + "$ref": "#/$defs/iam_create-account_unit", + "description": "Information related to the tenant unit. Provide its ID and omit `standalone` to create the Account within an Organization. See https://developers.cloudflare.com/tenant/how-to/manage-accounts/." + } + }, + "required": [ + "name" + ], + "type": "object" +}; + +/** + * The schema of `iam_create-account_unit`. + */ +export const iam_create_account_unit: JsonSchema = { + "description": "Information related to the tenant unit. Provide its ID and omit `standalone` to create the Account within an Organization. See https://developers.cloudflare.com/tenant/how-to/manage-accounts/.", + "properties": { + "id": { + "description": "Tenant unit ID", + "type": "string" + } + }, + "type": "object" +}; + +/** + * The schema of `iam_role`. + */ +export const iam_role: JsonSchema = { + "properties": { + "id": { + "$ref": "#/$defs/iam_role_components-schemas-identifier", + "description": "Role identifier tag." + }, + "permissions": { + "$ref": "#/$defs/iam_permissions" + } + }, + "required": [ + "id", + "permissions" + ], + "type": "object" +}; + +/** + * The schema of `iam_role_components-schemas-identifier`. + */ +export const iam_role_components_schemas_identifier: JsonSchema = { + "description": "Role identifier tag.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/accounts/subscriptions/schemas.ts b/src/generated/forge-mcp/accounts/subscriptions/schemas.ts new file mode 100644 index 00000000..5e9db82a --- /dev/null +++ b/src/generated/forge-mcp/accounts/subscriptions/schemas.ts @@ -0,0 +1,24 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `bill-subs-api_cancel_reason_request`. + */ +export const bill_subs_api_cancel_reason_request: JsonSchema = { + "properties": { + "other": { + "description": "Additional cancellation details.", + "type": "string" + }, + "reason_code": { + "description": "The cancellation reason codes.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/accounts/subscriptions/tools.ts b/src/generated/forge-mcp/accounts/subscriptions/tools.ts new file mode 100644 index 00000000..d85ba03c --- /dev/null +++ b/src/generated/forge-mcp/accounts/subscriptions/tools.ts @@ -0,0 +1,497 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + bill_subs_api_component_value, + bill_subs_api_component_values, + bill_subs_api_frequency, + bill_subs_api_install_id, + bill_subs_api_rate_plan, + bill_subs_api_subscription_v2, + bill_subs_api_subscription_v2_app, + bill_subs_api_zone, +} from "../../schemas.js"; +import { bill_subs_api_cancel_reason_request } from "./schemas.js"; + +/** + * The tools of `accounts.subscriptions`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_subscriptions_cancel_delayed_downgrade", + title: "Cancel Delayed Downgrade", + description: "Cancels pending delayed downgrades for the specified subscriptions.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "properties": { + "subscription_ids": { + "description": "List of subscription identifiers to cancel downgrades for.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Cancel Delayed Downgrade" + }, + method: "POST", + path: "/accounts/{account_id}/subscriptions/cancel-downgrade", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#subscription:edit" + ], + "x-fern-enum": { + "#subscription:edit": { + "name": "subscription_edit" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/subscriptions/cancel-downgrade`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_subscriptions_create", + title: "Create Subscription", + description: "Creates an account or zone subscription.", + inputSchema: { + type: "object", + properties: { + "account_or_zone": { + "type": "string" + }, + "account_or_zone_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "$ref": "#/$defs/bill-subs-api_subscription-v2" + } + }, + required: [ + "account_or_zone", + "account_or_zone_id", + "body" + ], + $defs: { + "bill-subs-api_component_value": bill_subs_api_component_value, + "bill-subs-api_component_values": bill_subs_api_component_values, + "bill-subs-api_frequency": bill_subs_api_frequency, + "bill-subs-api_install_id": bill_subs_api_install_id, + "bill-subs-api_rate_plan": bill_subs_api_rate_plan, + "bill-subs-api_subscription-v2": bill_subs_api_subscription_v2, + "bill-subs-api_subscription-v2_app": bill_subs_api_subscription_v2_app, + "bill-subs-api_zone": bill_subs_api_zone, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Subscription" + }, + method: "POST", + path: "/{account_or_zone}/{account_or_zone_id}/subscriptions", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read", + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + }, + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/${pathParam(args, "account_or_zone")}/${pathParam(args, "account_or_zone_id")}/subscriptions`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_subscriptions_create_cancel_reason", + title: "Create Cancel Reason", + description: "Records a cancellation reason for an account subscription.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "$ref": "#/$defs/bill-subs-api_cancel_reason_request" + }, + "subscription_identifier": { + "description": "Subscription identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "subscription_identifier", + "body" + ], + $defs: { + "bill-subs-api_cancel_reason_request": bill_subs_api_cancel_reason_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Cancel Reason" + }, + method: "POST", + path: "/accounts/{account_id}/subscriptions/{subscription_identifier}/cancel-reason", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#subscription:edit" + ], + "x-fern-enum": { + "#subscription:edit": { + "name": "subscription_edit" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/subscriptions/${pathParam(args, "subscription_identifier")}/cancel-reason`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_subscriptions_delete", + title: "Delete Subscription", + description: "Deletes an account's subscription.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "subscription_identifier": { + "description": "Subscription identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "subscription_identifier" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Subscription" + }, + method: "DELETE", + path: "/accounts/{account_id}/subscriptions/{subscription_identifier}", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + } + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/subscriptions/${pathParam(args, "subscription_identifier")}`, + }), + }, + { + name: "accounts_subscriptions_get", + title: "List Subscriptions", + description: "Lists all of an account or zone's subscriptions.", + inputSchema: { + type: "object", + properties: { + "account_or_zone": { + "type": "string" + }, + "account_or_zone_id": { + "description": "Identifier", + "type": "string" + } + }, + required: [ + "account_or_zone", + "account_or_zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Subscriptions" + }, + method: "GET", + path: "/{account_or_zone}/{account_or_zone_id}/subscriptions", + extensions: { + "x-api-token-group": [ + "Billing Write", + "Billing Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read" + ], + "x-fern-enum": { + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/${pathParam(args, "account_or_zone")}/${pathParam(args, "account_or_zone_id")}/subscriptions`, + }), + }, + { + name: "accounts_subscriptions_get_by_identifier", + title: "Get Subscription", + description: "Gets an account subscription by identifier.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "subscription_identifier": { + "description": "Subscription identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "subscription_identifier" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Subscription" + }, + method: "GET", + path: "/accounts/{account_id}/subscriptions/{subscription_identifier}", + extensions: { + "x-api-token-group": [ + "Billing Write", + "Billing Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#subscription:read" + ], + "x-fern-enum": { + "#subscription:read": { + "name": "subscription_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/subscriptions/${pathParam(args, "subscription_identifier")}`, + }), + }, + { + name: "accounts_subscriptions_get_cancel_reason", + title: "Get Cancel Reason", + description: "Gets the cancellation reason for an account subscription.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "subscription_identifier": { + "description": "Subscription identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "subscription_identifier" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Cancel Reason" + }, + method: "GET", + path: "/accounts/{account_id}/subscriptions/{subscription_identifier}/cancel-reason", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/subscriptions/${pathParam(args, "subscription_identifier")}/cancel-reason`, + }), + }, + { + name: "accounts_subscriptions_update", + title: "Update Subscription", + description: "Updates an account subscription.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "$ref": "#/$defs/bill-subs-api_subscription-v2" + }, + "subscription_identifier": { + "description": "Subscription identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "subscription_identifier", + "body" + ], + $defs: { + "bill-subs-api_component_value": bill_subs_api_component_value, + "bill-subs-api_component_values": bill_subs_api_component_values, + "bill-subs-api_frequency": bill_subs_api_frequency, + "bill-subs-api_install_id": bill_subs_api_install_id, + "bill-subs-api_rate_plan": bill_subs_api_rate_plan, + "bill-subs-api_subscription-v2": bill_subs_api_subscription_v2, + "bill-subs-api_subscription-v2_app": bill_subs_api_subscription_v2_app, + "bill-subs-api_zone": bill_subs_api_zone, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Subscription" + }, + method: "PUT", + path: "/accounts/{account_id}/subscriptions/{subscription_identifier}", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read", + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + }, + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/subscriptions/${pathParam(args, "subscription_identifier")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/tokens/permissionGroups/tools.ts b/src/generated/forge-mcp/accounts/tokens/permissionGroups/tools.ts new file mode 100644 index 00000000..baccfa49 --- /dev/null +++ b/src/generated/forge-mcp/accounts/tokens/permissionGroups/tools.ts @@ -0,0 +1,73 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `accounts.tokens.permission_groups`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_tokens_permission_groups_list", + title: "List Permission Groups", + description: "Find all available permission groups for Account Owned API Tokens.\nEach permission group indicates whether the caller can select it when\ncreating a token. Token creation performs the authoritative permission\ncheck.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "name": { + "description": "Filter by the name of the permission group.\nThe value must be URL-encoded.", + "type": "string" + }, + "scope": { + "description": "Filter by the scope of the permission group.\nThe value must be URL-encoded.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Permission Groups" + }, + method: "GET", + path: "/accounts/{account_id}/tokens/permission_groups", + extensions: { + "x-api-token-group": [ + "Account API Tokens Write", + "Account API Tokens Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.token.read" + ], + "x-fern-enum": { + "com.cloudflare.api.account.token.read": { + "name": "com_cloudflare_api_account_token_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/tokens/permission_groups`, + query: [ + ["name", args["name"], true], + ["scope", args["scope"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/tokens/tools.ts b/src/generated/forge-mcp/accounts/tokens/tools.ts new file mode 100644 index 00000000..9768c2b2 --- /dev/null +++ b/src/generated/forge-mcp/accounts/tokens/tools.ts @@ -0,0 +1,469 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + iam_cidr_list, + iam_condition, + iam_create_payload, + iam_effect, + iam_expires_on, + iam_name, + iam_not_before, + iam_permission_group, + iam_permission_group_meta, + iam_permission_groups, + iam_policy_with_permission_groups_and_resources, + iam_request_ip, + iam_resources, + iam_resources_type_object_nested, + iam_resources_type_object_string, + iam_token_body, + iam_token_policies, + iam_token_status, +} from "../../schemas.js"; + +/** + * The tools of `accounts.tokens`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_tokens_create", + title: "Create Token", + description: "Create a new Account Owned API token.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/iam_create_payload" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "iam_cidr_list": iam_cidr_list, + "iam_condition": iam_condition, + "iam_create_payload": iam_create_payload, + "iam_effect": iam_effect, + "iam_expires_on": iam_expires_on, + "iam_name": iam_name, + "iam_not_before": iam_not_before, + "iam_permission_group": iam_permission_group, + "iam_permission_group_meta": iam_permission_group_meta, + "iam_permission_groups": iam_permission_groups, + "iam_policy_with_permission_groups_and_resources": iam_policy_with_permission_groups_and_resources, + "iam_request_ip": iam_request_ip, + "iam_resources": iam_resources, + "iam_resources_type_object_nested": iam_resources_type_object_nested, + "iam_resources_type_object_string": iam_resources_type_object_string, + "iam_token_policies": iam_token_policies, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Token" + }, + method: "POST", + path: "/accounts/{account_id}/tokens", + extensions: { + "x-api-token-group": [ + "Account API Tokens Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.token.create" + ], + "x-fern-enum": { + "com.cloudflare.api.account.token.create": { + "name": "com_cloudflare_api_account_token_create" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/tokens`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_tokens_delete", + title: "Delete Token", + description: "Destroy an Account Owned API token.\n\nConfirm with the user before calling this tool. Are you sure? This action cannot be undone.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "token_id": { + "description": "Token identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "token_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Token" + }, + method: "DELETE", + path: "/accounts/{account_id}/tokens/{token_id}", + extensions: { + "x-api-token-group": [ + "Account API Tokens Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.token.delete" + ], + "x-fern-enum": { + "com.cloudflare.api.account.token.delete": { + "name": "com_cloudflare_api_account_token_delete" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/tokens/${pathParam(args, "token_id")}`, + }), + }, + { + name: "accounts_tokens_get", + title: "Token Details", + description: "Get information about a specific Account Owned API token.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "token_id": { + "description": "Token identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "token_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Token Details" + }, + method: "GET", + path: "/accounts/{account_id}/tokens/{token_id}", + extensions: { + "x-api-token-group": [ + "Account API Tokens Write", + "Account API Tokens Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.token.read" + ], + "x-fern-enum": { + "com.cloudflare.api.account.token.read": { + "name": "com_cloudflare_api_account_token_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/tokens/${pathParam(args, "token_id")}`, + }), + }, + { + name: "accounts_tokens_list", + title: "List Tokens", + description: "List Account Owned API tokens created for this account. Callers with\n`com.cloudflare.api.account.token.list_self` permission only receive\ntokens they created. Results include active, disabled, and\nrecently-expired tokens when `include_expired` is set to true.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "direction": { + "description": "Direction to order results.", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "include_expired": { + "default": false, + "description": "When true, includes recently-expired tokens in the response.", + "type": "boolean" + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "number" + }, + "per_page": { + "default": 20, + "description": "Maximum number of results per page.", + "type": "number" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Tokens" + }, + method: "GET", + path: "/accounts/{account_id}/tokens", + extensions: { + "x-api-token-group": [ + "Account API Tokens Write", + "Account API Tokens Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.token.list", + "com.cloudflare.api.account.token.list_self" + ], + "x-fern-enum": { + "com.cloudflare.api.account.token.list": { + "name": "com_cloudflare_api_account_token_list" + }, + "com.cloudflare.api.account.token.list_self": { + "name": "com_cloudflare_api_account_token_list_self" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/tokens`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["direction", args["direction"], true], + ["include_expired", args["include_expired"], true], + ], + }), + }, + { + name: "accounts_tokens_roll", + title: "Roll Token", + description: "Roll the Account Owned API token secret.\n\nConfirm with the user before calling this tool. Rolling this token will invalidate the current secret and generate a new one. Any integrations using the current secret will stop working.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "token_id": { + "description": "Token identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "token_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Roll Token" + }, + method: "PUT", + path: "/accounts/{account_id}/tokens/{token_id}/value", + extensions: { + "x-api-token-group": [ + "Account API Tokens Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.token.update" + ], + "x-fern-enum": { + "com.cloudflare.api.account.token.update": { + "name": "com_cloudflare_api_account_token_update" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/tokens/${pathParam(args, "token_id")}/value`, + }), + }, + { + name: "accounts_tokens_update", + title: "Update Token", + description: "Update an existing token.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/iam_token_body" + }, + "token_id": { + "description": "Token identifier tag.", + "type": "string" + } + }, + required: [ + "account_id", + "token_id", + "body" + ], + $defs: { + "iam_cidr_list": iam_cidr_list, + "iam_condition": iam_condition, + "iam_effect": iam_effect, + "iam_expires_on": iam_expires_on, + "iam_name": iam_name, + "iam_not_before": iam_not_before, + "iam_permission_group": iam_permission_group, + "iam_permission_group_meta": iam_permission_group_meta, + "iam_permission_groups": iam_permission_groups, + "iam_policy_with_permission_groups_and_resources": iam_policy_with_permission_groups_and_resources, + "iam_request_ip": iam_request_ip, + "iam_resources": iam_resources, + "iam_resources_type_object_nested": iam_resources_type_object_nested, + "iam_resources_type_object_string": iam_resources_type_object_string, + "iam_token_body": iam_token_body, + "iam_token_policies": iam_token_policies, + "iam_token_status": iam_token_status, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Token" + }, + method: "PUT", + path: "/accounts/{account_id}/tokens/{token_id}", + extensions: { + "x-api-token-group": [ + "Account API Tokens Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.token.update" + ], + "x-fern-enum": { + "com.cloudflare.api.account.token.update": { + "name": "com_cloudflare_api_account_token_update" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/tokens/${pathParam(args, "token_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_tokens_verify", + title: "Verify Token", + description: "Test whether a token works.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Verify Token" + }, + method: "GET", + path: "/accounts/{account_id}/tokens/verify", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/tokens/verify`, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/tools.ts b/src/generated/forge-mcp/accounts/tools.ts new file mode 100644 index 00000000..f0882012 --- /dev/null +++ b/src/generated/forge-mcp/accounts/tools.ts @@ -0,0 +1,366 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; +import { + iam_account_managed_by, + iam_account_settings, + iam_account_type, + iam_common_components_schemas_identifier, +} from "../schemas.js"; +import { + iam_account, + iam_create_account, + iam_create_account_unit, +} from "./schemas.js"; + +/** + * The tools of `accounts`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_create", + title: "Create an Account", + description: "Create an Account. To create the Account within an Organization, provide `unit.id` and omit `standalone`. To create a standalone Free Account, provide `standalone: true` and omit `unit`. Providing both fields is invalid. If you omit both fields, Cloudflare can determine the destination only when the User is an administrator of exactly one Organization. Cloudflare creates the Account in that Organization; otherwise, the request returns an error.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/iam_create-account", + "description": "Parameters for account creation" + }, + "idempotency_key": { + "description": "Optional key that identifies an Account-creation request. Free Account creation can require exactly one valid key, so API clients should send a key with every Account-creation request. Reuse the same key when retrying the same request.", + "type": "string" + } + }, + required: [ + "body" + ], + $defs: { + "iam_account-type": iam_account_type, + "iam_create-account": iam_create_account, + "iam_create-account_unit": iam_create_account_unit, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create an Account" + }, + method: "POST", + path: "/accounts", + extensions: { + "x-cfPlanAvailability": { + "business": false, + "enterprise": false, + "free": false, + "pro": false + } + }, + request: (args) => ({ + path: `/accounts`, + headers: [ + ["Idempotency-Key", args["idempotency_key"]], + ], + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_delete", + title: "Delete a specific account", + description: "Delete a specific account (only available for tenant admins at this time). This is a permanent operation that will delete any zones or other resources under the account\n\nConfirm with the user before calling this tool. Are you sure? This action cannot be undone.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account ID of the account to be deleted", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a specific account" + }, + method: "DELETE", + path: "/accounts/{account_id}", + extensions: { + "x-api-token-group": [ + "Account Settings Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#organization:edit" + ], + "x-fern-enum": { + "#organization:edit": { + "name": "organization_edit" + } + } + }, + "x-cfPlanAvailability": { + "business": false, + "enterprise": false, + "free": false, + "pro": false + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}`, + }), + }, + { + name: "accounts_get", + title: "Account Details", + description: "Get information about a specific account that you are a member of.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Account Details" + }, + method: "GET", + path: "/accounts/{account_id}", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read", + "DNS View Write", + "DNS View Read", + "SCIM Provisioning", + "Load Balancers Account Write", + "Load Balancers Account Read", + "Zero Trust: PII Read", + "DDoS Botnet Feed Write", + "DDoS Botnet Feed Read", + "Workers R2 Storage Write", + "Workers R2 Storage Read", + "DDoS Protection Write", + "DDoS Protection Read", + "Workers Tail Read", + "Workers KV Storage Write", + "Workers KV Storage Read", + "Workers Scripts Write", + "Workers Scripts Read", + "Load Balancing: Monitors and Pools Write", + "Load Balancing: Monitors and Pools Read", + "Account Firewall Access Rules Write", + "Account Firewall Access Rules Read", + "DNS Firewall Write", + "DNS Firewall Read", + "Billing Write", + "Billing Read", + "Account Settings Write", + "Account Settings Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#organization:read" + ], + "x-fern-enum": { + "#organization:read": { + "name": "organization_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}`, + }), + }, + { + name: "accounts_list", + title: "List Accounts", + description: "List all accounts you have ownership or verified access to.", + inputSchema: { + type: "object", + properties: { + "direction": { + "description": "Direction to order results.", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "name": { + "description": "Name of the account.", + "type": "string" + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "number" + }, + "per_page": { + "default": 20, + "description": "Maximum number of results per page.", + "type": "number" + } + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Accounts" + }, + method: "GET", + path: "/accounts", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts`, + query: [ + ["name", args["name"], true], + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["direction", args["direction"], true], + ], + }), + }, + { + name: "accounts_move", + title: "Move account to organization", + description: "Move an account into a destination organization, either assigning a standalone account\nto an organization or moving it between organizations in the same hierarchy. Availability\ndepends on the organization's capabilities.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The ID of the account to move.", + "type": "string" + }, + "body": { + "description": "The destination organization ID is where the account is to be moved.", + "properties": { + "destination_organization_id": { + "description": "The ID of the organization to move the account into.", + "type": "string" + } + }, + "required": [ + "destination_organization_id" + ], + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Move account to organization" + }, + method: "POST", + path: "/accounts/{account_id}/move", + extensions: { + "x-api-token-group": null + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/move`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_update", + title: "Update Account", + description: "Update an existing account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account identifier tag.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/iam_account" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "iam_account": iam_account, + "iam_account-type": iam_account_type, + "iam_account_managed_by": iam_account_managed_by, + "iam_account_settings": iam_account_settings, + "iam_common_components-schemas-identifier": iam_common_components_schemas_identifier, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Account" + }, + method: "PUT", + path: "/accounts/{account_id}", + extensions: { + "x-api-token-group": [ + "Account Settings Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#organization:edit" + ], + "x-fern-enum": { + "#organization:edit": { + "name": "organization_edit" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/transformations/tools.ts b/src/generated/forge-mcp/accounts/transformations/tools.ts new file mode 100644 index 00000000..94be5d96 --- /dev/null +++ b/src/generated/forge-mcp/accounts/transformations/tools.ts @@ -0,0 +1,55 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `accounts.transformations`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_transformations_list", + title: "List Image Resizing configurations for account", + description: "Returns a list of Image Resizing configurations across all zones for the account.\nThis endpoint is useful for retrieving the transformations (image_resizing) state\nfor all zones belonging to an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Image Resizing configurations for account" + }, + method: "GET", + path: "/accounts/{account_id}/settings/transformations", + extensions: { + "x-api-token-group": [ + "Zone Settings Write", + "Zone Settings Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#zone_settings:read" + ], + "x-fern-enum": { + "#zone_settings:read": { + "name": "zone_settings_read" + } + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/settings/transformations`, + }), + }, +]; diff --git a/src/generated/forge-mcp/accounts/utBilling/schemas.ts b/src/generated/forge-mcp/accounts/utBilling/schemas.ts new file mode 100644 index 00000000..4773ac2e --- /dev/null +++ b/src/generated/forge-mcp/accounts/utBilling/schemas.ts @@ -0,0 +1,15 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `speed_ut_billing_value`. + */ +export const speed_ut_billing_value: JsonSchema = { + "description": "Enables Unique Transformations billing for the account.\nNote: once enabled, this setting cannot be set back to \"off\".\n", + "enum": [ + "on" + ], + "type": "string" +}; diff --git a/src/generated/forge-mcp/accounts/utBilling/tools.ts b/src/generated/forge-mcp/accounts/utBilling/tools.ts new file mode 100644 index 00000000..eeca24a7 --- /dev/null +++ b/src/generated/forge-mcp/accounts/utBilling/tools.ts @@ -0,0 +1,117 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { speed_ut_billing_value } from "./schemas.js"; + +/** + * The tools of `accounts.ut_billing`. + */ +export const tools: readonly Tool[] = [ + { + name: "accounts_ut_billing_edit", + title: "Change Unique Transformations billing setting", + description: "Updates the Unique Transformations billing configuration for an account.\nWhen enabled, billing data is directed to the Transformations pipeline.\nNote: setting the value to \"off\" is not permitted once enabled.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier.", + "type": "string" + }, + "body": { + "properties": { + "value": { + "$ref": "#/$defs/speed_ut_billing_value", + "description": "Enables Unique Transformations billing for the account.\nNote: once enabled, this setting cannot be set back to \"off\".\n" + } + }, + "required": [ + "value" + ], + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "speed_ut_billing_value": speed_ut_billing_value, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Change Unique Transformations billing setting" + }, + method: "PATCH", + path: "/accounts/{account_id}/settings/ut-billing", + extensions: { + "x-api-token-group": [ + "Zone Settings Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#zone_settings:edit" + ], + "x-fern-enum": { + "#zone_settings:edit": { + "name": "zone_settings_edit" + } + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/settings/ut-billing`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "accounts_ut_billing_get", + title: "Get Unique Transformations billing setting", + description: "Retrieves the Unique Transformations billing configuration for an account.\nWhen enabled, billing data is directed to the Transformations pipeline.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Unique Transformations billing setting" + }, + method: "GET", + path: "/accounts/{account_id}/settings/ut-billing", + extensions: { + "x-api-token-group": [ + "Zone Settings Write", + "Zone Settings Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#zone_settings:read" + ], + "x-fern-enum": { + "#zone_settings:read": { + "name": "zone_settings_read" + } + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/settings/ut-billing`, + }), + }, +]; diff --git a/src/generated/forge-mcp/acm/customTrustStore/schemas.ts b/src/generated/forge-mcp/acm/customTrustStore/schemas.ts new file mode 100644 index 00000000..dc351f61 --- /dev/null +++ b/src/generated/forge-mcp/acm/customTrustStore/schemas.ts @@ -0,0 +1,12 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `tls-certificates-and-hostnames_certificate-3`. + */ +export const tls_certificates_and_hostnames_certificate_3: JsonSchema = { + "description": "The root CA certificate in PEM format. Only root CA certificates are accepted; intermediate and leaf certificates are not supported.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/acm/customTrustStore/tools.ts b/src/generated/forge-mcp/acm/customTrustStore/tools.ts new file mode 100644 index 00000000..82bb5244 --- /dev/null +++ b/src/generated/forge-mcp/acm/customTrustStore/tools.ts @@ -0,0 +1,272 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { tls_certificates_and_hostnames_certificate_3 } from "./schemas.js"; + +/** + * The tools of `acm.custom_trust_store`. + */ +export const tools: readonly Tool[] = [ + { + name: "acm_custom_trust_store_create", + title: "Upload Custom Origin Trust Store", + description: "Upload a root CA certificate to the Custom Origin Trust Store for a Zone. Only root CA certificates are accepted.", + inputSchema: { + type: "object", + properties: { + "body": { + "properties": { + "certificate": { + "$ref": "#/$defs/tls-certificates-and-hostnames_certificate-3", + "description": "The root CA certificate in PEM format. Only root CA certificates are accepted; intermediate and leaf certificates are not supported." + } + }, + "required": [ + "certificate" + ], + "type": "object" + }, + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "tls-certificates-and-hostnames_certificate-3": tls_certificates_and_hostnames_certificate_3, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Upload Custom Origin Trust Store" + }, + method: "POST", + path: "/zones/{zone_id}/acm/custom_trust_store", + extensions: { + "x-api-token-group": [ + "SSL and Certificates Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#ssl:read", + "#ssl:edit" + ], + "x-fern-enum": { + "#ssl:edit": { + "name": "ssl_edit" + }, + "#ssl:read": { + "name": "ssl_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/acm/custom_trust_store`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "acm_custom_trust_store_delete", + title: "Delete Custom Origin Trust Store", + description: "Removes a root CA certificate from the custom origin trust store. Origins using certificates signed by this CA will no longer be trusted.", + inputSchema: { + type: "object", + properties: { + "custom_origin_trust_store_id": { + "description": "Certificate identifier tag.", + "type": "string" + }, + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id", + "custom_origin_trust_store_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Custom Origin Trust Store" + }, + method: "DELETE", + path: "/zones/{zone_id}/acm/custom_trust_store/{custom_origin_trust_store_id}", + extensions: { + "x-api-token-group": [ + "SSL and Certificates Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#ssl:read", + "#ssl:edit" + ], + "x-fern-enum": { + "#ssl:edit": { + "name": "ssl_edit" + }, + "#ssl:read": { + "name": "ssl_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/acm/custom_trust_store/${pathParam(args, "custom_origin_trust_store_id")}`, + }), + }, + { + name: "acm_custom_trust_store_get", + title: "Custom Origin Trust Store Details", + description: "Retrieves details about a specific root CA certificate in the custom origin trust store, including expiration and subject information.", + inputSchema: { + type: "object", + properties: { + "custom_origin_trust_store_id": { + "description": "Certificate identifier tag.", + "type": "string" + }, + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id", + "custom_origin_trust_store_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Custom Origin Trust Store Details" + }, + method: "GET", + path: "/zones/{zone_id}/acm/custom_trust_store/{custom_origin_trust_store_id}", + extensions: { + "x-api-token-group": [ + "SSL and Certificates Write", + "SSL and Certificates Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#ssl:read" + ], + "x-fern-enum": { + "#ssl:read": { + "name": "ssl_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/acm/custom_trust_store/${pathParam(args, "custom_origin_trust_store_id")}`, + }), + }, + { + name: "acm_custom_trust_store_list", + title: "List Custom Origin Trust Store Details", + description: "Get Custom Origin Trust Store for a Zone.", + inputSchema: { + type: "object", + properties: { + "limit": { + "description": "Limit to the number of records returned.", + "type": "integer" + }, + "offset": { + "description": "Offset the results.", + "type": "integer" + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "number" + }, + "per_page": { + "default": 20, + "description": "Number of records per page.", + "type": "number" + }, + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Custom Origin Trust Store Details" + }, + method: "GET", + path: "/zones/{zone_id}/acm/custom_trust_store", + extensions: { + "x-api-token-group": [ + "SSL and Certificates Write", + "SSL and Certificates Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#ssl:read" + ], + "x-fern-enum": { + "#ssl:read": { + "name": "ssl_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/acm/custom_trust_store`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["limit", args["limit"], true], + ["offset", args["offset"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/acm/totalTls/schemas.ts b/src/generated/forge-mcp/acm/totalTls/schemas.ts new file mode 100644 index 00000000..6278dcc5 --- /dev/null +++ b/src/generated/forge-mcp/acm/totalTls/schemas.ts @@ -0,0 +1,25 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `tls-certificates-and-hostnames_certificate_authority-3`. + */ +export const tls_certificates_and_hostnames_certificate_authority_3: JsonSchema = { + "description": "The Certificate Authority that Total TLS certificates will be issued through.", + "enum": [ + "google", + "lets_encrypt", + "ssl_com" + ], + "type": "string" +}; + +/** + * The schema of `tls-certificates-and-hostnames_enabled-3`. + */ +export const tls_certificates_and_hostnames_enabled_3: JsonSchema = { + "description": "If enabled, Total TLS will order a hostname specific TLS certificate for any proxied A, AAAA, or CNAME record in your zone.", + "type": "boolean" +}; diff --git a/src/generated/forge-mcp/acm/totalTls/tools.ts b/src/generated/forge-mcp/acm/totalTls/tools.ts new file mode 100644 index 00000000..177e1816 --- /dev/null +++ b/src/generated/forge-mcp/acm/totalTls/tools.ts @@ -0,0 +1,141 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + tls_certificates_and_hostnames_certificate_authority_3, + tls_certificates_and_hostnames_enabled_3, +} from "./schemas.js"; + +/** + * The tools of `acm.total_tls`. + */ +export const tools: readonly Tool[] = [ + { + name: "acm_total_tls_edit", + title: "Enable or Disable Total TLS", + description: "Set Total TLS Settings or disable the feature for a Zone.", + inputSchema: { + type: "object", + properties: { + "body": { + "properties": { + "certificate_authority": { + "$ref": "#/$defs/tls-certificates-and-hostnames_certificate_authority-3", + "description": "The Certificate Authority that Total TLS certificates will be issued through." + }, + "enabled": { + "$ref": "#/$defs/tls-certificates-and-hostnames_enabled-3", + "description": "If enabled, Total TLS will order a hostname specific TLS certificate for any proxied A, AAAA, or CNAME record in your zone." + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "tls-certificates-and-hostnames_certificate_authority-3": tls_certificates_and_hostnames_certificate_authority_3, + "tls-certificates-and-hostnames_enabled-3": tls_certificates_and_hostnames_enabled_3, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Enable or Disable Total TLS" + }, + method: "POST", + path: "/zones/{zone_id}/acm/total_tls", + extensions: { + "x-api-token-group": [ + "SSL and Certificates Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#ssl:read", + "#ssl:edit" + ], + "x-fern-enum": { + "#ssl:edit": { + "name": "ssl_edit" + }, + "#ssl:read": { + "name": "ssl_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/acm/total_tls`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "acm_total_tls_get", + title: "Total TLS Settings Details", + description: "Get Total TLS Settings for a Zone.", + inputSchema: { + type: "object", + properties: { + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Total TLS Settings Details" + }, + method: "GET", + path: "/zones/{zone_id}/acm/total_tls", + extensions: { + "x-api-token-group": [ + "SSL and Certificates Write", + "SSL and Certificates Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#ssl:read" + ], + "x-fern-enum": { + "#ssl:read": { + "name": "ssl_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/acm/total_tls`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/addressMaps/accounts/tools.ts b/src/generated/forge-mcp/addressing/addressMaps/accounts/tools.ts new file mode 100644 index 00000000..7c956fad --- /dev/null +++ b/src/generated/forge-mcp/addressing/addressMaps/accounts/tools.ts @@ -0,0 +1,93 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `addressing.address_maps.accounts`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_address_maps_accounts_delete", + title: "Remove an account membership from an Address Map", + description: "Remove an account as a member of a particular address map.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "member_account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + } + }, + required: [ + "account_id", + "address_map_id", + "member_account_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Remove an account membership from an Address Map" + }, + method: "DELETE", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}/accounts/{member_account_id}", + extensions: { + "x-api-token-group": [ + "Address Maps Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}/accounts/${pathParam(args, "member_account_id")}`, + }), + }, + { + name: "addressing_address_maps_accounts_update", + title: "Add an account membership to an Address Map", + description: "Add an account as a member of a particular address map.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "member_account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + } + }, + required: [ + "account_id", + "address_map_id", + "member_account_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Add an account membership to an Address Map" + }, + method: "PUT", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}/accounts/{member_account_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}/accounts/${pathParam(args, "member_account_id")}`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/addressMaps/ips/tools.ts b/src/generated/forge-mcp/addressing/addressMaps/ips/tools.ts new file mode 100644 index 00000000..b0d5e657 --- /dev/null +++ b/src/generated/forge-mcp/addressing/addressMaps/ips/tools.ts @@ -0,0 +1,210 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { addressing_ip_address } from "../schemas.js"; + +/** + * The tools of `addressing.address_maps.ips`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_address_maps_ips_delete", + title: "Remove an IP from an Address Map", + description: "Remove an IP from a particular address map.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "ip_address": { + "description": "An IPv4 or IPv6 address.", + "type": "string" + } + }, + required: [ + "account_id", + "address_map_id", + "ip_address" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Remove an IP from an Address Map" + }, + method: "DELETE", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}/ips/{ip_address}", + extensions: { + "x-api-token-group": [ + "Address Maps Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}/ips/${pathParam(args, "ip_address")}`, + }), + }, + { + name: "addressing_address_maps_ips_delete_bulk", + title: "Remove Multiple IPs from an Address Map", + description: "Remove multiple IPs from a particular address map.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "body": { + "properties": { + "ips": { + "items": { + "$ref": "#/$defs/addressing_ip_address" + }, + "type": "array" + } + }, + "required": [ + "ips" + ], + "type": "object" + } + }, + required: [ + "account_id", + "address_map_id", + "body" + ], + $defs: { + "addressing_ip_address": addressing_ip_address, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Remove Multiple IPs from an Address Map" + }, + method: "DELETE", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}/ips", + extensions: { + "x-api-token-group": [ + "Address Maps Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}/ips`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_address_maps_ips_update", + title: "Add an IP to an Address Map", + description: "Add an IP from a prefix owned by the account to a particular address map.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "ip_address": { + "description": "An IPv4 or IPv6 address.", + "type": "string" + } + }, + required: [ + "account_id", + "address_map_id", + "ip_address" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Add an IP to an Address Map" + }, + method: "PUT", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}/ips/{ip_address}", + extensions: { + "x-api-token-group": [ + "Address Maps Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}/ips/${pathParam(args, "ip_address")}`, + }), + }, + { + name: "addressing_address_maps_ips_update_bulk", + title: "Add Multiple IPs to an Address Map", + description: "Add multiple IPs to a particular address map.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "body": { + "properties": { + "ips": { + "items": { + "$ref": "#/$defs/addressing_ip_address" + }, + "type": "array" + } + }, + "required": [ + "ips" + ], + "type": "object" + } + }, + required: [ + "account_id", + "address_map_id", + "body" + ], + $defs: { + "addressing_ip_address": addressing_ip_address, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Add Multiple IPs to an Address Map" + }, + method: "POST", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}/ips", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}/ips`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/addressMaps/schemas.ts b/src/generated/forge-mcp/addressing/addressMaps/schemas.ts new file mode 100644 index 00000000..b0582b8a --- /dev/null +++ b/src/generated/forge-mcp/addressing/addressMaps/schemas.ts @@ -0,0 +1,105 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `addressing_address-maps-membership-request`. + */ +export const addressing_address_maps_membership_request: JsonSchema = { + "properties": { + "identifier": { + "$ref": "#/$defs/addressing_identifier", + "description": "The identifier for the membership (eg. a zone or account tag)." + }, + "kind": { + "$ref": "#/$defs/addressing_kind", + "description": "The type of the membership." + } + }, + "type": "object" +}; + +/** + * The schema of `addressing_default_sni`. + */ +export const addressing_default_sni: JsonSchema = { + "description": "If you have legacy TLS clients which do not send the TLS server name indicator, then you can specify one default SNI on the map. If Cloudflare receives a TLS handshake from a client without an SNI, it will respond with the default SNI on those IPs. The default SNI can be any valid zone or subdomain owned by the account.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +}; + +/** + * The schema of `addressing_description-2`. + */ +export const addressing_description_2: JsonSchema = { + "description": "An optional description field which may be used to describe the types of IPs or zones on the map.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +}; + +/** + * The schema of `addressing_enabled`. + */ +export const addressing_enabled: JsonSchema = { + "description": "Whether the Address Map is enabled or not. Cloudflare's DNS will not respond with IP addresses on an Address Map until the map is enabled.", + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] +}; + +/** + * The schema of `addressing_identifier`. + */ +export const addressing_identifier: JsonSchema = { + "description": "The identifier for the membership (eg. a zone or account tag).", + "type": "string" +}; + +/** + * The schema of `addressing_ip_address`. + */ +export const addressing_ip_address: JsonSchema = { + "description": "An IPv4 or IPv6 address.", + "type": "string" +}; + +/** + * The schema of `addressing_kind`. + */ +export const addressing_kind: JsonSchema = { + "description": "The type of the membership.", + "enum": [ + "zone", + "account" + ], + "type": "string" +}; + +/** + * The schema of `addressing_membership_requests`. + */ +export const addressing_membership_requests: JsonSchema = { + "description": "Zones and Accounts which will be assigned IPs on this Address Map. A zone membership will take priority over an account membership.", + "items": { + "$ref": "#/$defs/addressing_address-maps-membership-request" + }, + "type": "array" +}; diff --git a/src/generated/forge-mcp/addressing/addressMaps/tools.ts b/src/generated/forge-mcp/addressing/addressMaps/tools.ts new file mode 100644 index 00000000..4429394c --- /dev/null +++ b/src/generated/forge-mcp/addressing/addressMaps/tools.ts @@ -0,0 +1,267 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + addressing_address_maps_membership_request, + addressing_default_sni, + addressing_description_2, + addressing_enabled, + addressing_identifier, + addressing_ip_address, + addressing_kind, + addressing_membership_requests, +} from "./schemas.js"; + +/** + * The tools of `addressing.address_maps`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_address_maps_create", + title: "Create Address Map", + description: "Create a new address map under the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "body": { + "properties": { + "description": { + "$ref": "#/$defs/addressing_description-2", + "description": "An optional description field which may be used to describe the types of IPs or zones on the map." + }, + "enabled": { + "$ref": "#/$defs/addressing_enabled", + "default": false, + "description": "Whether the Address Map is enabled or not. Cloudflare's DNS will not respond with IP addresses on an Address Map until the map is enabled." + }, + "ips": { + "items": { + "$ref": "#/$defs/addressing_ip_address" + }, + "type": "array" + }, + "memberships": { + "$ref": "#/$defs/addressing_membership_requests", + "description": "Zones and Accounts which will be assigned IPs on this Address Map. A zone membership will take priority over an account membership." + } + }, + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "addressing_address-maps-membership-request": addressing_address_maps_membership_request, + "addressing_description-2": addressing_description_2, + "addressing_enabled": addressing_enabled, + "addressing_identifier": addressing_identifier, + "addressing_ip_address": addressing_ip_address, + "addressing_kind": addressing_kind, + "addressing_membership_requests": addressing_membership_requests, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Address Map" + }, + method: "POST", + path: "/accounts/{account_id}/addressing/address_maps", + extensions: { + "x-api-token-group": [ + "Address Maps Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_address_maps_delete", + title: "Delete Address Map", + description: "Delete a particular address map owned by the account. An Address Map must be disabled before it can be deleted.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + } + }, + required: [ + "account_id", + "address_map_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Address Map" + }, + method: "DELETE", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}", + extensions: { + "x-api-token-group": [ + "Address Maps Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}`, + }), + }, + { + name: "addressing_address_maps_edit", + title: "Update Address Map", + description: "Modify properties of an address map owned by the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "body": { + "properties": { + "default_sni": { + "$ref": "#/$defs/addressing_default_sni", + "description": "If you have legacy TLS clients which do not send the TLS server name indicator, then you can specify one default SNI on the map. If Cloudflare receives a TLS handshake from a client without an SNI, it will respond with the default SNI on those IPs. The default SNI can be any valid zone or subdomain owned by the account." + }, + "description": { + "$ref": "#/$defs/addressing_description-2", + "description": "An optional description field which may be used to describe the types of IPs or zones on the map." + }, + "enabled": { + "$ref": "#/$defs/addressing_enabled", + "default": false, + "description": "Whether the Address Map is enabled or not. Cloudflare's DNS will not respond with IP addresses on an Address Map until the map is enabled." + } + }, + "type": "object" + } + }, + required: [ + "account_id", + "address_map_id", + "body" + ], + $defs: { + "addressing_default_sni": addressing_default_sni, + "addressing_description-2": addressing_description_2, + "addressing_enabled": addressing_enabled, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Address Map" + }, + method: "PATCH", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}", + extensions: { + "x-api-token-group": [ + "Address Maps Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_address_maps_get", + title: "Address Map Details", + description: "Show a particular address map owned by the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + } + }, + required: [ + "account_id", + "address_map_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Address Map Details" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}", + extensions: { + "x-api-token-group": [ + "Address Maps Write", + "Address Maps Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}`, + }), + }, + { + name: "addressing_address_maps_list", + title: "List Address Maps", + description: "List all address maps owned by the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Address Maps" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/address_maps", + extensions: { + "x-api-token-group": [ + "Address Maps Write", + "Address Maps Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/addressMaps/zones/schemas.ts b/src/generated/forge-mcp/addressing/addressMaps/zones/schemas.ts new file mode 100644 index 00000000..735abebc --- /dev/null +++ b/src/generated/forge-mcp/addressing/addressMaps/zones/schemas.ts @@ -0,0 +1,12 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `addressing_zone_identifier`. + */ +export const addressing_zone_identifier: JsonSchema = { + "description": "Identifier of a zone.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/addressing/addressMaps/zones/tools.ts b/src/generated/forge-mcp/addressing/addressMaps/zones/tools.ts new file mode 100644 index 00000000..af3c9965 --- /dev/null +++ b/src/generated/forge-mcp/addressing/addressMaps/zones/tools.ts @@ -0,0 +1,205 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { addressing_zone_identifier } from "./schemas.js"; + +/** + * The tools of `addressing.address_maps.zones`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_address_maps_zones_delete", + title: "Remove a zone membership from an Address Map", + description: "Remove a zone as a member of a particular address map.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "member_zone_id": { + "description": "Identifier of a zone.", + "type": "string" + } + }, + required: [ + "account_id", + "address_map_id", + "member_zone_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Remove a zone membership from an Address Map" + }, + method: "DELETE", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}/zones/{member_zone_id}", + extensions: { + "x-api-token-group": [ + "Address Maps Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}/zones/${pathParam(args, "member_zone_id")}`, + }), + }, + { + name: "addressing_address_maps_zones_delete_bulk", + title: "Remove Multiple Zones from an Address Map", + description: "Remove multiple zones as members of a particular address map.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "body": { + "properties": { + "zones": { + "items": { + "$ref": "#/$defs/addressing_zone_identifier" + }, + "type": "array" + } + }, + "required": [ + "zones" + ], + "type": "object" + } + }, + required: [ + "account_id", + "address_map_id", + "body" + ], + $defs: { + "addressing_zone_identifier": addressing_zone_identifier, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Remove Multiple Zones from an Address Map" + }, + method: "DELETE", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}/zones", + extensions: { + "x-api-token-group": [ + "Address Maps Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}/zones`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_address_maps_zones_update", + title: "Add a zone membership to an Address Map", + description: "Add a zone as a member of a particular address map.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "member_zone_id": { + "description": "Identifier of a zone.", + "type": "string" + } + }, + required: [ + "account_id", + "address_map_id", + "member_zone_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Add a zone membership to an Address Map" + }, + method: "PUT", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}/zones/{member_zone_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}/zones/${pathParam(args, "member_zone_id")}`, + }), + }, + { + name: "addressing_address_maps_zones_update_bulk", + title: "Add Multiple Zones to an Address Map", + description: "Add multiple zones as members of a particular address map.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "address_map_id": { + "description": "Identifier of an Address Map.", + "type": "string" + }, + "body": { + "properties": { + "zones": { + "items": { + "$ref": "#/$defs/addressing_zone_identifier" + }, + "type": "array" + } + }, + "required": [ + "zones" + ], + "type": "object" + } + }, + required: [ + "account_id", + "address_map_id", + "body" + ], + $defs: { + "addressing_zone_identifier": addressing_zone_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Add Multiple Zones to an Address Map" + }, + method: "POST", + path: "/accounts/{account_id}/addressing/address_maps/{address_map_id}/zones", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/address_maps/${pathParam(args, "address_map_id")}/zones`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/leases/tools.ts b/src/generated/forge-mcp/addressing/leases/tools.ts new file mode 100644 index 00000000..24e4ee5f --- /dev/null +++ b/src/generated/forge-mcp/addressing/leases/tools.ts @@ -0,0 +1,42 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `addressing.leases`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_leases_list", + title: "List Leases", + description: "List all leases owned by the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Leases" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/leases", + extensions: { + "x-api-token-group": null + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/leases`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/loaDocuments/tools.ts b/src/generated/forge-mcp/addressing/loaDocuments/tools.ts new file mode 100644 index 00000000..05537d1d --- /dev/null +++ b/src/generated/forge-mcp/addressing/loaDocuments/tools.ts @@ -0,0 +1,85 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `addressing.loa_documents`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_loa_documents_get", + title: "Download LOA Document", + description: "Download specified LOA document under the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "loa_document_id": { + "description": "Identifier for the uploaded LOA document.", + "type": "string" + } + }, + required: [ + "account_id", + "loa_document_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Download LOA Document" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/loa_documents/{loa_document_id}/download", + extensions: { + "x-api-token-group": [ + "Magic Transit Read", + "Magic Transit Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/loa_documents/${pathParam(args, "loa_document_id")}/download`, + }), + }, + { + name: "addressing_loa_documents_list", + title: "List LOA Documents", + description: "List all LOA documents uploaded under the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List LOA Documents" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/loa_documents", + extensions: { + "x-api-token-group": [ + "Magic Transit Read", + "Magic Transit Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/loa_documents`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/prefixes/bgpPrefixes/schemas.ts b/src/generated/forge-mcp/addressing/prefixes/bgpPrefixes/schemas.ts new file mode 100644 index 00000000..78a07436 --- /dev/null +++ b/src/generated/forge-mcp/addressing/prefixes/bgpPrefixes/schemas.ts @@ -0,0 +1,70 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `addressing_asn_prepend_count`. + */ +export const addressing_asn_prepend_count: JsonSchema = { + "description": "Number of times to prepend the Cloudflare ASN to the BGP AS-Path attribute", + "type": "integer" +}; + +/** + * The schema of `addressing_auto_advertise_withdraw`. + */ +export const addressing_auto_advertise_withdraw: JsonSchema = { + "description": "Determines if Cloudflare advertises a BYOIP BGP prefix even when there is no matching BGP prefix in the Magic routing table. When true, Cloudflare will automatically withdraw the BGP prefix when there are no matching BGP routes, and will resume advertising when there is at least one matching BGP route.", + "type": "boolean" +}; + +/** + * The schema of `addressing_bgp_prefix_create`. + */ +export const addressing_bgp_prefix_create: JsonSchema = { + "properties": { + "cidr": { + "$ref": "#/$defs/addressing_cidr", + "description": "IP Prefix in Classless Inter-Domain Routing format." + } + }, + "required": [ + "cidr" + ], + "type": "object" +}; + +/** + * The schema of `addressing_bgp_prefix_update_advertisement`. + */ +export const addressing_bgp_prefix_update_advertisement: JsonSchema = { + "properties": { + "asn_prepend_count": { + "$ref": "#/$defs/addressing_asn_prepend_count", + "default": 0, + "description": "Number of times to prepend the Cloudflare ASN to the BGP AS-Path attribute" + }, + "auto_advertise_withdraw": { + "$ref": "#/$defs/addressing_auto_advertise_withdraw", + "default": false, + "description": "Determines if Cloudflare advertises a BYOIP BGP prefix even when there is no matching BGP prefix in the Magic routing table. When true, Cloudflare will automatically withdraw the BGP prefix when there are no matching BGP routes, and will resume advertising when there is at least one matching BGP route." + }, + "on_demand": { + "$ref": "#/$defs/addressing_bgp_prefix_update_advertisement_on_demand" + } + }, + "type": "object" +}; + +/** + * The schema of `addressing_bgp_prefix_update_advertisement_on_demand`. + */ +export const addressing_bgp_prefix_update_advertisement_on_demand: JsonSchema = { + "properties": { + "advertised": { + "type": "boolean" + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/addressing/prefixes/bgpPrefixes/tools.ts b/src/generated/forge-mcp/addressing/prefixes/bgpPrefixes/tools.ts new file mode 100644 index 00000000..7c462d55 --- /dev/null +++ b/src/generated/forge-mcp/addressing/prefixes/bgpPrefixes/tools.ts @@ -0,0 +1,250 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { addressing_cidr } from "../schemas.js"; +import { + addressing_asn_prepend_count, + addressing_auto_advertise_withdraw, + addressing_bgp_prefix_create, + addressing_bgp_prefix_update_advertisement, + addressing_bgp_prefix_update_advertisement_on_demand, +} from "./schemas.js"; + +/** + * The tools of `addressing.prefixes.bgp_prefixes`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_prefixes_bgp_prefixes_create", + title: "Create BGP Prefix", + description: "Create a BGP prefix, controlling the BGP advertisement status of a specific subnet. When created, BGP prefixes are initially withdrawn, and can be advertised with the Update BGP Prefix API.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/addressing_bgp_prefix_create" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id", + "body" + ], + $defs: { + "addressing_bgp_prefix_create": addressing_bgp_prefix_create, + "addressing_cidr": addressing_cidr, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create BGP Prefix" + }, + method: "POST", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/bgp/prefixes", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/bgp/prefixes`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_prefixes_bgp_prefixes_delete", + title: "Delete BGP Prefix", + description: "Delete a BGP Prefix associated with the specified IP Prefix. A BGP Prefix must be withdrawn before it can be deleted.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "bgp_prefix_id": { + "description": "Identifier of BGP Prefix.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id", + "bgp_prefix_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete BGP Prefix" + }, + method: "DELETE", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/bgp/prefixes/{bgp_prefix_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/bgp/prefixes/${pathParam(args, "bgp_prefix_id")}`, + }), + }, + { + name: "addressing_prefixes_bgp_prefixes_edit", + title: "Update BGP Prefix", + description: "Update the properties of a BGP Prefix, such as the on demand advertisement status (advertised or withdrawn).", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "bgp_prefix_id": { + "description": "Identifier of BGP Prefix.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/addressing_bgp_prefix_update_advertisement" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id", + "bgp_prefix_id", + "body" + ], + $defs: { + "addressing_asn_prepend_count": addressing_asn_prepend_count, + "addressing_auto_advertise_withdraw": addressing_auto_advertise_withdraw, + "addressing_bgp_prefix_update_advertisement": addressing_bgp_prefix_update_advertisement, + "addressing_bgp_prefix_update_advertisement_on_demand": addressing_bgp_prefix_update_advertisement_on_demand, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update BGP Prefix" + }, + method: "PATCH", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/bgp/prefixes/{bgp_prefix_id}", + extensions: { + "x-api-token-group": [ + "Magic Transit Write", + "IP Prefixes: Write", + "IP Prefixes: BGP On Demand Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/bgp/prefixes/${pathParam(args, "bgp_prefix_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_prefixes_bgp_prefixes_get", + title: "Fetch BGP Prefix", + description: "Retrieve a single BGP Prefix according to its identifier", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "bgp_prefix_id": { + "description": "Identifier of BGP Prefix.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id", + "bgp_prefix_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Fetch BGP Prefix" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/bgp/prefixes/{bgp_prefix_id}", + extensions: { + "x-api-token-group": [ + "Magic Transit Read", + "Magic Transit Write", + "IP Prefixes: Write", + "IP Prefixes: Read", + "IP Prefixes: BGP On Demand Write", + "IP Prefixes: BGP On Demand Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/bgp/prefixes/${pathParam(args, "bgp_prefix_id")}`, + }), + }, + { + name: "addressing_prefixes_bgp_prefixes_list", + title: "List BGP Prefixes", + description: "List all BGP Prefixes within the specified IP Prefix. BGP Prefixes are used to control which specific subnets are advertised to the Internet. It is possible to advertise subnets more specific than an IP Prefix by creating more specific BGP Prefixes.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List BGP Prefixes" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/bgp/prefixes", + extensions: { + "x-api-token-group": [ + "Magic Transit Read", + "Magic Transit Write", + "IP Prefixes: Write", + "IP Prefixes: Read", + "IP Prefixes: BGP On Demand Write", + "IP Prefixes: BGP On Demand Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/bgp/prefixes`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/prefixes/delegations/schemas.ts b/src/generated/forge-mcp/addressing/prefixes/delegations/schemas.ts new file mode 100644 index 00000000..0cea543b --- /dev/null +++ b/src/generated/forge-mcp/addressing/prefixes/delegations/schemas.ts @@ -0,0 +1,12 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `addressing_delegated_account_identifier`. + */ +export const addressing_delegated_account_identifier: JsonSchema = { + "description": "Account identifier for the account to which prefix is being delegated.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/addressing/prefixes/delegations/tools.ts b/src/generated/forge-mcp/addressing/prefixes/delegations/tools.ts new file mode 100644 index 00000000..e4f30f5d --- /dev/null +++ b/src/generated/forge-mcp/addressing/prefixes/delegations/tools.ts @@ -0,0 +1,152 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { addressing_cidr } from "../schemas.js"; +import { addressing_delegated_account_identifier } from "./schemas.js"; + +/** + * The tools of `addressing.prefixes.delegations`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_prefixes_delegations_create", + title: "Create Prefix Delegation", + description: "Create a new account delegation for a given IP prefix.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "body": { + "properties": { + "cidr": { + "$ref": "#/$defs/addressing_cidr", + "description": "IP Prefix in Classless Inter-Domain Routing format." + }, + "delegated_account_id": { + "$ref": "#/$defs/addressing_delegated_account_identifier", + "description": "Account identifier for the account to which prefix is being delegated." + } + }, + "required": [ + "cidr", + "delegated_account_id" + ], + "type": "object" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id", + "body" + ], + $defs: { + "addressing_cidr": addressing_cidr, + "addressing_delegated_account_identifier": addressing_delegated_account_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Prefix Delegation" + }, + method: "POST", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/delegations", + extensions: { + "x-api-token-group": [ + "IP Prefixes: Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/delegations`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_prefixes_delegations_delete", + title: "Delete Prefix Delegation", + description: "Delete an account delegation for a given IP prefix.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "delegation_id": { + "description": "Identifier of a Delegation.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id", + "delegation_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Prefix Delegation" + }, + method: "DELETE", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/delegations/{delegation_id}", + extensions: { + "x-api-token-group": [ + "IP Prefixes: Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/delegations/${pathParam(args, "delegation_id")}`, + }), + }, + { + name: "addressing_prefixes_delegations_list", + title: "List Prefix Delegations", + description: "List all delegations for a given account IP prefix.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Prefix Delegations" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/delegations", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/delegations`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/prefixes/schemas.ts b/src/generated/forge-mcp/addressing/prefixes/schemas.ts new file mode 100644 index 00000000..34488cf5 --- /dev/null +++ b/src/generated/forge-mcp/addressing/prefixes/schemas.ts @@ -0,0 +1,36 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `addressing_asn`. + */ +export const addressing_asn: JsonSchema = { + "description": "Autonomous System Number (ASN) the prefix will be advertised under.", + "type": "integer" +}; + +/** + * The schema of `addressing_cidr`. + */ +export const addressing_cidr: JsonSchema = { + "description": "IP Prefix in Classless Inter-Domain Routing format.", + "type": "string" +}; + +/** + * The schema of `addressing_delegate_loa_creation`. + */ +export const addressing_delegate_loa_creation: JsonSchema = { + "description": "Whether Cloudflare is allowed to generate the LOA document on behalf of the prefix owner.", + "type": "boolean" +}; + +/** + * The schema of `addressing_description`. + */ +export const addressing_description: JsonSchema = { + "description": "Description of the prefix.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/addressing/prefixes/serviceBindings/schemas.ts b/src/generated/forge-mcp/addressing/prefixes/serviceBindings/schemas.ts new file mode 100644 index 00000000..f1c356b7 --- /dev/null +++ b/src/generated/forge-mcp/addressing/prefixes/serviceBindings/schemas.ts @@ -0,0 +1,25 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `addressing_create_binding_request`. + */ +export const addressing_create_binding_request: JsonSchema = { + "properties": { + "cidr": { + "$ref": "#/$defs/addressing_cidr", + "description": "IP Prefix in Classless Inter-Domain Routing format." + }, + "service_id": { + "$ref": "#/$defs/addressing_service_identifier", + "description": "Identifier of a Service on the Cloudflare network. Available services and their IDs may be found in the\n**List Services** endpoint.\n" + } + }, + "required": [ + "cidr", + "service_id" + ], + "type": "object" +}; diff --git a/src/generated/forge-mcp/addressing/prefixes/serviceBindings/tools.ts b/src/generated/forge-mcp/addressing/prefixes/serviceBindings/tools.ts new file mode 100644 index 00000000..6cb95c3d --- /dev/null +++ b/src/generated/forge-mcp/addressing/prefixes/serviceBindings/tools.ts @@ -0,0 +1,190 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { addressing_service_identifier } from "../../schemas.js"; +import { addressing_cidr } from "../schemas.js"; +import { addressing_create_binding_request } from "./schemas.js"; + +/** + * The tools of `addressing.prefixes.service_bindings`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_prefixes_service_bindings_create", + title: "Create Service Binding", + description: "Creates a new Service Binding, routing traffic to IPs within the given CIDR to a service running on Cloudflare's network.\n**NOTE:** The first Service Binding created for an IP Prefix must exactly match the IP Prefix's CIDR. Subsequent Service Bindings may be created with a more-specific CIDR. Refer to the [Service Bindings Documentation](https://developers.cloudflare.com/byoip/service-bindings/) for compatibility details.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/addressing_create_binding_request" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id" + ], + $defs: { + "addressing_cidr": addressing_cidr, + "addressing_create_binding_request": addressing_create_binding_request, + "addressing_service_identifier": addressing_service_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Service Binding" + }, + method: "POST", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/bindings", + extensions: { + "x-api-token-group": [ + "IP Prefixes: Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/bindings`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_prefixes_service_bindings_delete", + title: "Delete Service Binding", + description: "Delete a Service Binding", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "binding_id": { + "description": "Identifier of a Service Binding.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id", + "binding_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Service Binding" + }, + method: "DELETE", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/bindings/{binding_id}", + extensions: { + "x-api-token-group": [ + "IP Prefixes: Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/bindings/${pathParam(args, "binding_id")}`, + }), + }, + { + name: "addressing_prefixes_service_bindings_get", + title: "Get Service Binding", + description: "Fetch a single Service Binding", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "binding_id": { + "description": "Identifier of a Service Binding.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id", + "binding_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Service Binding" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/bindings/{binding_id}", + extensions: { + "x-api-token-group": [ + "IP Prefixes: Write", + "IP Prefixes: Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/bindings/${pathParam(args, "binding_id")}`, + }), + }, + { + name: "addressing_prefixes_service_bindings_list", + title: "List Service Bindings", + description: "List the Cloudflare services this prefix is currently bound to. Traffic sent to an address within an IP prefix will be routed to the Cloudflare service of the most-specific Service Binding matching the address.\n**Example:** binding `192.0.2.0/24` to Cloudflare Magic Transit and `192.0.2.1/32` to the Cloudflare CDN would route traffic for `192.0.2.1` to the CDN, and traffic for all other IPs in the prefix to Cloudflare Magic Transit.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Service Bindings" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/bindings", + extensions: { + "x-api-token-group": [ + "IP Prefixes: Write", + "IP Prefixes: Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/bindings`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/prefixes/tools.ts b/src/generated/forge-mcp/addressing/prefixes/tools.ts new file mode 100644 index 00000000..de19abf9 --- /dev/null +++ b/src/generated/forge-mcp/addressing/prefixes/tools.ts @@ -0,0 +1,267 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { addressing_loa_document_identifier } from "../schemas.js"; +import { + addressing_asn, + addressing_cidr, + addressing_delegate_loa_creation, + addressing_description, +} from "./schemas.js"; + +/** + * The tools of `addressing.prefixes`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_prefixes_create", + title: "Add Prefix", + description: "Add a new prefix under the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "body": { + "properties": { + "asn": { + "$ref": "#/$defs/addressing_asn", + "description": "Autonomous System Number (ASN) the prefix will be advertised under." + }, + "cidr": { + "$ref": "#/$defs/addressing_cidr", + "description": "IP Prefix in Classless Inter-Domain Routing format." + }, + "delegate_loa_creation": { + "$ref": "#/$defs/addressing_delegate_loa_creation", + "default": false, + "description": "Whether Cloudflare is allowed to generate the LOA document on behalf of the prefix owner." + }, + "description": { + "$ref": "#/$defs/addressing_description", + "description": "Description of the prefix." + }, + "loa_document_id": { + "$ref": "#/$defs/addressing_loa_document_identifier", + "description": "Identifier for the uploaded LOA document." + } + }, + "required": [ + "asn", + "cidr" + ], + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "addressing_asn": addressing_asn, + "addressing_cidr": addressing_cidr, + "addressing_delegate_loa_creation": addressing_delegate_loa_creation, + "addressing_description": addressing_description, + "addressing_loa_document_identifier": addressing_loa_document_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Add Prefix" + }, + method: "POST", + path: "/accounts/{account_id}/addressing/prefixes", + extensions: { + "x-api-token-group": null + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_prefixes_delete", + title: "Delete Prefix", + description: "Delete an unapproved prefix owned by the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Prefix" + }, + method: "DELETE", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}", + extensions: { + "x-api-token-group": [ + "Magic Transit Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}`, + }), + }, + { + name: "addressing_prefixes_edit", + title: "Update Prefix Description", + description: "Modify the description for a prefix owned by the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "body": { + "properties": { + "description": { + "$ref": "#/$defs/addressing_description", + "description": "Description of the prefix." + } + }, + "required": [ + "description" + ], + "type": "object" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id", + "body" + ], + $defs: { + "addressing_description": addressing_description, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Prefix Description" + }, + method: "PATCH", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}", + extensions: { + "x-api-token-group": [ + "Magic Transit Write", + "IP Prefixes: Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_prefixes_get", + title: "Prefix Details", + description: "List a particular prefix owned by the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Prefix Details" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}", + extensions: { + "x-api-token-group": [ + "Magic Transit Read", + "Magic Transit Write", + "IP Prefixes: Write", + "IP Prefixes: Read", + "IP Prefixes: BGP On Demand Write", + "IP Prefixes: BGP On Demand Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}`, + }), + }, + { + name: "addressing_prefixes_list", + title: "List Prefixes", + description: "List all prefixes owned by the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Prefixes" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/prefixes", + extensions: { + "x-api-token-group": [ + "Magic Transit Read", + "Magic Transit Write", + "IP Prefixes: Write", + "IP Prefixes: Read", + "IP Prefixes: BGP On Demand Write", + "IP Prefixes: BGP On Demand Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/prefixes/validate/tools.ts b/src/generated/forge-mcp/addressing/prefixes/validate/tools.ts new file mode 100644 index 00000000..e0f10258 --- /dev/null +++ b/src/generated/forge-mcp/addressing/prefixes/validate/tools.ts @@ -0,0 +1,50 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `addressing.prefixes.validate`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_prefixes_validate_create", + title: "Validate Prefix", + description: "Triggers a new prefix validation. The checks are run asynchronously and include IRR, RPKI, and prefix ownership.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + }, + "prefix_id": { + "description": "Identifier of an IP Prefix.", + "type": "string" + } + }, + required: [ + "account_id", + "prefix_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Validate Prefix" + }, + method: "POST", + path: "/accounts/{account_id}/addressing/prefixes/{prefix_id}/validate", + extensions: { + "x-api-token-group": [ + "Magic Transit Write", + "IP Prefixes: Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/prefixes/${pathParam(args, "prefix_id")}/validate`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/regionalHostnames/regions/tools.ts b/src/generated/forge-mcp/addressing/regionalHostnames/regions/tools.ts new file mode 100644 index 00000000..630264c1 --- /dev/null +++ b/src/generated/forge-mcp/addressing/regionalHostnames/regions/tools.ts @@ -0,0 +1,49 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { dls_identifier } from "../schemas.js"; + +/** + * The tools of `addressing.regional_hostnames.regions`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_regional_hostnames_regions_list", + title: "List Regions", + description: "List all Regional Services regions available for use by this account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/dls_identifier", + "description": "Identifier." + } + }, + required: [ + "account_id" + ], + $defs: { + "dls_identifier": dls_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Regions" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/regional_hostnames/regions", + extensions: { + "x-api-token-group": [ + "DNS Read", + "DNS Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/regional_hostnames/regions`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/regionalHostnames/schemas.ts b/src/generated/forge-mcp/addressing/regionalHostnames/schemas.ts new file mode 100644 index 00000000..272eda73 --- /dev/null +++ b/src/generated/forge-mcp/addressing/regionalHostnames/schemas.ts @@ -0,0 +1,36 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `dls_hostname`. + */ +export const dls_hostname: JsonSchema = { + "description": "DNS hostname to be regionalized, must be a subdomain of the zone. Wildcards are supported for one level, e.g `*.example.com`", + "type": "string" +}; + +/** + * The schema of `dls_identifier`. + */ +export const dls_identifier: JsonSchema = { + "description": "Identifier.", + "type": "string" +}; + +/** + * The schema of `dls_region_key`. + */ +export const dls_region_key: JsonSchema = { + "description": "Identifying key for the region", + "type": "string" +}; + +/** + * The schema of `dls_routing`. + */ +export const dls_routing: JsonSchema = { + "description": "Configure which routing method to use for the regional hostname", + "type": "string" +}; diff --git a/src/generated/forge-mcp/addressing/regionalHostnames/tools.ts b/src/generated/forge-mcp/addressing/regionalHostnames/tools.ts new file mode 100644 index 00000000..db8ba505 --- /dev/null +++ b/src/generated/forge-mcp/addressing/regionalHostnames/tools.ts @@ -0,0 +1,261 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + dls_hostname, + dls_identifier, + dls_region_key, + dls_routing, +} from "./schemas.js"; + +/** + * The tools of `addressing.regional_hostnames`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_regional_hostnames_create", + title: "Create Regional Hostname", + description: "Create a new Regional Hostname entry. Cloudflare will only use data centers that are physically located within the chosen region to decrypt and service HTTPS traffic. Learn more about [Regional Services](https://developers.cloudflare.com/data-localization/regional-services/get-started/).", + inputSchema: { + type: "object", + properties: { + "body": { + "properties": { + "hostname": { + "$ref": "#/$defs/dls_hostname", + "description": "DNS hostname to be regionalized, must be a subdomain of the zone. Wildcards are supported for one level, e.g `*.example.com`" + }, + "region_key": { + "$ref": "#/$defs/dls_region_key", + "description": "Identifying key for the region" + }, + "routing": { + "$ref": "#/$defs/dls_routing", + "default": "dns", + "description": "Configure which routing method to use for the regional hostname" + } + }, + "required": [ + "hostname", + "region_key" + ], + "type": "object" + }, + "zone_id": { + "$ref": "#/$defs/dls_identifier", + "description": "Identifier." + } + }, + required: [ + "zone_id" + ], + $defs: { + "dls_hostname": dls_hostname, + "dls_identifier": dls_identifier, + "dls_region_key": dls_region_key, + "dls_routing": dls_routing, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Regional Hostname" + }, + method: "POST", + path: "/zones/{zone_id}/addressing/regional_hostnames", + extensions: { + "x-api-token-group": [ + "DNS Write" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/addressing/regional_hostnames`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_regional_hostnames_delete", + title: "Delete Regional Hostname", + description: "Delete the region configuration for a specific Regional Hostname.", + inputSchema: { + type: "object", + properties: { + "hostname": { + "$ref": "#/$defs/dls_hostname", + "description": "DNS hostname to be regionalized, must be a subdomain of the zone. Wildcards are supported for one level, e.g `*.example.com`" + }, + "zone_id": { + "$ref": "#/$defs/dls_identifier", + "description": "Identifier." + } + }, + required: [ + "zone_id", + "hostname" + ], + $defs: { + "dls_hostname": dls_hostname, + "dls_identifier": dls_identifier, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Regional Hostname" + }, + method: "DELETE", + path: "/zones/{zone_id}/addressing/regional_hostnames/{hostname}", + extensions: { + "x-api-token-group": [ + "DNS Write" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/addressing/regional_hostnames/${pathParam(args, "hostname")}`, + }), + }, + { + name: "addressing_regional_hostnames_edit", + title: "Update Regional Hostname", + description: "Update the configuration for a specific Regional Hostname. Only the region_key of a hostname is mutable.", + inputSchema: { + type: "object", + properties: { + "body": { + "properties": { + "region_key": { + "$ref": "#/$defs/dls_region_key", + "description": "Identifying key for the region" + } + }, + "required": [ + "region_key" + ], + "type": "object" + }, + "hostname": { + "$ref": "#/$defs/dls_hostname", + "description": "DNS hostname to be regionalized, must be a subdomain of the zone. Wildcards are supported for one level, e.g `*.example.com`" + }, + "zone_id": { + "$ref": "#/$defs/dls_identifier", + "description": "Identifier." + } + }, + required: [ + "zone_id", + "hostname" + ], + $defs: { + "dls_hostname": dls_hostname, + "dls_identifier": dls_identifier, + "dls_region_key": dls_region_key, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Regional Hostname" + }, + method: "PATCH", + path: "/zones/{zone_id}/addressing/regional_hostnames/{hostname}", + extensions: { + "x-api-token-group": [ + "DNS Write" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/addressing/regional_hostnames/${pathParam(args, "hostname")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "addressing_regional_hostnames_get", + title: "Fetch Regional Hostname", + description: "Fetch the configuration for a specific Regional Hostname, within a zone.", + inputSchema: { + type: "object", + properties: { + "hostname": { + "$ref": "#/$defs/dls_hostname", + "description": "DNS hostname to be regionalized, must be a subdomain of the zone. Wildcards are supported for one level, e.g `*.example.com`" + }, + "zone_id": { + "$ref": "#/$defs/dls_identifier", + "description": "Identifier." + } + }, + required: [ + "zone_id", + "hostname" + ], + $defs: { + "dls_hostname": dls_hostname, + "dls_identifier": dls_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Fetch Regional Hostname" + }, + method: "GET", + path: "/zones/{zone_id}/addressing/regional_hostnames/{hostname}", + extensions: { + "x-api-token-group": [ + "DNS Read", + "DNS Write" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/addressing/regional_hostnames/${pathParam(args, "hostname")}`, + }), + }, + { + name: "addressing_regional_hostnames_list", + title: "List Regional Hostnames", + description: "List all Regional Hostnames within a zone.", + inputSchema: { + type: "object", + properties: { + "zone_id": { + "$ref": "#/$defs/dls_identifier", + "description": "Identifier." + } + }, + required: [ + "zone_id" + ], + $defs: { + "dls_identifier": dls_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Regional Hostnames" + }, + method: "GET", + path: "/zones/{zone_id}/addressing/regional_hostnames", + extensions: { + "x-api-token-group": [ + "DNS Read", + "DNS Write" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/addressing/regional_hostnames`, + }), + }, +]; diff --git a/src/generated/forge-mcp/addressing/schemas.ts b/src/generated/forge-mcp/addressing/schemas.ts new file mode 100644 index 00000000..0ffcbc65 --- /dev/null +++ b/src/generated/forge-mcp/addressing/schemas.ts @@ -0,0 +1,27 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../_/index.js"; + +/** + * The schema of `addressing_loa_document_identifier`. + */ +export const addressing_loa_document_identifier: JsonSchema = { + "description": "Identifier for the uploaded LOA document.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +}; + +/** + * The schema of `addressing_service_identifier`. + */ +export const addressing_service_identifier: JsonSchema = { + "description": "Identifier of a Service on the Cloudflare network. Available services and their IDs may be found in the\n**List Services** endpoint.\n", + "type": "string" +}; diff --git a/src/generated/forge-mcp/addressing/services/tools.ts b/src/generated/forge-mcp/addressing/services/tools.ts new file mode 100644 index 00000000..7d87b30f --- /dev/null +++ b/src/generated/forge-mcp/addressing/services/tools.ts @@ -0,0 +1,45 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `addressing.services`. + */ +export const tools: readonly Tool[] = [ + { + name: "addressing_services_list", + title: "List Services", + description: "Bring-Your-Own IP (BYOIP) prefixes onboarded to Cloudflare must be bound to a service running on the Cloudflare network to enable a Cloudflare product on the IP addresses. This endpoint can be used as a reference of available services on the Cloudflare network, and their service IDs.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of a Cloudflare account.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Services" + }, + method: "GET", + path: "/accounts/{account_id}/addressing/services", + extensions: { + "x-api-token-group": [ + "IP Prefixes: Write", + "IP Prefixes: Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/addressing/services`, + }), + }, +]; diff --git a/src/generated/forge-mcp/agentMemory/tools.ts b/src/generated/forge-mcp/agentMemory/tools.ts new file mode 100644 index 00000000..4013ad69 --- /dev/null +++ b/src/generated/forge-mcp/agentMemory/tools.ts @@ -0,0 +1,751 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; + +/** + * The tools of `agent_memory`. + */ +export const tools: readonly Tool[] = [ + { + name: "agent_memory_create_namespace", + title: "Create a namespace", + description: "Creates a new memory namespace owned by the account.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "body": { + "properties": { + "name": { + "description": "Namespace name.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a namespace" + }, + method: "POST", + path: "/accounts/{account_id}/agent-memory/namespaces", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "agent_memory_delete_memory", + title: "Delete a memory", + description: "Deletes a memory by ID. Removes the memory and any source messages linked to it. Returns the deleted memory.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation deletes the memory and any source messages linked to it.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "memory_id": { + "description": "Memory Identifier.", + "type": "string" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + }, + "profile_name": { + "description": "Profile name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name", + "profile_name", + "memory_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a memory" + }, + method: "DELETE", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}/profiles/{profile_name}/memories/{memory_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}/profiles/${pathParam(args, "profile_name")}/memories/${pathParam(args, "memory_id")}`, + }), + }, + { + name: "agent_memory_delete_namespace", + title: "Delete a namespace", + description: "Deletes a namespace.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation deletes the namespace along with all memory profiles, memories, and sessions it contains.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a namespace" + }, + method: "DELETE", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}`, + }), + }, + { + name: "agent_memory_delete_profile", + title: "Delete a profile", + description: "Marks a profile for deletion.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation deletes the profile along with all of its memories and messages.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + }, + "profile_name": { + "description": "Profile name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name", + "profile_name" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a profile" + }, + method: "DELETE", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}/profiles/{profile_name}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}/profiles/${pathParam(args, "profile_name")}`, + }), + }, + { + name: "agent_memory_delete_session", + title: "Delete a session", + description: "Marks all memories and messages in a profile that are tagged with the given session ID for deletion.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation deletes all memories and messages tagged with this session ID.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + }, + "profile_name": { + "description": "Profile name.", + "type": "string" + }, + "session_id": { + "description": "Session identifier.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name", + "profile_name", + "session_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a session" + }, + method: "DELETE", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}/profiles/{profile_name}/sessions/{session_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}/profiles/${pathParam(args, "profile_name")}/sessions/${pathParam(args, "session_id")}`, + }), + }, + { + name: "agent_memory_get_memory", + title: "Get a memory", + description: "Retrieves a memory by ID.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "memory_id": { + "description": "Memory Identifier.", + "type": "string" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + }, + "profile_name": { + "description": "Profile name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name", + "profile_name", + "memory_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a memory" + }, + method: "GET", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}/profiles/{profile_name}/memories/{memory_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}/profiles/${pathParam(args, "profile_name")}/memories/${pathParam(args, "memory_id")}`, + }), + }, + { + name: "agent_memory_get_namespace", + title: "Get a namespace", + description: "Gets a namespace by name.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a namespace" + }, + method: "GET", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}`, + }), + }, + { + name: "agent_memory_ingest", + title: "Ingest messages", + description: "Processes a conversation and extracts structured memories from it. Agent Memory identifies facts, events, instructions, and tasks automatically.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "body": { + "properties": { + "messages": { + "description": "Conversation messages to extract memories from.", + "items": { + "properties": { + "content": { + "description": "Text content of the message.", + "type": "string" + }, + "role": { + "description": "Author role of the message.", + "enum": [ + "system", + "user", + "assistant" + ], + "type": "string" + }, + "timestamp": { + "description": "Message timestamp.", + "type": "string" + } + }, + "required": [ + "content", + "role" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "sessionId": { + "description": "Session identifier.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "messages" + ], + "type": "object" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + }, + "profile_name": { + "description": "Profile name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name", + "profile_name", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Ingest messages" + }, + method: "POST", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}/profiles/{profile_name}/ingest", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}/profiles/${pathParam(args, "profile_name")}/ingest`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "agent_memory_list_memories", + title: "List memories", + description: "List memories stored in a profile.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "cursor": { + "description": "Continuation cursor for paginated results.", + "type": "string" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + }, + "per_page": { + "description": "Number of results per page.", + "type": "integer" + }, + "profile_name": { + "description": "Profile name.", + "type": "string" + }, + "session_id": { + "description": "Session identifier for filtering.", + "type": "string" + }, + "type": { + "description": "Memory type for filtering.", + "enum": [ + "fact", + "event", + "instruction", + "task" + ], + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name", + "profile_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List memories" + }, + method: "GET", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}/profiles/{profile_name}/memories", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}/profiles/${pathParam(args, "profile_name")}/memories`, + query: [ + ["per_page", args["per_page"], true], + ["cursor", args["cursor"], true], + ["session_id", args["session_id"], true], + ["type", args["type"], true], + ], + }), + }, + { + name: "agent_memory_list_namespaces", + title: "List namespaces", + description: "Lists all namespaces for the given account. Results are paginated.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "cursor": { + "description": "Pagination cursor returned by a previous list response.", + "type": "string" + }, + "direction": { + "description": "Direction to sort the results in.", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "order": { + "description": "Field to order the results by.", + "enum": [ + "id", + "name" + ], + "type": "string" + }, + "per_page": { + "description": "Number of results per page.", + "type": "integer" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List namespaces" + }, + method: "GET", + path: "/accounts/{account_id}/agent-memory/namespaces", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces`, + query: [ + ["per_page", args["per_page"], true], + ["order", args["order"], true], + ["direction", args["direction"], true], + ["cursor", args["cursor"], true], + ], + }), + }, + { + name: "agent_memory_list_profiles", + title: "List profiles", + description: "Lists the profiles of a namespace, ordered by name. A profile appears once it has been used.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "cursor": { + "description": "Opaque continuation cursor returned by a previous list response.", + "type": "string" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + }, + "per_page": { + "description": "Number of results per page.", + "type": "integer" + } + }, + required: [ + "account_id", + "namespace_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List profiles" + }, + method: "GET", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}/profiles", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}/profiles`, + query: [ + ["per_page", args["per_page"], true], + ["cursor", args["cursor"], true], + ], + }), + }, + { + name: "agent_memory_recall", + title: "Recall memories", + description: "Retrieves memories relevant to the query and returns a synthesized answer.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "body": { + "properties": { + "query": { + "description": "Natural-language query to match against stored memories.", + "type": "string" + }, + "referenceDate": { + "description": "Temporal anchor for relative date references in the query.", + "type": "string" + }, + "responseLength": { + "description": "Verbosity of the synthesized answer. Defaults to 'medium'.", + "enum": [ + "short", + "medium", + "long" + ], + "type": "string" + }, + "thinkingLevel": { + "description": "Recall intensity / search depth. Defaults to 'low'.", + "enum": [ + "low", + "medium", + "high" + ], + "type": "string" + } + }, + "required": [ + "query" + ], + "type": "object" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + }, + "profile_name": { + "description": "Profile name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name", + "profile_name", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Recall memories" + }, + method: "POST", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}/profiles/{profile_name}/recall", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}/profiles/${pathParam(args, "profile_name")}/recall`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "agent_memory_remember", + title: "Remember a memory", + description: "Stores a single memory explicitly.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "body": { + "properties": { + "content": { + "description": "Raw memory content to store.", + "type": "string" + }, + "sessionId": { + "description": "Session identifier.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "content" + ], + "type": "object" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + }, + "profile_name": { + "description": "Profile name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name", + "profile_name", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Remember a memory" + }, + method: "POST", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}/profiles/{profile_name}/remember", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}/profiles/${pathParam(args, "profile_name")}/remember`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "agent_memory_summary", + title: "Get a profile summary", + description: "Generates a paste-ready prompt block summarizing everything stored in a memory profile.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare Account ID.", + "type": "string" + }, + "body": { + "properties": { + "sessionId": { + "description": "Session identifier.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "namespace_name": { + "description": "Namespace name.", + "type": "string" + }, + "profile_name": { + "description": "Profile name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace_name", + "profile_name", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Get a profile summary" + }, + method: "POST", + path: "/accounts/{account_id}/agent-memory/namespaces/{namespace_name}/profiles/{profile_name}/summary", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/agent-memory/namespaces/${pathParam(args, "namespace_name")}/profiles/${pathParam(args, "profile_name")}/summary`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/ai/authors/tools.ts b/src/generated/forge-mcp/ai/authors/tools.ts new file mode 100644 index 00000000..b0ed6c99 --- /dev/null +++ b/src/generated/forge-mcp/ai/authors/tools.ts @@ -0,0 +1,60 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai.authors`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_authors_list", + title: "Author Search", + description: "Searches Workers AI models by author or organization name.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Author Search" + }, + method: "GET", + path: "/accounts/{account_id}/ai/authors/search", + extensions: { + "x-api-token-group": [ + "Workers AI Write", + "Workers AI Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/authors/search`, + }), + }, +]; diff --git a/src/generated/forge-mcp/ai/finetunes/assets/tools.ts b/src/generated/forge-mcp/ai/finetunes/assets/tools.ts new file mode 100644 index 00000000..d3a3a4ea --- /dev/null +++ b/src/generated/forge-mcp/ai/finetunes/assets/tools.ts @@ -0,0 +1,117 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `ai.finetunes.assets`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_finetunes_assets_create", + title: "Upload a Finetune Asset", + description: "Uploads training data assets for a Workers AI fine-tuning job.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "finetune_id": { + "type": "string" + } + }, + required: [ + "account_id", + "finetune_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Upload a Finetune Asset" + }, + method: "POST", + path: "/accounts/{account_id}/ai/finetunes/{finetune_id}/finetune-assets", + extensions: { + "x-api-token-group": [ + "Workers AI Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/finetunes/${pathParam(args, "finetune_id")}/finetune-assets`, + }), + }, + { + name: "ai_finetunes_assets_download", + title: "Download a Finetune Asset", + description: "Returns a pre-signed R2 URL for downloading a finetune asset file.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "file_name": { + "type": "string" + }, + "finetune_id": { + "type": "string" + } + }, + required: [ + "account_id", + "finetune_id", + "file_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Download a Finetune Asset" + }, + method: "GET", + path: "/accounts/{account_id}/ai/finetunes/{finetune_id}/finetune-assets/{file_name}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/finetunes/${pathParam(args, "finetune_id")}/finetune-assets/${pathParam(args, "file_name")}`, + }), + }, +]; diff --git a/src/generated/forge-mcp/ai/finetunes/public/tools.ts b/src/generated/forge-mcp/ai/finetunes/public/tools.ts new file mode 100644 index 00000000..fa382321 --- /dev/null +++ b/src/generated/forge-mcp/ai/finetunes/public/tools.ts @@ -0,0 +1,79 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `ai.finetunes.public`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_finetunes_public_list", + title: "List Public Finetunes", + description: "Lists publicly available fine-tuned models that can be used with Workers AI.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "limit": { + "default": 20, + "description": "Pagination Limit.", + "type": "number" + }, + "offset": { + "default": 0, + "description": "Pagination Offset.", + "type": "number" + }, + "order_by": { + "description": "Order By Column Name.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Public Finetunes" + }, + method: "GET", + path: "/accounts/{account_id}/ai/finetunes/public", + extensions: { + "x-api-token-group": [ + "Workers AI Write", + "Workers AI Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/finetunes/public`, + query: [ + ["limit", args["limit"], true], + ["offset", args["offset"], true], + ["orderBy", args["order_by"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/ai/finetunes/tools.ts b/src/generated/forge-mcp/ai/finetunes/tools.ts new file mode 100644 index 00000000..3f046a05 --- /dev/null +++ b/src/generated/forge-mcp/ai/finetunes/tools.ts @@ -0,0 +1,182 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai.finetunes`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_finetunes_create", + title: "Create a new Finetune", + description: "Creates a new fine-tuning job for a Workers AI model using custom training data.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "description": { + "type": "string" + }, + "model": { + "type": "string" + }, + "name": { + "type": "string" + }, + "public": { + "default": false, + "type": "boolean" + } + }, + "required": [ + "model", + "name" + ], + "type": "object" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a new Finetune" + }, + method: "POST", + path: "/accounts/{account_id}/ai/finetunes", + extensions: { + "x-api-token-group": [ + "Workers AI Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/finetunes`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_finetunes_delete", + title: "Delete a Finetune", + description: "Delete a finetune. Any in-flight requests referencing the lora will fail after the files are deleted.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "finetune_id": { + "type": "string" + } + }, + required: [ + "account_id", + "finetune_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a Finetune" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai/finetunes/{finetune_id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/finetunes/${pathParam(args, "finetune_id")}`, + }), + }, + { + name: "ai_finetunes_list", + title: "List Finetunes", + description: "Lists all fine-tuning jobs created by the account, including status and metrics.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Finetunes" + }, + method: "GET", + path: "/accounts/{account_id}/ai/finetunes", + extensions: { + "x-api-token-group": [ + "Workers AI Write", + "Workers AI Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/finetunes`, + }), + }, +]; diff --git a/src/generated/forge-mcp/ai/models/tools.ts b/src/generated/forge-mcp/ai/models/tools.ts new file mode 100644 index 00000000..8f73cfbc --- /dev/null +++ b/src/generated/forge-mcp/ai/models/tools.ts @@ -0,0 +1,115 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai.models`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_models_list", + title: "Model Search", + description: "Searches Workers AI models by name or description.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "author": { + "default": "", + "description": "Filter by Author.", + "type": "string" + }, + "format": { + "description": "If set, return models in the requested marketplace format instead of the default response.", + "enum": [ + "openrouter" + ], + "type": "string" + }, + "hide_experimental": { + "default": false, + "description": "Filter to hide experimental models.", + "type": "boolean" + }, + "include_deprecated": { + "default": false, + "description": "If true, include models for up to three months after their deprecation date. Defaults to false.", + "type": "boolean" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 100, + "type": "integer" + }, + "search": { + "default": "", + "description": "Search.", + "type": "string" + }, + "source": { + "description": "Filter by Source Id.", + "type": "number" + }, + "task": { + "default": "", + "description": "Filter by Task Name.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Model Search" + }, + method: "GET", + path: "/accounts/{account_id}/ai/models/search", + extensions: { + "x-api-token-group": [ + "Workers AI Write", + "Workers AI Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/models/search`, + query: [ + ["per_page", args["per_page"], true], + ["page", args["page"], true], + ["task", args["task"], true], + ["author", args["author"], true], + ["source", args["source"], true], + ["hide_experimental", args["hide_experimental"], true], + ["search", args["search"], true], + ["include_deprecated", args["include_deprecated"], true], + ["format", args["format"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/ai/tasks/tools.ts b/src/generated/forge-mcp/ai/tasks/tools.ts new file mode 100644 index 00000000..f69b1730 --- /dev/null +++ b/src/generated/forge-mcp/ai/tasks/tools.ts @@ -0,0 +1,60 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai.tasks`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_tasks_list", + title: "Task Search", + description: "Searches Workers AI models by task type (e.g., text-generation, embeddings).", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Task Search" + }, + method: "GET", + path: "/accounts/{account_id}/ai/tasks/search", + extensions: { + "x-api-token-group": [ + "Workers AI Write", + "Workers AI Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/tasks/search`, + }), + }, +]; diff --git a/src/generated/forge-mcp/ai/tools.ts b/src/generated/forge-mcp/ai/tools.ts new file mode 100644 index 00000000..453a6778 --- /dev/null +++ b/src/generated/forge-mcp/ai/tools.ts @@ -0,0 +1,1202 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; + +/** + * The tools of `ai`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_get_model_schema", + title: "Get an AI model's input and output schemas", + description: "Retrieves the input and output JSON Schema definitions for an AI model. Use these definitions to determine the model-specific request fields and response format.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID used for this AI model request.", + "type": "string" + }, + "model": { + "description": "AI model identifier, including its namespace and model name.", + "type": "string" + } + }, + required: [ + "account_id", + "model" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get an AI model's input and output schemas" + }, + method: "GET", + path: "/accounts/{account_id}/ai/models/schema", + extensions: { + "x-api-token-group": [ + "Workers AI Write", + "Workers AI Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/models/schema`, + query: [ + ["model", args["model"], true], + ], + }), + }, + { + name: "ai_list_markdown_supported_formats", + title: "List supported Markdown conversion formats", + description: "Lists the file extensions and MIME types accepted by Workers AI's Markdown conversion endpoint. Use this list to check whether a file can be converted before uploading it.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID used for this AI model request.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List supported Markdown conversion formats" + }, + method: "GET", + path: "/accounts/{account_id}/ai/tomarkdown/supported", + extensions: { + "x-api-token-group": [ + "Workers AI Write", + "Workers AI Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/tomarkdown/supported`, + }), + }, + { + name: "ai_run", + title: "Run an AI model with request options", + description: "Runs an AI model using a JSON body containing model, input, and optional options fields. Unlike the model-specific URL endpoint, this endpoint takes the model identifier in the body and nests the model's inputs under input.\n\nUse options.extraHeaders to pass additional provider headers. Accepts Workers AI model identifiers and AI Gateway provider model identifiers.\n\nSee the [Workers AI model catalog](https://developers.cloudflare.com/workers-ai/models/) for Workers AI model inputs, or the provider's documentation for models accessed through AI Gateway.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID used for this AI model request.", + "type": "string" + }, + "body": { + "properties": { + "input": { + "description": "JSON object containing the selected model's input fields, such as prompt or messages. Do not include model or options inside this object.", + "type": "object" + }, + "model": { + "description": "The AI model to execute (e.g., @cf/google/gemma-4-26b-a4b-it, openai/gpt-5.5, anthropic/claude-opus-4.7)", + "type": "string" + }, + "options": { + "properties": { + "extraHeaders": { + "additionalProperties": { + "type": "string" + }, + "description": "Additional headers to pass to the AI provider", + "type": "object" + }, + "gateway": { + "properties": { + "cacheTtl": { + "description": "Cache TTL in seconds", + "type": "number" + }, + "id": { + "description": "AI Gateway ID for caching and logging", + "type": "string" + }, + "skipCache": { + "description": "Skip cache lookup for this request", + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "input", + "model" + ], + "type": "object" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Run an AI model with request options" + }, + method: "POST", + path: "/accounts/{account_id}/ai/run", + extensions: { + "x-api-token-group": [ + "Workers AI Write", + "Workers AI Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/run`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_run_model", + title: "Run a Workers AI model", + description: "Runs the Workers AI model specified in the URL path. Send the model's inputs directly in the request body, without a model/input/options wrapper.\n\nAccepts model-specific JSON or binary input. The response format depends on the model and the requested output.\n\nSee the [model catalog](https://developers.cloudflare.com/workers-ai/models/) for supported models and their input formats.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID used for this AI model request.", + "type": "string" + }, + "body": { + "oneOf": [ + { + "properties": { + "text": { + "description": "The text that you want to classify", + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + { + "properties": { + "guidance": { + "default": 7.5, + "description": "Controls how closely the generated image should adhere to the prompt; higher values make the image more aligned with the prompt", + "type": "number" + }, + "height": { + "description": "The height of the generated image in pixels", + "type": "integer" + }, + "image": { + "description": "For use with img2img tasks. An array of integers that represent the image data constrained to 8-bit unsigned integer values", + "items": { + "type": "number" + }, + "type": "array" + }, + "image_b64": { + "description": "For use with img2img tasks. A base64-encoded string of the input image", + "type": "string" + }, + "mask": { + "description": "An array representing An array of integers that represent mask image data for inpainting constrained to 8-bit unsigned integer values", + "items": { + "type": "number" + }, + "type": "array" + }, + "negative_prompt": { + "description": "Text describing elements to avoid in the generated image", + "type": "string" + }, + "num_steps": { + "default": 20, + "description": "The number of diffusion steps; higher values can improve quality but take longer", + "type": "integer" + }, + "prompt": { + "description": "A text description of the image you want to generate", + "type": "string" + }, + "seed": { + "description": "Random seed for reproducibility of the image generation", + "type": "integer" + }, + "strength": { + "default": 1, + "description": "A value between 0 and 1 indicating how strongly to apply the transformation during img2img tasks; lower values make the output closer to the input image", + "type": "number" + }, + "width": { + "description": "The width of the generated image in pixels", + "type": "integer" + } + }, + "required": [ + "prompt" + ], + "type": "object" + }, + { + "properties": { + "lang": { + "default": "en", + "description": "The speech language (e.g., 'en' for English, 'fr' for French). Defaults to 'en' if not specified", + "type": "string" + }, + "prompt": { + "description": "A text description of the audio you want to generate", + "type": "string" + } + }, + "required": [ + "prompt" + ], + "type": "object" + }, + { + "properties": { + "text": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "maxItems": 100, + "type": "array" + } + ] + } + }, + "required": [ + "text" + ], + "type": "object" + }, + { + "format": "binary", + "type": "string" + }, + { + "properties": { + "audio": { + "description": "An array of integers that represent the audio data constrained to 8-bit unsigned integer values", + "items": { + "type": "number" + }, + "type": "array" + }, + "source_lang": { + "description": "The language of the recorded audio", + "type": "string" + }, + "target_lang": { + "description": "The language to translate the transcription into. Currently only English is supported.", + "type": "string" + } + }, + "required": [ + "audio" + ], + "type": "object" + }, + { + "properties": { + "image": { + "description": "An array of integers that represent the image data constrained to 8-bit unsigned integer values", + "items": { + "type": "number" + }, + "type": "array" + } + }, + "required": [ + "image" + ], + "type": "object" + }, + { + "properties": { + "image": { + "description": "An array of integers that represent the image data constrained to 8-bit unsigned integer values", + "items": { + "type": "number" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "properties": { + "frequency_penalty": { + "description": "Decreases the likelihood of the model repeating the same lines verbatim.", + "type": "number" + }, + "lora": { + "description": "Name of the LoRA (Low-Rank Adaptation) model to fine-tune the base model.", + "type": "string" + }, + "max_tokens": { + "default": 256, + "description": "The maximum number of tokens to generate in the response.", + "type": "integer" + }, + "presence_penalty": { + "description": "Increases the likelihood of the model introducing new topics.", + "type": "number" + }, + "prompt": { + "description": "The input text prompt for the model to generate a response.", + "type": "string" + }, + "raw": { + "default": false, + "description": "If true, a chat template is not applied and you must adhere to the specific model's expected formatting.", + "type": "boolean" + }, + "repetition_penalty": { + "description": "Penalty for repeated tokens; higher values discourage repetition.", + "type": "number" + }, + "response_format": { + "properties": { + "json_schema": {}, + "type": { + "enum": [ + "json_object", + "json_schema" + ], + "type": "string" + } + }, + "type": "object" + }, + "seed": { + "description": "Random seed for reproducibility of the generation.", + "type": "integer" + }, + "stream": { + "default": false, + "description": "If true, the response will be streamed back incrementally using SSE, Server Sent Events.", + "type": "boolean" + }, + "temperature": { + "default": 0.6, + "description": "Controls the randomness of the output; higher values produce more random results.", + "type": "number" + }, + "top_k": { + "description": "Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.", + "type": "integer" + }, + "top_p": { + "description": "Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.", + "type": "number" + } + }, + "required": [ + "prompt" + ], + "type": "object" + }, + { + "properties": { + "frequency_penalty": { + "description": "Decreases the likelihood of the model repeating the same lines verbatim.", + "type": "number" + }, + "functions": { + "items": { + "properties": { + "code": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "code", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "max_tokens": { + "default": 256, + "description": "The maximum number of tokens to generate in the response.", + "type": "integer" + }, + "messages": { + "description": "An array of message objects representing the conversation history.", + "items": { + "properties": { + "content": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "properties": { + "text": { + "description": "Text content", + "type": "string" + }, + "type": { + "description": "Type of the content (text)", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + "role": { + "description": "The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').", + "type": "string" + } + }, + "required": [ + "content", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "presence_penalty": { + "description": "Increases the likelihood of the model introducing new topics.", + "type": "number" + }, + "raw": { + "default": false, + "description": "If true, a chat template is not applied and you must adhere to the specific model's expected formatting.", + "type": "boolean" + }, + "repetition_penalty": { + "description": "Penalty for repeated tokens; higher values discourage repetition.", + "type": "number" + }, + "response_format": { + "properties": { + "json_schema": {}, + "type": { + "enum": [ + "json_object", + "json_schema" + ], + "type": "string" + } + }, + "type": "object" + }, + "seed": { + "description": "Random seed for reproducibility of the generation.", + "type": "integer" + }, + "stream": { + "default": false, + "description": "If true, the response will be streamed back incrementally using SSE, Server Sent Events.", + "type": "boolean" + }, + "temperature": { + "default": 0.6, + "description": "Controls the randomness of the output; higher values produce more random results.", + "type": "number" + }, + "tools": { + "description": "A list of tools available for the assistant to use.", + "items": { + "oneOf": [ + { + "properties": { + "description": { + "description": "A brief description of what the tool does.", + "type": "string" + }, + "name": { + "description": "The name of the tool. More descriptive the better.", + "type": "string" + }, + "parameters": { + "description": "Schema defining the parameters accepted by the tool.", + "properties": { + "properties": { + "additionalProperties": { + "properties": { + "description": { + "description": "A description of the expected parameter.", + "type": "string" + }, + "type": { + "description": "The data type of the parameter.", + "type": "string" + } + }, + "required": [ + "description", + "type" + ], + "type": "object" + }, + "description": "Definitions of each parameter.", + "type": "object" + }, + "required": { + "description": "List of required parameter names.", + "items": { + "type": "string" + }, + "type": "array" + }, + "type": { + "description": "The type of the parameters object (usually 'object').", + "type": "string" + } + }, + "required": [ + "properties", + "type" + ], + "type": "object" + } + }, + "required": [ + "description", + "name", + "parameters" + ], + "type": "object" + }, + { + "properties": { + "function": { + "description": "Details of the function tool.", + "properties": { + "description": { + "description": "A brief description of what the function does.", + "type": "string" + }, + "name": { + "description": "The name of the function.", + "type": "string" + }, + "parameters": { + "description": "Schema defining the parameters accepted by the function.", + "properties": { + "properties": { + "additionalProperties": { + "properties": { + "description": { + "description": "A description of the expected parameter.", + "type": "string" + }, + "type": { + "description": "The data type of the parameter.", + "type": "string" + } + }, + "required": [ + "description", + "type" + ], + "type": "object" + }, + "description": "Definitions of each parameter.", + "type": "object" + }, + "required": { + "description": "List of required parameter names.", + "items": { + "type": "string" + }, + "type": "array" + }, + "type": { + "description": "The type of the parameters object (usually 'object').", + "type": "string" + } + }, + "required": [ + "properties", + "type" + ], + "type": "object" + } + }, + "required": [ + "description", + "name", + "parameters" + ], + "type": "object" + }, + "type": { + "description": "Specifies the type of tool (e.g., 'function').", + "type": "string" + } + }, + "required": [ + "function", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "top_k": { + "description": "Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.", + "type": "integer" + }, + "top_p": { + "description": "Adjusts the creativity of the AI's responses by controlling how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.", + "type": "number" + } + }, + "required": [ + "messages" + ], + "type": "object" + }, + { + "properties": { + "source_lang": { + "default": "en", + "description": "The language code of the source text (e.g., 'en' for English). Defaults to 'en' if not specified", + "type": "string" + }, + "target_lang": { + "description": "The language code to translate the text into (e.g., 'es' for Spanish)", + "type": "string" + }, + "text": { + "description": "The text to be translated", + "type": "string" + } + }, + "required": [ + "target_lang", + "text" + ], + "type": "object" + }, + { + "properties": { + "input_text": { + "description": "The text that you want the model to summarize", + "type": "string" + }, + "max_length": { + "default": 1024, + "description": "The maximum length of the generated summary in tokens", + "type": "integer" + } + }, + "required": [ + "input_text" + ], + "type": "object" + }, + { + "properties": { + "frequency_penalty": { + "description": "Decreases the likelihood of the model repeating the same lines verbatim.", + "type": "number" + }, + "image": { + "oneOf": [ + { + "items": { + "type": "number" + }, + "type": "array" + }, + { + "format": "binary", + "type": "string" + } + ] + }, + "max_tokens": { + "default": 512, + "description": "The maximum number of tokens to generate in the response.", + "type": "integer" + }, + "presence_penalty": { + "description": "Increases the likelihood of the model introducing new topics.", + "type": "number" + }, + "prompt": { + "description": "The input text prompt for the model to generate a response.", + "type": "string" + }, + "raw": { + "default": false, + "description": "If true, a chat template is not applied and you must adhere to the specific model's expected formatting.", + "type": "boolean" + }, + "repetition_penalty": { + "description": "Penalty for repeated tokens; higher values discourage repetition.", + "type": "number" + }, + "seed": { + "description": "Random seed for reproducibility of the generation.", + "type": "number" + }, + "temperature": { + "description": "Controls the randomness of the output; higher values produce more random results.", + "type": "number" + }, + "top_k": { + "description": "Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.", + "type": "number" + }, + "top_p": { + "description": "Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.", + "type": "number" + } + }, + "required": [ + "image" + ], + "type": "object" + }, + { + "properties": { + "frequency_penalty": { + "description": "Decreases the likelihood of the model repeating the same lines verbatim.", + "type": "number" + }, + "ignore_eos": { + "description": "Whether to ignore the EOS token and continue generating tokens after the EOS token is generated.", + "type": "boolean" + }, + "image": { + "description": "Image in base64 encoded format.", + "type": "string" + }, + "max_tokens": { + "default": 512, + "description": "The maximum number of tokens to generate in the response.", + "type": "integer" + }, + "presence_penalty": { + "description": "Increases the likelihood of the model introducing new topics.", + "type": "number" + }, + "prompt": { + "description": "The input text prompt for the model to generate a response.", + "type": "string" + }, + "repetition_penalty": { + "description": "Penalty for repeated tokens; higher values discourage repetition.", + "type": "number" + }, + "seed": { + "description": "Random seed for reproducibility of the generation.", + "type": "number" + }, + "temperature": { + "description": "Controls the randomness of the output; higher values produce more random results.", + "type": "number" + }, + "top_k": { + "description": "Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.", + "type": "number" + }, + "top_p": { + "description": "Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.", + "type": "number" + } + }, + "required": [ + "image", + "prompt" + ], + "type": "object" + }, + { + "properties": { + "frequency_penalty": { + "description": "Decreases the likelihood of the model repeating the same lines verbatim.", + "type": "number" + }, + "ignore_eos": { + "description": "Whether to ignore the EOS token and continue generating tokens after the EOS token is generated.", + "type": "boolean" + }, + "image": { + "description": "Image in base64 encoded format.", + "type": "string" + }, + "max_tokens": { + "default": 512, + "description": "The maximum number of tokens to generate in the response.", + "type": "integer" + }, + "messages": { + "description": "An array of message objects representing the conversation history.", + "items": { + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "properties": { + "image_url": { + "description": "Image URL object (when type is 'image_url').", + "properties": { + "url": { + "description": "Image URI with data (e.g. data:image/jpeg;base64,/9j/...).", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "text": { + "description": "Text content (when type is 'text').", + "type": "string" + }, + "type": { + "description": "Type of the content part (e.g. 'text', 'image_url').", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": "array" + } + ] + }, + "role": { + "description": "The role of the message sender (e.g., 'user', 'assistant', 'system', 'tool').", + "type": "string" + } + }, + "required": [ + "content", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "presence_penalty": { + "description": "Increases the likelihood of the model introducing new topics.", + "type": "number" + }, + "repetition_penalty": { + "description": "Penalty for repeated tokens; higher values discourage repetition.", + "type": "number" + }, + "seed": { + "description": "Random seed for reproducibility of the generation.", + "type": "number" + }, + "temperature": { + "description": "Controls the randomness of the output; higher values produce more random results.", + "type": "number" + }, + "top_k": { + "description": "Limits the AI to choose from the top 'k' most probable words. Lower values make responses more focused; higher values introduce more variety and potential surprises.", + "type": "number" + }, + "top_p": { + "description": "Controls the creativity of the AI's responses by adjusting how many possible words it considers. Lower values make outputs more predictable; higher values allow for more varied and creative responses.", + "type": "number" + } + }, + "required": [ + "image", + "messages" + ], + "type": "object" + }, + { + "properties": { + "image": { + "description": "Image in base64 encoded format.", + "type": "string" + }, + "text": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + "model_name": { + "description": "Workers AI model identifier, including its namespace and model name.", + "type": "string" + } + }, + required: [ + "account_id", + "model_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Run a Workers AI model" + }, + method: "POST", + path: "/accounts/{account_id}/ai/run/{model_name}", + extensions: { + "x-api-token-group": [ + "Workers AI Write", + "Workers AI Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-fern-audiences": [ + "sdk" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/run/${pathParam(args, "model_name")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_to_markdown", + title: "Convert uploaded files to Markdown", + description: "Converts files uploaded as multipart form data into Markdown using Workers AI. Returns a conversion result for each file. Use the supported-formats endpoint to check accepted file types.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID used for this AI model request.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Convert uploaded files to Markdown" + }, + method: "POST", + path: "/accounts/{account_id}/ai/tomarkdown", + extensions: { + "x-api-token-group": [ + "Workers AI Write", + "Workers AI Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/tomarkdown`, + }), + }, + { + name: "ai_websearch", + title: "Search the web through AI Gateway", + description: "Run a web search through a configured AI Gateway.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "byokAlias": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "options": { + "properties": { + "gateway": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "gateway" + ], + "type": "object" + }, + "provider": { + "type": "string" + }, + "query": { + "type": "string" + } + }, + "required": [ + "options", + "query" + ], + "type": "object" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Search the web through AI Gateway" + }, + method: "POST", + path: "/accounts/{account_id}/ai/websearch", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai": { + "name": "com_cloudflare_api_account_ai" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai/websearch`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiAudit/robots/tools.ts b/src/generated/forge-mcp/aiAudit/robots/tools.ts new file mode 100644 index 00000000..60f216f5 --- /dev/null +++ b/src/generated/forge-mcp/aiAudit/robots/tools.ts @@ -0,0 +1,96 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_audit.robots`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_audit_robots_bulk_get", + title: "Bulk get robots.txt rules", + description: "Fetches and parses robots.txt files for multiple domains within a zone in a single request. Each domain must belong to the specified zone. Results are keyed by hostname.", + inputSchema: { + type: "object", + properties: { + "body": { + "items": { + "type": "string" + }, + "maxItems": 25, + "type": "array" + }, + "zone_id": { + "description": "Identifier of the zone.", + "type": "string" + } + }, + required: [ + "zone_id", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Bulk get robots.txt rules" + }, + method: "POST", + path: "/zones/{zone_id}/ai-audit/robots/bulk", + extensions: { + "x-api-token-group": [ + "Zone Settings Write", + "Zone Settings Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/ai-audit/robots/bulk`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_audit_robots_get", + title: "Get robots.txt rules", + description: "Fetches and parses the robots.txt file for a zone or a specific subdomain within the zone. Returns parsed user-agent rules, content signals, and sitemaps.", + inputSchema: { + type: "object", + properties: { + "subdomain": { + "description": "Optional subdomain to fetch robots.txt for. If omitted, fetches robots.txt for the zone apex domain.", + "type": "string" + }, + "zone_id": { + "description": "Identifier of the zone.", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get robots.txt rules" + }, + method: "GET", + path: "/zones/{zone_id}/ai-audit/robots", + extensions: { + "x-api-token-group": [ + "Zone Settings Write", + "Zone Settings Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/ai-audit/robots`, + query: [ + ["subdomain", args["subdomain"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/customDomains/tools.ts b/src/generated/forge-mcp/aiGateway/customDomains/tools.ts new file mode 100644 index 00000000..b5912e7f --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/customDomains/tools.ts @@ -0,0 +1,293 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_gateway.custom_domains`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_custom_domains_create", + title: "Create a custom domain for a gateway", + description: "Provisions a Cloudflare-for-SaaS custom hostname and returns the CNAME target to point DNS at.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "domain": { + "description": "Custom hostname that you own, such as `ai.example.com`.", + "type": "string" + }, + "minTLS": { + "enum": [ + "1.0", + "1.1", + "1.2", + "1.3" + ], + "type": "string" + }, + "zone_id": { + "description": "ID of the Cloudflare zone that contains the custom hostname.", + "type": "string" + } + }, + "required": [ + "domain", + "zone_id" + ], + "type": "object" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a custom domain for a gateway" + }, + method: "POST", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/custom-domains", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/custom-domains`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_gateway_custom_domains_delete", + title: "Delete a custom domain", + description: "Deletes a custom domain from an AI Gateway and removes its Cloudflare for SaaS custom hostname.\n\nConfirm with the user before calling this tool. This deletes the custom domain and its custom hostname. Requests to this hostname will stop reaching the gateway.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "hostname": { + "description": "Custom hostname that you own, such as `ai.example.com`.", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "hostname" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a custom domain" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/custom-domains/{hostname}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/custom-domains/${pathParam(args, "hostname")}`, + }), + }, + { + name: "ai_gateway_custom_domains_get", + title: "Get a custom domain", + description: "Retrieves a custom domain attached to an AI Gateway, including its status and CNAME target.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "hostname": { + "description": "Custom hostname that you own, such as `ai.example.com`.", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "hostname" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a custom domain" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/custom-domains/{hostname}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/custom-domains/${pathParam(args, "hostname")}`, + }), + }, + { + name: "ai_gateway_custom_domains_list", + title: "List custom domains", + description: "Lists the custom domains attached to an AI Gateway, including the certificate and validation status of each domain.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + }, + "search": { + "description": "Search by hostname", + "type": "string" + }, + "status": { + "enum": [ + "initializing", + "pending_dcv", + "active", + "blocked", + "error" + ], + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List custom domains" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/custom-domains", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/custom-domains`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["status", args["status"], true], + ["search", args["search"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/customProviders/tools.ts b/src/generated/forge-mcp/aiGateway/customProviders/tools.ts new file mode 100644 index 00000000..f2880c15 --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/customProviders/tools.ts @@ -0,0 +1,422 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_gateway.custom_providers`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_custom_providers_create", + title: "Create a custom provider", + description: "Creates an account-level custom provider that forwards AI Gateway requests to the HTTPS base URL you supply. Requests reference the provider as `custom-{slug}`, so the slug must be unique within the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "base_url": { + "type": "string" + }, + "beta": { + "type": "boolean" + }, + "curl_example": { + "type": "string" + }, + "description": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "headers": { + "description": "JSON object of extra HTTP headers that AI Gateway sends to the provider. Values can contain credentials.", + "type": "string" + }, + "js_example": { + "type": "string" + }, + "link": { + "type": "string" + }, + "name": { + "type": "string" + }, + "position": { + "type": "integer" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "base_url", + "name", + "slug" + ], + "type": "object" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a custom provider" + }, + method: "POST", + path: "/accounts/{account_id}/ai-gateway/custom-providers", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "beta": { + "hidden": true + }, + "curl_example": { + "hidden": true + }, + "js_example": { + "hidden": true + }, + "link": { + "hidden": true + }, + "position": { + "hidden": true + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/custom-providers`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_gateway_custom_providers_delete", + title: "Delete a custom provider", + description: "Deletes a custom provider and every pricing rule that belongs to it.\n\nConfirm with the user before calling this tool. This permanently deletes the custom provider and all of its pricing rules. Gateway requests that use `custom-{slug}` for this provider will stop routing.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "id": { + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a custom provider" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-gateway/custom-providers/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/custom-providers/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_custom_providers_get", + title: "Get a custom provider", + description: "Retrieves a custom provider, including its slug, base URL, and custom headers.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "id": { + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a custom provider" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/custom-providers/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/custom-providers/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_custom_providers_list", + title: "List custom providers", + description: "Lists the custom providers configured for the account, ordered by position and then name.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "beta": { + "type": "boolean" + }, + "enable": { + "type": "boolean" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + }, + "search": { + "description": "Search by id, name, slug", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List custom providers" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/custom-providers", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/custom-providers`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["beta", args["beta"], true], + ["enable", args["enable"], true], + ["search", args["search"], true], + ], + }), + }, + { + name: "ai_gateway_custom_providers_update", + title: "Update a custom provider", + description: "Updates the specified fields of a custom provider. Changes clear cached entries for the provider.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "base_url": { + "type": "string" + }, + "beta": { + "type": "boolean" + }, + "curl_example": { + "type": "string" + }, + "description": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "headers": { + "description": "JSON object of extra HTTP headers that AI Gateway sends to the provider. Values can contain credentials.", + "type": "string" + }, + "js_example": { + "type": "string" + }, + "link": { + "type": "string" + }, + "logo": { + "type": "string" + }, + "name": { + "type": "string" + }, + "position": { + "type": "integer" + }, + "slug": { + "type": "string" + } + }, + "type": "object" + }, + "id": { + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update a custom provider" + }, + method: "PATCH", + path: "/accounts/{account_id}/ai-gateway/custom-providers/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "beta": { + "hidden": true + }, + "curl_example": { + "hidden": true + }, + "js_example": { + "hidden": true + }, + "link": { + "hidden": true + }, + "logo": { + "hidden": true + }, + "position": { + "hidden": true + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/custom-providers/${pathParam(args, "id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/datasets/tools.ts b/src/generated/forge-mcp/aiGateway/datasets/tools.ts new file mode 100644 index 00000000..74e0f908 --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/datasets/tools.ts @@ -0,0 +1,465 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_gateway.datasets`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_datasets_create", + title: "Create a dataset (deprecated)", + description: "Creates a dataset that selects gateway logs matching the specified filters for use in evaluations. Evaluations and datasets are deprecated and unavailable to new accounts.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "enable": { + "type": "boolean" + }, + "filters": { + "items": { + "properties": { + "key": { + "enum": [ + "created_at", + "request_content_type", + "response_content_type", + "success", + "cached", + "provider", + "model", + "cost", + "tokens", + "tokens_in", + "tokens_out", + "duration", + "feedback" + ], + "type": "string" + }, + "operator": { + "enum": [ + "eq", + "contains", + "lt", + "gt" + ], + "type": "string" + }, + "value": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + } + }, + "required": [ + "key", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + } + }, + "required": [ + "enable", + "filters", + "name" + ], + "type": "object" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a dataset (deprecated)" + }, + method: "POST", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/datasets", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/datasets`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_gateway_datasets_delete", + title: "Delete a dataset (deprecated)", + description: "Deletes a dataset. Evaluations and datasets are deprecated and unavailable to new accounts.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a dataset (deprecated)" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/datasets/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/datasets/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_datasets_get", + title: "Get a dataset (deprecated)", + description: "Retrieves a dataset and its log filters. Evaluations and datasets are deprecated and unavailable to new accounts.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a dataset (deprecated)" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/datasets/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/datasets/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_datasets_list", + title: "List datasets (deprecated)", + description: "Lists the datasets defined for an AI Gateway. Evaluations and datasets are deprecated and unavailable to new accounts.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "enable": { + "type": "boolean" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "name": { + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + }, + "search": { + "description": "Search by id, name, filters", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List datasets (deprecated)" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/datasets", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/datasets`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["name", args["name"], true], + ["enable", args["enable"], true], + ["search", args["search"], true], + ], + }), + }, + { + name: "ai_gateway_datasets_update", + title: "Update a dataset (deprecated)", + description: "Replaces the name, log filters, and enabled state of a dataset. Evaluations and datasets are deprecated and unavailable to new accounts.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "enable": { + "type": "boolean" + }, + "filters": { + "items": { + "properties": { + "key": { + "enum": [ + "created_at", + "request_content_type", + "response_content_type", + "success", + "cached", + "provider", + "model", + "cost", + "tokens", + "tokens_in", + "tokens_out", + "duration", + "feedback" + ], + "type": "string" + }, + "operator": { + "enum": [ + "eq", + "contains", + "lt", + "gt" + ], + "type": "string" + }, + "value": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + } + }, + "required": [ + "key", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "type": "string" + } + }, + "required": [ + "enable", + "filters", + "name" + ], + "type": "object" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update a dataset (deprecated)" + }, + method: "PUT", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/datasets/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/datasets/${pathParam(args, "id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/dynamicRouting/deployments/tools.ts b/src/generated/forge-mcp/aiGateway/dynamicRouting/deployments/tools.ts new file mode 100644 index 00000000..e72776a8 --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/dynamicRouting/deployments/tools.ts @@ -0,0 +1,137 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `ai_gateway.dynamic_routing.deployments`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_dynamic_routing_deployments_create", + title: "Deploy a dynamic route version", + description: "Deploys the specified version of a dynamic route so that it serves traffic. Deploy an earlier version to roll back.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "version_id": { + "type": "string" + } + }, + "required": [ + "version_id" + ], + "type": "object" + }, + "gateway_id": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Deploy a dynamic route version" + }, + method: "POST", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/routes/{id}/deployments", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/routes/${pathParam(args, "id")}/deployments`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_gateway_dynamic_routing_deployments_list", + title: "List dynamic route deployments", + description: "Lists the deployment history of a dynamic route.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List dynamic route deployments" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/routes/{id}/deployments", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/routes/${pathParam(args, "id")}/deployments`, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/dynamicRouting/tools.ts b/src/generated/forge-mcp/aiGateway/dynamicRouting/tools.ts new file mode 100644 index 00000000..440a538f --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/dynamicRouting/tools.ts @@ -0,0 +1,648 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_gateway.dynamic_routing`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_dynamic_routing_create", + title: "Create a dynamic route", + description: "Creates a dynamic route on an AI Gateway from the specified routing elements. Clients call the route by using `dynamic/{name}` as the model name.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "elements": { + "items": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "properties": { + "next": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + } + }, + "required": [ + "next" + ], + "type": "object" + }, + "type": { + "enum": [ + "start" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "type" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "properties": { + "false": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + }, + "true": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + } + }, + "required": [ + "false", + "true" + ], + "type": "object" + }, + "properties": { + "properties": { + "conditions": { + "type": "object" + } + }, + "type": "object" + }, + "type": { + "enum": [ + "conditional" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "properties", + "type" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "additionalProperties": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + }, + "type": "object" + }, + "type": { + "enum": [ + "percentage" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "type" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "properties": { + "fallback": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + }, + "success": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + } + }, + "required": [ + "fallback", + "success" + ], + "type": "object" + }, + "properties": { + "properties": { + "key": { + "type": "string" + }, + "limit": { + "type": "number" + }, + "limitType": { + "enum": [ + "count", + "cost" + ], + "type": "string" + }, + "window": { + "type": "number" + } + }, + "required": [ + "key", + "limit", + "limitType", + "window" + ], + "type": "object" + }, + "type": { + "enum": [ + "rate" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "properties", + "type" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "properties": { + "fallback": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + }, + "success": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + } + }, + "required": [ + "fallback", + "success" + ], + "type": "object" + }, + "properties": { + "properties": { + "model": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "retries": { + "type": "number" + }, + "timeout": { + "type": "number" + } + }, + "required": [ + "model", + "provider", + "retries", + "timeout" + ], + "type": "object" + }, + "type": { + "enum": [ + "model" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "properties", + "type" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "additionalProperties": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + }, + "type": "object" + }, + "type": { + "enum": [ + "end" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "name": { + "type": "string" + } + }, + "required": [ + "elements", + "name" + ], + "type": "object" + }, + "gateway_id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a dynamic route" + }, + method: "POST", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/routes", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/routes`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_gateway_dynamic_routing_delete", + title: "Delete a dynamic route", + description: "Deletes a dynamic route from an AI Gateway.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a dynamic route" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/routes/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/routes/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_dynamic_routing_get", + title: "Get a dynamic route", + description: "Retrieves a dynamic route with its routing elements, active version, and current deployment.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a dynamic route" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/routes/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/routes/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_dynamic_routing_list", + title: "List dynamic routes", + description: "Lists the dynamic routes configured on an AI Gateway.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "type": "string" + }, + "page": { + "description": "Page number", + "type": "integer" + }, + "per_page": { + "description": "Number of routes per page", + "type": "integer" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List dynamic routes" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/routes", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/routes`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, + { + name: "ai_gateway_dynamic_routing_update", + title: "Rename a dynamic route", + description: "Updates the name of a dynamic route. To change routing behaviour, create and deploy a new version.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "gateway_id": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Rename a dynamic route" + }, + method: "PATCH", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/routes/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/routes/${pathParam(args, "id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/dynamicRouting/versions/tools.ts b/src/generated/forge-mcp/aiGateway/dynamicRouting/versions/tools.ts new file mode 100644 index 00000000..bf9614e6 --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/dynamicRouting/versions/tools.ts @@ -0,0 +1,518 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `ai_gateway.dynamic_routing.versions`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_dynamic_routing_versions_create", + title: "Create a dynamic route version", + description: "Creates a new version of a dynamic route from the specified routing elements. The version does not serve traffic until you deploy it.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "elements": { + "items": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "properties": { + "next": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + } + }, + "required": [ + "next" + ], + "type": "object" + }, + "type": { + "enum": [ + "start" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "type" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "properties": { + "false": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + }, + "true": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + } + }, + "required": [ + "false", + "true" + ], + "type": "object" + }, + "properties": { + "properties": { + "conditions": { + "type": "object" + } + }, + "type": "object" + }, + "type": { + "enum": [ + "conditional" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "properties", + "type" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "additionalProperties": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + }, + "type": "object" + }, + "type": { + "enum": [ + "percentage" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "type" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "properties": { + "fallback": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + }, + "success": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + } + }, + "required": [ + "fallback", + "success" + ], + "type": "object" + }, + "properties": { + "properties": { + "key": { + "type": "string" + }, + "limit": { + "type": "number" + }, + "limitType": { + "enum": [ + "count", + "cost" + ], + "type": "string" + }, + "window": { + "type": "number" + } + }, + "required": [ + "key", + "limit", + "limitType", + "window" + ], + "type": "object" + }, + "type": { + "enum": [ + "rate" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "properties", + "type" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "properties": { + "fallback": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + }, + "success": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + } + }, + "required": [ + "fallback", + "success" + ], + "type": "object" + }, + "properties": { + "properties": { + "model": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "retries": { + "type": "number" + }, + "timeout": { + "type": "number" + } + }, + "required": [ + "model", + "provider", + "retries", + "timeout" + ], + "type": "object" + }, + "type": { + "enum": [ + "model" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "properties", + "type" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "outputs": { + "additionalProperties": { + "properties": { + "elementId": { + "type": "string" + } + }, + "required": [ + "elementId" + ], + "type": "object" + }, + "type": "object" + }, + "type": { + "enum": [ + "end" + ], + "type": "string" + } + }, + "required": [ + "id", + "outputs", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "elements" + ], + "type": "object" + }, + "gateway_id": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a dynamic route version" + }, + method: "POST", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/routes/{id}/versions", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/routes/${pathParam(args, "id")}/versions`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_gateway_dynamic_routing_versions_get", + title: "Get a dynamic route version", + description: "Retrieves a saved version of a dynamic route, including its routing elements.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "type": "string" + }, + "id": { + "type": "string" + }, + "version_id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id", + "version_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a dynamic route version" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/routes/{id}/versions/{version_id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/routes/${pathParam(args, "id")}/versions/${pathParam(args, "version_id")}`, + }), + }, + { + name: "ai_gateway_dynamic_routing_versions_list", + title: "List dynamic route versions", + description: "Lists the saved versions of a dynamic route.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List dynamic route versions" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/routes/{id}/versions", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/routes/${pathParam(args, "id")}/versions`, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/evaluationTypes/tools.ts b/src/generated/forge-mcp/aiGateway/evaluationTypes/tools.ts new file mode 100644 index 00000000..0a75afb2 --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/evaluationTypes/tools.ts @@ -0,0 +1,86 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_gateway.evaluation_types`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_evaluation_types_list", + title: "List evaluator types (deprecated)", + description: "Lists the evaluator types that evaluations can use to score AI Gateway responses. Evaluations are deprecated and unavailable to new accounts.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "order_by": { + "default": "mandatory", + "type": "string" + }, + "order_by_direction": { + "default": "desc", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List evaluator types (deprecated)" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/evaluation-types", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/evaluation-types`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["order_by", args["order_by"], true], + ["order_by_direction", args["order_by_direction"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/evaluations/tools.ts b/src/generated/forge-mcp/aiGateway/evaluations/tools.ts new file mode 100644 index 00000000..eaac9bd5 --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/evaluations/tools.ts @@ -0,0 +1,289 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_gateway.evaluations`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_evaluations_create", + title: "Create an evaluation (deprecated)", + description: "Creates an evaluation that scores the logs in a dataset with the specified evaluator types. Evaluations and datasets are deprecated and unavailable to new accounts.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "dataset_ids": { + "items": { + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "evaluation_type_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + } + }, + "required": [ + "dataset_ids", + "evaluation_type_ids", + "name" + ], + "type": "object" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create an evaluation (deprecated)" + }, + method: "POST", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/evaluations", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/evaluations`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_gateway_evaluations_delete", + title: "Delete an evaluation (deprecated)", + description: "Deletes an evaluation and its results. Evaluations and datasets are deprecated and unavailable to new accounts.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete an evaluation (deprecated)" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/evaluations/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/evaluations/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_evaluations_get", + title: "Get an evaluation (deprecated)", + description: "Retrieves an evaluation and its results. Evaluations and datasets are deprecated and unavailable to new accounts.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get an evaluation (deprecated)" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/evaluations/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/evaluations/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_evaluations_list", + title: "List evaluations (deprecated)", + description: "Lists the evaluations run on an AI Gateway. Evaluations and datasets are deprecated and unavailable to new accounts.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "name": { + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + }, + "processed": { + "type": "boolean" + }, + "search": { + "description": "Search by id, name", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List evaluations (deprecated)" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/evaluations", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/evaluations`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["name", args["name"], true], + ["processed", args["processed"], true], + ["search", args["search"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/gateways/providers/tools.ts b/src/generated/forge-mcp/aiGateway/gateways/providers/tools.ts new file mode 100644 index 00000000..ed50fbc1 --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/gateways/providers/tools.ts @@ -0,0 +1,345 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `ai_gateway.gateways.providers`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_gateways_providers_create", + title: "Store a provider key", + description: "Stores an upstream AI provider API key for an AI Gateway in the Secrets Store configured on the gateway, with an optional rate limit. Pass `secret` to store a new key, or omit it to use an existing Secrets Store secret.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "alias": { + "type": "string" + }, + "default_config": { + "type": "boolean" + }, + "provider_slug": { + "type": "string" + }, + "rate_limit": { + "type": "number" + }, + "rate_limit_period": { + "default": 60, + "type": "number" + }, + "secret": { + "description": "Provider API key to store in the Secrets Store configured on the gateway.", + "type": "string" + }, + "secret_id": { + "type": "string" + } + }, + "required": [ + "alias", + "default_config", + "provider_slug" + ], + "type": "object" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Store a provider key" + }, + method: "POST", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/provider_configs", + extensions: { + "x-api-token-group": [ + "Secrets Store Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/provider_configs`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_gateway_gateways_providers_delete", + title: "Delete a provider key", + description: "Deletes a provider key configuration from an AI Gateway and deletes its secret from the Secrets Store.\n\nConfirm with the user before calling this tool. This deletes the stored provider key and its Secrets Store secret. Requests that rely on this key will stop authenticating with it.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a provider key" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/provider_configs/{id}", + extensions: { + "x-api-token-group": [ + "Secrets Store Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/provider_configs/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_gateways_providers_get", + title: "Get a provider key", + description: "Retrieves a provider key configuration for an AI Gateway. The response shows a masked preview of the key, never the key itself.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a provider key" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/provider_configs/{id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/provider_configs/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_gateways_providers_list", + title: "List provider keys", + description: "Lists the provider keys stored for an AI Gateway. Responses show a masked preview of each key, never the key itself.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List provider keys" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/provider_configs", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/provider_configs`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, + { + name: "ai_gateway_gateways_providers_update", + title: "Rotate a provider key", + description: "Replaces the stored API key of a provider key configuration. Only the key can change.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "secret": { + "description": "Provider API key to store in the Secrets Store configured on the gateway.", + "type": "string" + } + }, + "required": [ + "secret" + ], + "type": "object" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Rotate a provider key" + }, + method: "PUT", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/provider_configs/{id}", + extensions: { + "x-api-token-group": [ + "Secrets Store Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/provider_configs/${pathParam(args, "id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/gateways/tools.ts b/src/generated/forge-mcp/aiGateway/gateways/tools.ts new file mode 100644 index 00000000..59bbce85 --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/gateways/tools.ts @@ -0,0 +1,1741 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_gateway.gateways`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_gateways_create", + title: "Create a gateway", + description: "Creates an AI Gateway in the account with the specified caching, rate limiting, logging, and authentication settings. The gateway ID appears in request URLs and must be unique within the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "authentication": { + "type": "boolean" + }, + "byok_only": { + "description": "Requires customer-provided provider credentials and prevents fallback to Unified Billing.", + "type": "boolean" + }, + "cache_invalidate_on_update": { + "type": "boolean" + }, + "cache_ttl": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "collect_logs": { + "type": "boolean" + }, + "dlp": { + "anyOf": [ + { + "properties": { + "action": { + "enum": [ + "BLOCK", + "FLAG" + ], + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "profiles": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "enabled", + "profiles" + ], + "type": "object" + }, + { + "properties": { + "enabled": { + "type": "boolean" + }, + "policies": { + "items": { + "properties": { + "action": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "check": { + "items": { + "enum": [ + "REQUEST", + "RESPONSE" + ], + "type": "string" + }, + "type": "array" + }, + "enabled": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "profiles": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "check", + "enabled", + "id", + "profiles" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "enabled", + "policies" + ], + "type": "object" + } + ] + }, + "guardrails": { + "oneOf": [ + { + "properties": { + "prompt": { + "properties": { + "P1": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S1": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S10": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S11": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S12": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S13": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S2": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S3": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S4": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S5": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S6": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S7": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S8": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S9": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + } + }, + "type": "object" + }, + "response": { + "properties": { + "P1": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S1": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S10": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S11": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S12": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S13": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S2": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S3": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S4": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S5": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S6": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S7": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S8": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S9": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "prompt", + "response" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "log_classification": { + "type": "boolean" + }, + "log_management": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "log_management_strategy": { + "oneOf": [ + { + "enum": [ + "STOP_INSERTING", + "DELETE_OLDEST" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "logpush": { + "type": "boolean" + }, + "logpush_public_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "otel": { + "oneOf": [ + { + "items": { + "properties": { + "authorization": { + "type": "string" + }, + "content_type": { + "default": "json", + "enum": [ + "json", + "protobuf" + ], + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "url": { + "type": "string" + } + }, + "required": [ + "headers", + "url" + ], + "type": "object" + }, + "maxItems": 5, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "rate_limiting_interval": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "rate_limiting_limit": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "rate_limiting_technique": { + "oneOf": [ + { + "enum": [ + "fixed", + "sliding" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_backoff": { + "description": "Backoff strategy for retry delays", + "oneOf": [ + { + "enum": [ + "constant", + "linear", + "exponential" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_delay": { + "description": "Delay between retry attempts in milliseconds (0-60000)", + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "retry_max_attempts": { + "description": "Maximum number of retry attempts for failed requests (1-5)", + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "spend_limits": { + "oneOf": [ + { + "properties": { + "enabled": { + "default": false, + "type": "boolean" + }, + "rules": { + "default": [], + "items": { + "properties": { + "enabled": { + "default": true, + "type": "boolean" + }, + "id": { + "default": "00000000", + "type": "string" + }, + "limit": { + "type": "number" + }, + "limitType": { + "enum": [ + "cost" + ], + "type": "string" + }, + "metadata": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "mode": { + "enum": [ + "partition" + ], + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "properties": { + "mode": { + "enum": [ + "filter" + ], + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "mode", + "values" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "model": { + "properties": { + "mode": { + "enum": [ + "filter" + ], + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "mode", + "values" + ], + "type": "object" + }, + "provider": { + "properties": { + "mode": { + "enum": [ + "filter" + ], + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "mode", + "values" + ], + "type": "object" + }, + "technique": { + "default": "sliding", + "enum": [ + "fixed", + "sliding" + ], + "type": "string" + }, + "window": { + "type": "integer" + } + }, + "required": [ + "limit", + "limitType", + "window" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "store_id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "stripe": { + "oneOf": [ + { + "properties": { + "authorization": { + "type": "string" + }, + "usage_events": { + "items": { + "properties": { + "payload": { + "type": "string" + } + }, + "required": [ + "payload" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "authorization", + "usage_events" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "workers_ai_billing_mode": { + "default": "postpaid", + "description": "Controls how Workers AI inference calls routed through this gateway are billed. 'postpaid' bills the account directly through Workers AI; 'unified' deducts credits via AI Gateway using neuron-based pricing and delegates billing to AI Gateway.", + "enum": [ + "postpaid", + "unified" + ], + "type": "string" + }, + "zdr": { + "type": "boolean" + } + }, + "required": [ + "cache_invalidate_on_update", + "cache_ttl", + "collect_logs", + "id", + "rate_limiting_interval", + "rate_limiting_limit" + ], + "type": "object" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a gateway" + }, + method: "POST", + path: "/accounts/{account_id}/ai-gateway/gateways", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_gateway_gateways_delete", + title: "Delete a gateway", + description: "Permanently deletes an AI Gateway, its configuration, and its stored logs.\n\nConfirm with the user before calling this tool. This permanently deletes the gateway, its configuration, and its stored logs. Requests sent to this gateway will fail. This action cannot be undone.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a gateway" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-gateway/gateways/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}`, + }), + }, + { + name: "ai_gateway_gateways_get", + title: "Get a gateway", + description: "Retrieves the configuration of an AI Gateway.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a gateway" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}`, + }), + }, + { + name: "ai_gateway_gateways_get_url", + title: "Get Gateway URL", + description: "Retrieves the endpoint URL for an AI Gateway.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "ai_gateway_provider": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "ai_gateway_provider" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Gateway URL" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/url/{provider}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/url/${pathParam(args, "ai_gateway_provider")}`, + }), + }, + { + name: "ai_gateway_gateways_list", + title: "List gateways", + description: "Lists the AI Gateways in the account. Use `search` to filter by gateway ID.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + }, + "search": { + "description": "Search by id", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List gateways" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["search", args["search"], true], + ], + }), + }, + { + name: "ai_gateway_gateways_update", + title: "Update a gateway", + description: "Updates the configuration of an AI Gateway, such as its caching, rate limiting, logging, and authentication settings.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "authentication": { + "type": "boolean" + }, + "byok_only": { + "description": "Requires customer-provided provider credentials and prevents fallback to Unified Billing.", + "type": "boolean" + }, + "cache_invalidate_on_update": { + "type": "boolean" + }, + "cache_ttl": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "collect_logs": { + "type": "boolean" + }, + "dlp": { + "anyOf": [ + { + "properties": { + "action": { + "enum": [ + "BLOCK", + "FLAG" + ], + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "profiles": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "enabled", + "profiles" + ], + "type": "object" + }, + { + "properties": { + "enabled": { + "type": "boolean" + }, + "policies": { + "items": { + "properties": { + "action": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "check": { + "items": { + "enum": [ + "REQUEST", + "RESPONSE" + ], + "type": "string" + }, + "type": "array" + }, + "enabled": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "profiles": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "check", + "enabled", + "id", + "profiles" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "enabled", + "policies" + ], + "type": "object" + } + ] + }, + "guardrails": { + "oneOf": [ + { + "properties": { + "prompt": { + "properties": { + "P1": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S1": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S10": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S11": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S12": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S13": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S2": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S3": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S4": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S5": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S6": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S7": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S8": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S9": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + } + }, + "type": "object" + }, + "response": { + "properties": { + "P1": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S1": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S10": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S11": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S12": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S13": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S2": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S3": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S4": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S5": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S6": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S7": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S8": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + }, + "S9": { + "enum": [ + "FLAG", + "BLOCK" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "prompt", + "response" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "log_classification": { + "type": "boolean" + }, + "log_management": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "log_management_strategy": { + "oneOf": [ + { + "enum": [ + "STOP_INSERTING", + "DELETE_OLDEST" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "logpush": { + "type": "boolean" + }, + "logpush_public_key": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "otel": { + "oneOf": [ + { + "items": { + "properties": { + "authorization": { + "type": "string" + }, + "content_type": { + "default": "json", + "enum": [ + "json", + "protobuf" + ], + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "url": { + "type": "string" + } + }, + "required": [ + "headers", + "url" + ], + "type": "object" + }, + "maxItems": 5, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "rate_limiting_interval": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "rate_limiting_limit": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "rate_limiting_technique": { + "oneOf": [ + { + "enum": [ + "fixed", + "sliding" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_backoff": { + "description": "Backoff strategy for retry delays", + "oneOf": [ + { + "enum": [ + "constant", + "linear", + "exponential" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retry_delay": { + "description": "Delay between retry attempts in milliseconds (0-60000)", + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "retry_max_attempts": { + "description": "Maximum number of retry attempts for failed requests (1-5)", + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "spend_limits": { + "oneOf": [ + { + "properties": { + "enabled": { + "default": false, + "type": "boolean" + }, + "rules": { + "default": [], + "items": { + "properties": { + "enabled": { + "default": true, + "type": "boolean" + }, + "id": { + "default": "00000000", + "type": "string" + }, + "limit": { + "type": "number" + }, + "limitType": { + "enum": [ + "cost" + ], + "type": "string" + }, + "metadata": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "mode": { + "enum": [ + "partition" + ], + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + { + "properties": { + "mode": { + "enum": [ + "filter" + ], + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "mode", + "values" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "model": { + "properties": { + "mode": { + "enum": [ + "filter" + ], + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "mode", + "values" + ], + "type": "object" + }, + "provider": { + "properties": { + "mode": { + "enum": [ + "filter" + ], + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "mode", + "values" + ], + "type": "object" + }, + "technique": { + "default": "sliding", + "enum": [ + "fixed", + "sliding" + ], + "type": "string" + }, + "window": { + "type": "integer" + } + }, + "required": [ + "limit", + "limitType", + "window" + ], + "type": "object" + }, + "maxItems": 20, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "store_id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "stripe": { + "oneOf": [ + { + "properties": { + "authorization": { + "type": "string" + }, + "usage_events": { + "items": { + "properties": { + "payload": { + "type": "string" + } + }, + "required": [ + "payload" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "authorization", + "usage_events" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "workers_ai_billing_mode": { + "default": "postpaid", + "description": "Controls how Workers AI inference calls routed through this gateway are billed. 'postpaid' bills the account directly through Workers AI; 'unified' deducts credits via AI Gateway using neuron-based pricing and delegates billing to AI Gateway.", + "enum": [ + "postpaid", + "unified" + ], + "type": "string" + }, + "zdr": { + "type": "boolean" + } + }, + "required": [ + "cache_invalidate_on_update", + "cache_ttl", + "collect_logs", + "rate_limiting_interval", + "rate_limiting_limit" + ], + "type": "object" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update a gateway" + }, + method: "PUT", + path: "/accounts/{account_id}/ai-gateway/gateways/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiGateway/logs/tools.ts b/src/generated/forge-mcp/aiGateway/logs/tools.ts new file mode 100644 index 00000000..4e62fa9b --- /dev/null +++ b/src/generated/forge-mcp/aiGateway/logs/tools.ts @@ -0,0 +1,722 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_gateway.logs`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_gateway_logs_delete", + title: "Delete Gateway Logs", + description: "Deletes gateway log entries matching the specified criteria.\n\nConfirm with the user before calling this tool. This permanently deletes every stored log entry on the gateway that matches the filters. Deleted logs cannot be recovered.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "filters": { + "items": { + "properties": { + "key": { + "enum": [ + "id", + "created_at", + "request_content_type", + "response_content_type", + "request_type", + "success", + "cached", + "provider", + "model", + "model_type", + "cost", + "tokens", + "tokens_in", + "tokens_out", + "duration", + "feedback", + "event_id", + "metadata.key", + "metadata.value", + "authentication", + "wholesale", + "compatibilityMode", + "dlp_action", + "user_agent" + ], + "type": "string" + }, + "operator": { + "enum": [ + "eq", + "neq", + "contains", + "lt", + "gt" + ], + "type": "string" + }, + "value": { + "description": "Filter values.", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "key", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "limit": { + "default": 10000, + "type": "integer" + }, + "order_by": { + "default": "created_at", + "enum": [ + "created_at", + "provider", + "model", + "model_type", + "success", + "cached", + "cost", + "tokens_in", + "tokens_out", + "duration", + "feedback" + ], + "type": "string" + }, + "order_by_direction": { + "default": "asc", + "enum": [ + "asc", + "desc" + ], + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Gateway Logs" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/logs", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/logs`, + query: [ + ["order_by", args["order_by"], true], + ["order_by_direction", args["order_by_direction"], true], + ["filters", args["filters"], true], + ["limit", args["limit"], true], + ], + }), + }, + { + name: "ai_gateway_logs_get", + title: "Get Gateway Log Detail", + description: "Retrieves detailed information for a specific AI Gateway log entry.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Gateway Log Detail" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/logs/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/logs/${pathParam(args, "id")}`, + }), + }, + { + name: "ai_gateway_logs_get_request", + title: "Get Gateway Log Request", + description: "Retrieves the original request payload for an AI Gateway log entry.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Gateway Log Request" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/logs/{id}/request", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/logs/${pathParam(args, "id")}/request`, + }), + }, + { + name: "ai_gateway_logs_get_response", + title: "Get Gateway Log Response", + description: "Retrieves the response payload for an AI Gateway log entry.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Gateway Log Response" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/logs/{id}/response", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/logs/${pathParam(args, "id")}/response`, + }), + }, + { + name: "ai_gateway_logs_list", + title: "List Gateway Logs", + description: "Lists request/response log entries for the AI gateway with filtering and pagination.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "ai_gateway_provider": { + "type": "string" + }, + "cached": { + "type": "boolean" + }, + "direction": { + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "end_date": { + "format": "date-time", + "type": "string" + }, + "feedback": { + "enum": [ + -1, + 0, + 1 + ], + "type": "integer" + }, + "filters": { + "items": { + "properties": { + "key": { + "enum": [ + "id", + "created_at", + "request_content_type", + "response_content_type", + "request_type", + "success", + "cached", + "provider", + "model", + "model_type", + "cost", + "tokens", + "tokens_in", + "tokens_out", + "duration", + "feedback", + "event_id", + "metadata.key", + "metadata.value", + "authentication", + "wholesale", + "compatibilityMode", + "dlp_action", + "user_agent" + ], + "type": "string" + }, + "operator": { + "enum": [ + "eq", + "neq", + "contains", + "lt", + "gt" + ], + "type": "string" + }, + "value": { + "description": "Filter values.", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "type": "array" + } + }, + "required": [ + "key", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "max_cost": { + "type": "number" + }, + "max_duration": { + "type": "number" + }, + "max_tokens_in": { + "type": "number" + }, + "max_tokens_out": { + "type": "number" + }, + "max_total_tokens": { + "type": "number" + }, + "meta_info": { + "type": "boolean" + }, + "min_cost": { + "type": "number" + }, + "min_duration": { + "type": "number" + }, + "min_tokens_in": { + "type": "number" + }, + "min_tokens_out": { + "type": "number" + }, + "min_total_tokens": { + "type": "number" + }, + "model": { + "description": "Model filter.", + "type": "string" + }, + "model_type": { + "type": "string" + }, + "order_by": { + "default": "created_at", + "enum": [ + "created_at", + "provider", + "model", + "model_type", + "success", + "cached" + ], + "type": "string" + }, + "order_by_direction": { + "default": "desc", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + }, + "request_content_type": { + "type": "string" + }, + "response_content_type": { + "type": "string" + }, + "search": { + "description": "Free-text search over log metadata.", + "type": "string" + }, + "start_date": { + "format": "date-time", + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + required: [ + "account_id", + "gateway_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Gateway Logs" + }, + method: "GET", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/logs", + extensions: { + "x-api-token-group": [ + "AI Gateway Write", + "AI Gateway Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/logs`, + query: [ + ["search", args["search"], true], + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["order_by", args["order_by"], true], + ["order_by_direction", args["order_by_direction"], true], + ["filters", args["filters"], true], + ["meta_info", args["meta_info"], true], + ["direction", args["direction"], true], + ["start_date", args["start_date"], true], + ["end_date", args["end_date"], true], + ["min_cost", args["min_cost"], true], + ["max_cost", args["max_cost"], true], + ["min_tokens_in", args["min_tokens_in"], true], + ["max_tokens_in", args["max_tokens_in"], true], + ["min_tokens_out", args["min_tokens_out"], true], + ["max_tokens_out", args["max_tokens_out"], true], + ["min_total_tokens", args["min_total_tokens"], true], + ["max_total_tokens", args["max_total_tokens"], true], + ["min_duration", args["min_duration"], true], + ["max_duration", args["max_duration"], true], + ["feedback", args["feedback"], true], + ["success", args["success"], true], + ["cached", args["cached"], true], + ["model", args["model"], true], + ["model_type", args["model_type"], true], + ["provider", args["ai_gateway_provider"], true], + ["request_content_type", args["request_content_type"], true], + ["response_content_type", args["response_content_type"], true], + ], + }), + }, + { + name: "ai_gateway_logs_update", + title: "Patch Gateway Log", + description: "Updates metadata for an AI Gateway log entry.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "feedback": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "metadata": { + "oneOf": [ + { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "score": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "gateway_id": { + "description": "Unique identifier of the AI Gateway within the account.", + "type": "string" + }, + "id": { + "type": "string" + } + }, + required: [ + "account_id", + "gateway_id", + "id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Patch Gateway Log" + }, + method: "PATCH", + path: "/accounts/{account_id}/ai-gateway/gateways/{gateway_id}/logs/{id}", + extensions: { + "x-api-token-group": [ + "AI Gateway Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.aig" + ], + "x-fern-enum": { + "com.cloudflare.api.account.aig": { + "name": "com_cloudflare_api_account_aig" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-gateway/gateways/${pathParam(args, "gateway_id")}/logs/${pathParam(args, "id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiSearch/items/tools.ts b/src/generated/forge-mcp/aiSearch/items/tools.ts new file mode 100644 index 00000000..90700526 --- /dev/null +++ b/src/generated/forge-mcp/aiSearch/items/tools.ts @@ -0,0 +1,762 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_search.items`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_search_items_chunks", + title: "List Item Chunks.", + description: "Lists chunks for a specific item in an AI Search instance, including their text content.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "item_id": { + "type": "string" + }, + "limit": { + "default": 20, + "type": "integer" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + }, + "offset": { + "default": 0, + "type": "integer" + } + }, + required: [ + "account_id", + "namespace", + "instance_id", + "item_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Item Chunks." + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/items/{item_id}/chunks", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "item_id": { + "description": "Indexed item ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/items/${pathParam(args, "item_id")}/chunks`, + query: [ + ["limit", args["limit"], true], + ["offset", args["offset"], true], + ], + }), + }, + { + name: "ai_search_items_delete", + title: "Delete Item.", + description: "Deletes a file from a managed AI Search instance and removes its indexed data.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "item_id": { + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id", + "item_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Item." + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/items/{item_id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "item_id": { + "description": "Indexed item ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/items/${pathParam(args, "item_id")}`, + }), + }, + { + name: "ai_search_items_download", + title: "Download Item Content.", + description: "Downloads the raw file content for a specific item from the managed AI Search instance storage.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "item_id": { + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id", + "item_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Download Item Content." + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/items/{item_id}/download", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "item_id": { + "description": "Indexed item ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/items/${pathParam(args, "item_id")}/download`, + }), + }, + { + name: "ai_search_items_get", + title: "Get Item.", + description: "Retrieves a specific indexed item from an AI Search instance.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "item_id": { + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id", + "item_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Item." + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/items/{item_id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "item_id": { + "description": "Indexed item ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/items/${pathParam(args, "item_id")}`, + }), + }, + { + name: "ai_search_items_list", + title: "Items List.", + description: "Lists indexed items in an AI Search instance.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "item_id": { + "description": "Return only the item with this unique ID. Returns at most one item.", + "type": "string" + }, + "key": { + "description": "Return only items with this exact key (object key / filename). Each key is unique within a source, so combine with `source` to disambiguate across data sources.", + "type": "string" + }, + "metadata_filter": { + "description": "JSON-encoded metadata filter using Vectorize filter syntax. Examples: {\"folder\":\"reports/\"}, {\"timestamp\":{\"$gte\":1700000000000}}, {\"folder\":{\"$in\":[\"docs/\",\"reports/\"]}}.", + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + }, + "search": { + "type": "string" + }, + "sort_by": { + "default": "status", + "description": "Sort order for items. \"status\" (default) sorts items according to status priority, then last_seen_at. \"modified_at\" sorts items according to file modification time (most recent first), falling back to created_at.", + "enum": [ + "status", + "modified_at" + ], + "type": "string" + }, + "source": { + "description": "Return only items with this source_id. Use \"builtin\" for uploaded files, or a source identifier like \"web-crawler:https://example.com\".", + "type": "string" + }, + "status": { + "enum": [ + "queued", + "running", + "completed", + "error", + "skipped", + "outdated" + ], + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Items List." + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/items", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/items`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["search", args["search"], true], + ["sort_by", args["sort_by"], true], + ["status", args["status"], true], + ["source", args["source"], true], + ["metadata_filter", args["metadata_filter"], true], + ["item_id", args["item_id"], true], + ["key", args["key"], true], + ], + }), + }, + { + name: "ai_search_items_logs", + title: "Item Logs.", + description: "Lists processing logs for a specific item in an AI Search instance.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "cursor": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "item_id": { + "type": "string" + }, + "limit": { + "default": 50, + "type": "integer" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id", + "item_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Item Logs." + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/items/{item_id}/logs", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "item_id": { + "description": "Indexed item ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/items/${pathParam(args, "item_id")}/logs`, + query: [ + ["limit", args["limit"], true], + ["cursor", args["cursor"], true], + ], + }), + }, + { + name: "ai_search_items_sync", + title: "Sync Item.", + description: "Synchronizes an item to an AI Search instance index.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "next_action": { + "enum": [ + "INDEX" + ], + "type": "string" + }, + "wait_for_completion": { + "default": false, + "description": "Wait for indexing before responding. After processing, vector-indexed instances use any time remaining in a 25s wait budget to confirm Vectorize ingestion. Processing itself continues uninterrupted and can exceed that budget. If confirmation times out, the response returns the current item state and background indexing continues. Defaults to false.", + "type": "boolean" + } + }, + "required": [ + "next_action" + ], + "type": "object" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "item_id": { + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id", + "item_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Sync Item." + }, + method: "PATCH", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/items/{item_id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "item_id": { + "description": "Indexed item ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + }, + "next_action": { + "default": "INDEX", + "hidden": true + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/items/${pathParam(args, "item_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_items_upload", + title: "Upload Item.", + description: "Uploads a file to a managed AI Search instance via multipart/form-data.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Upload Item." + }, + method: "POST", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/items", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/items`, + }), + }, + { + name: "ai_search_items_upsert", + title: "Create or Update Item.", + description: "Creates or updates an indexed item in an AI Search instance.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "key": { + "description": "Item key / filename. Must not exceed 128 characters.", + "type": "string" + }, + "next_action": { + "enum": [ + "INDEX" + ], + "type": "string" + }, + "wait_for_completion": { + "default": false, + "description": "Wait for indexing before responding. After processing, vector-indexed instances use any time remaining in a 25s wait budget to confirm Vectorize ingestion. Processing itself continues uninterrupted and can exceed that budget. If confirmation times out, the response returns the current item state and background indexing continues. Defaults to false.", + "type": "boolean" + } + }, + "required": [ + "key", + "next_action" + ], + "type": "object" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create or Update Item." + }, + method: "PUT", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/items", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + }, + "next_action": { + "default": "INDEX", + "hidden": true + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/items`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiSearch/jobs/tools.ts b/src/generated/forge-mcp/aiSearch/jobs/tools.ts new file mode 100644 index 00000000..3f4d9f88 --- /dev/null +++ b/src/generated/forge-mcp/aiSearch/jobs/tools.ts @@ -0,0 +1,406 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_search.jobs`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_search_jobs_cancel", + title: "Cancel an indexing job.", + description: "Cancels an in-progress indexing job for an AI Search instance.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation cancels the running indexing job.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "action": { + "enum": [ + "cancel" + ], + "type": "string" + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "job_id": { + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id", + "job_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Cancel an indexing job." + }, + method: "PATCH", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/jobs/{job_id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "action": { + "default": "cancel", + "hidden": true + }, + "id": { + "description": "AI Search instance ID." + }, + "job_id": { + "description": "Indexing job ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/jobs/${pathParam(args, "job_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_jobs_create", + title: "Create new job", + description: "Creates a new indexing job for an AI Search instance.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "description": { + "type": "string" + } + }, + "type": "object" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create new job" + }, + method: "POST", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/jobs", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "description": { + "description": "Optional description for the indexing job." + }, + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/jobs`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_jobs_get", + title: "Get a Job Details", + description: "Retrieves details for a specific AI Search indexing job.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "job_id": { + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id", + "job_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a Job Details" + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/jobs/{job_id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "job_id": { + "description": "Indexing job ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/jobs/${pathParam(args, "job_id")}`, + }), + }, + { + name: "ai_search_jobs_list", + title: "List Jobs", + description: "Lists indexing jobs for an AI Search instance.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Jobs" + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/jobs", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/jobs`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, + { + name: "ai_search_jobs_logs", + title: "List Job Logs", + description: "Lists log entries for an AI Search indexing job.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "job_id": { + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 20, + "type": "integer" + } + }, + required: [ + "account_id", + "namespace", + "instance_id", + "job_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Job Logs" + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/jobs/{job_id}/logs", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "job_id": { + "description": "Indexing job ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/jobs/${pathParam(args, "job_id")}/logs`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/aiSearch/namespace/tools.ts b/src/generated/forge-mcp/aiSearch/namespace/tools.ts new file mode 100644 index 00000000..5e886a12 --- /dev/null +++ b/src/generated/forge-mcp/aiSearch/namespace/tools.ts @@ -0,0 +1,531 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_search.namespace`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_search_namespace_create", + title: "Create a namespace", + description: "Create a namespace for organizing AI Search instances.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "description": { + "description": "Optional description for the namespace. Max 256 characters.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "name": { + "type": "string" + }, + "public_endpoint_params": { + "properties": { + "authorized_hosts": { + "items": { + "type": "string" + }, + "type": "array" + }, + "chat_completions_endpoint": { + "properties": { + "disabled": { + "default": false, + "description": "Disable chat completions endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + }, + "custom_domains": { + "description": "Custom domain hostnames that alias this public endpoint. GET and create responses return the current set; on update (PUT) this field is only echoed back when supplied in the request body, otherwise it is null (omit it to leave domains unchanged).", + "oneOf": [ + { + "items": { + "type": "string" + }, + "maxItems": 1, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "default_domain_enabled": { + "default": true, + "description": "When false, the instance is reachable only via a registered custom domain and the default .search.ai.cloudflare.com host returns 404. Requires at least one custom domain. Defaults to true. public_endpoint_params is replaced wholesale on update, so resend default_domain_enabled on every update to keep the default host off — omitting it resets to true.", + "type": "boolean" + }, + "enabled": { + "default": false, + "type": "boolean" + }, + "instances_allowed": { + "default": [], + "description": "Instance IDs exposed through the namespace public endpoint. Empty means nothing is searchable. Every ID must reference an existing instance in this namespace, and the list must stay within the account's multi-instance search limit.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "mcp": { + "properties": { + "description": { + "default": "Finds exactly what you're looking for", + "type": "string" + }, + "disabled": { + "default": false, + "description": "Disable MCP endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + }, + "rate_limit": { + "properties": { + "period_ms": { + "type": "integer" + }, + "requests": { + "type": "integer" + }, + "technique": { + "enum": [ + "fixed", + "sliding" + ], + "type": "string" + } + }, + "type": "object" + }, + "search_endpoint": { + "properties": { + "disabled": { + "default": false, + "description": "Disable search endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "name" + ], + "type": "object" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a namespace" + }, + method: "POST", + path: "/accounts/{account_id}/ai-search/namespaces", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "name": { + "description": "Name for the new namespace.", + "positional": true + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_namespace_delete", + title: "Delete a namespace", + description: "Deletes a namespace permanently. The namespace must not contain any instances (instances whose deletion is still in progress do not count), and the default namespace cannot be deleted.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation permanently deletes the namespace.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "namespace": { + "type": "string" + } + }, + required: [ + "account_id", + "namespace" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a namespace" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-search/namespaces/{name}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "name": { + "description": "Namespace to delete." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}`, + }), + }, + { + name: "ai_search_namespace_get", + title: "Get a namespace", + description: "Retrieve a namespace and its description.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "namespace": { + "type": "string" + } + }, + required: [ + "account_id", + "namespace" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a namespace" + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{name}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "name": { + "description": "Namespace to retrieve." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}`, + }), + }, + { + name: "ai_search_namespace_list", + title: "List namespaces", + description: "Lists namespaces in the account, including their descriptions and creation times.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "page": { + "default": 1, + "description": "Page number (1-indexed).", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Number of results per page.", + "type": "integer" + }, + "search": { + "description": "Filter namespaces whose name or description contains this string (case-insensitive).", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List namespaces" + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["search", args["search"], true], + ], + }), + }, + { + name: "ai_search_namespace_update", + title: "Update a namespace", + description: "Updates the description and/or the public endpoint configuration of an existing namespace. The default namespace's description cannot be modified, but its public endpoint can.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "description": { + "description": "Optional description for the namespace. Max 256 characters.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "public_endpoint_params": { + "oneOf": [ + { + "properties": { + "authorized_hosts": { + "items": { + "type": "string" + }, + "type": "array" + }, + "chat_completions_endpoint": { + "properties": { + "disabled": { + "default": false, + "description": "Disable chat completions endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + }, + "custom_domains": { + "description": "Custom domain hostnames that alias this public endpoint. GET and create responses return the current set; on update (PUT) this field is only echoed back when supplied in the request body, otherwise it is null (omit it to leave domains unchanged).", + "oneOf": [ + { + "items": { + "type": "string" + }, + "maxItems": 1, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "default_domain_enabled": { + "default": true, + "description": "When false, the instance is reachable only via a registered custom domain and the default .search.ai.cloudflare.com host returns 404. Requires at least one custom domain. Defaults to true. public_endpoint_params is replaced wholesale on update, so resend default_domain_enabled on every update to keep the default host off — omitting it resets to true.", + "type": "boolean" + }, + "enabled": { + "default": false, + "type": "boolean" + }, + "instances_allowed": { + "default": [], + "description": "Instance IDs exposed through the namespace public endpoint. Empty means nothing is searchable. Every ID must reference an existing instance in this namespace, and the list must stay within the account's multi-instance search limit.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "mcp": { + "properties": { + "description": { + "default": "Finds exactly what you're looking for", + "type": "string" + }, + "disabled": { + "default": false, + "description": "Disable MCP endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + }, + "rate_limit": { + "properties": { + "period_ms": { + "type": "integer" + }, + "requests": { + "type": "integer" + }, + "technique": { + "enum": [ + "fixed", + "sliding" + ], + "type": "string" + } + }, + "type": "object" + }, + "search_endpoint": { + "properties": { + "disabled": { + "default": false, + "description": "Disable search endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "namespace": { + "type": "string" + } + }, + required: [ + "account_id", + "namespace" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update a namespace" + }, + method: "PUT", + path: "/accounts/{account_id}/ai-search/namespaces/{name}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "name": { + "description": "Namespace to update." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiSearch/tokens/tools.ts b/src/generated/forge-mcp/aiSearch/tokens/tools.ts new file mode 100644 index 00000000..dc68920c --- /dev/null +++ b/src/generated/forge-mcp/aiSearch/tokens/tools.ts @@ -0,0 +1,364 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `ai_search.tokens`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_search_tokens_create", + title: "Create a token", + description: "Create a stored Cloudflare credential for an AI Search instance to access its data source.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "cf_api_id": { + "type": "string" + }, + "cf_api_key": { + "type": "string" + }, + "legacy": { + "default": true, + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "required": [ + "cf_api_id", + "cf_api_key", + "name" + ], + "type": "object" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a token" + }, + method: "POST", + path: "/accounts/{account_id}/ai-search/tokens", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "cf_api_id": { + "description": "Cloudflare API token ID." + }, + "cf_api_key": { + "description": "Cloudflare API token value." + }, + "legacy": { + "description": "Whether the credential uses the legacy API key format." + }, + "name": { + "description": "Human-readable name for the credential.", + "positional": true + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/tokens`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_tokens_delete", + title: "Delete a token", + description: "Deletes a stored AI Search credential permanently. Credentials in use by an instance cannot be deleted.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation permanently deletes the stored credential.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "token_id": { + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "token_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a token" + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-search/tokens/{id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "Stored credential record ID." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/tokens/${pathParam(args, "token_id")}`, + }), + }, + { + name: "ai_search_tokens_get", + title: "Get a token", + description: "Retrieve a stored AI Search credential without exposing its secret.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "token_id": { + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "token_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a token" + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/tokens/{id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "Stored credential record ID." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/tokens/${pathParam(args, "token_id")}`, + }), + }, + { + name: "ai_search_tokens_list", + title: "List tokens", + description: "Lists stored AI Search credentials in the account without exposing their secrets.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "page": { + "default": 1, + "description": "Page number (1-indexed).", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Number of results per page.", + "type": "integer" + }, + "search": { + "description": "Filter tokens whose name contains this string (case-insensitive).", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List tokens" + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/tokens", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/tokens`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["search", args["search"], true], + ], + }), + }, + { + name: "ai_search_tokens_update", + title: "Update a token", + description: "Replace a stored AI Search credential and invalidate cached credentials for instances that use it.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "cf_api_id": { + "type": "string" + }, + "cf_api_key": { + "type": "string" + }, + "legacy": { + "default": true, + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "required": [ + "cf_api_id", + "cf_api_key", + "name" + ], + "type": "object" + }, + "token_id": { + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "token_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update a token" + }, + method: "PUT", + path: "/accounts/{account_id}/ai-search/tokens/{id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "cf_api_id": { + "description": "Cloudflare API token ID." + }, + "cf_api_key": { + "description": "Cloudflare API token value." + }, + "id": { + "description": "Stored credential record ID." + }, + "legacy": { + "description": "Whether the credential uses the legacy API key format." + }, + "name": { + "description": "Human-readable name for the credential." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/tokens/${pathParam(args, "token_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiSearch/tools.ts b/src/generated/forge-mcp/aiSearch/tools.ts new file mode 100644 index 00000000..e5fc2dd8 --- /dev/null +++ b/src/generated/forge-mcp/aiSearch/tools.ts @@ -0,0 +1,3077 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; + +/** + * The tools of `ai_search`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_search_chat_completions", + title: "Chat Completions", + description: "Performs a chat completion request against an AI Search instance, using indexed content as context for generating responses.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "ai_search_options": { + "properties": { + "cache": { + "properties": { + "cache_threshold": { + "enum": [ + "super_strict_match", + "close_enough", + "flexible_friend", + "anything_goes" + ], + "type": "string" + }, + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "custom_metadata": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "description": "Metadata added to AI Gateway logs for requests this operation triggers. Accepts up to 2 string, number, or boolean entries. Reserved keys: 'ai-search', 'task', 'origin', and any key beginning with 'cf.'.", + "type": "object" + }, + "query_rewrite": { + "properties": { + "enabled": { + "type": "boolean" + }, + "model": { + "description": "A Workers AI model ID or an AI Gateway model ID compatible with the OpenAI Chat Completions API. An empty string uses the configured or default model.", + "type": "string" + }, + "rewrite_prompt": { + "type": "string" + } + }, + "type": "object" + }, + "reranking": { + "properties": { + "enabled": { + "type": "boolean" + }, + "match_threshold": { + "default": 0.4, + "type": "number" + }, + "model": { + "type": "string" + } + }, + "type": "object" + }, + "retrieval": { + "properties": { + "boost_by": { + "description": "Metadata fields to boost search results by. Overrides the instance-level boost_by config. Direction defaults to 'asc' for numeric/datetime fields, 'exists' for text/boolean fields. Fields must match 'timestamp' or a defined custom_metadata field.", + "items": { + "properties": { + "direction": { + "description": "Boost direction. 'desc' = higher values rank higher (e.g. newer timestamps). 'asc' = lower values rank higher. 'exists' = boost chunks that have the field. 'not_exists' = boost chunks that lack the field. Optional — defaults to 'asc' for numeric/datetime fields, 'exists' for text/boolean fields.", + "enum": [ + "asc", + "desc", + "exists", + "not_exists" + ], + "type": "string" + }, + "field": { + "description": "Metadata field name to boost by. Use 'timestamp' for document freshness, or any custom_metadata field. Numeric and datetime fields support all four directions (asc, desc, exists, not_exists); text/boolean fields only support exists/not_exists.", + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "context_expansion": { + "default": 0, + "type": "integer" + }, + "filters": { + "type": "object" + }, + "fusion_method": { + "enum": [ + "max", + "rrf" + ], + "type": "string" + }, + "keyword_match_mode": { + "description": "Controls which documents become candidates for BM25 scoring. 'and' restricts candidates to documents containing all query terms; 'or' includes any document containing at least one term and ranks results according to BM25 relevance. When omitted, falls back to the instance-level retrieval_options.keyword_match_mode, then to 'and'.", + "enum": [ + "and", + "or" + ], + "type": "string" + }, + "match_threshold": { + "description": "Minimum similarity score a chunk must reach to be returned. When omitted, falls back to the instance-level score_threshold, then to 0.4.", + "type": "number" + }, + "max_num_results": { + "description": "Maximum number of results to return. When omitted, falls back to the instance-level max_num_results, then to 10.", + "type": "integer" + }, + "retrieval_type": { + "enum": [ + "vector", + "keyword", + "hybrid" + ], + "type": "string" + }, + "return_on_failure": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "messages": { + "items": { + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "oneOf": [ + { + "properties": { + "text": { + "type": "string" + }, + "type": { + "enum": [ + "text" + ], + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + }, + { + "properties": { + "image_url": { + "properties": { + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": { + "enum": [ + "image_url" + ], + "type": "string" + } + }, + "required": [ + "image_url", + "type" + ], + "type": "object" + }, + { + "properties": { + "file": { + "properties": { + "file_data": { + "type": "string" + }, + "file_id": { + "type": "string" + }, + "filename": { + "type": "string" + } + }, + "required": [ + "filename" + ], + "type": "object" + }, + "type": { + "enum": [ + "file" + ], + "type": "string" + } + }, + "required": [ + "file", + "type" + ], + "type": "object" + } + ] + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "role": { + "enum": [ + "system", + "developer", + "user", + "assistant", + "tool" + ], + "type": "string" + } + }, + "required": [ + "content", + "role" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "model": { + "description": "A Workers AI model ID or an AI Gateway model ID compatible with the OpenAI Chat Completions API. An empty string uses the configured or default model.", + "type": "string" + }, + "stream": { + "type": "boolean" + } + }, + "required": [ + "messages" + ], + "type": "object" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Chat Completions" + }, + method: "POST", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/chat/completions", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/chat/completions`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_create", + title: "Create an AI Search instance.", + description: "Create a new AI Search instance with the given configuration. If type is omitted or null, a non-blank HTTP(S) source infers web-crawler and any other source infers r2; r2 sources must name an existing bucket. A missing or blank source without a type creates a managed upload-only instance.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "ai_gateway_id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ai_search_model": { + "description": "A Workers AI model ID or an AI Gateway model ID compatible with the OpenAI Chat Completions API. An empty string uses the configured or default model.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "cache": { + "default": true, + "type": "boolean" + }, + "cache_threshold": { + "default": "close_enough", + "enum": [ + "super_strict_match", + "close_enough", + "flexible_friend", + "anything_goes" + ], + "type": "string" + }, + "cache_ttl": { + "default": 172800, + "description": "Cache entry TTL in seconds. Allowed values: 600 (10min), 1800 (30min), 3600 (1h), 7200 (2h), 21600 (6h), 43200 (12h), 86400 (24h), 172800 (48h), 259200 (72h), 518400 (6d).", + "enum": [ + 600, + 1800, + 3600, + 7200, + 21600, + 43200, + 86400, + 172800, + 259200, + 518400 + ], + "type": "integer" + }, + "chunk": { + "default": true, + "type": "boolean" + }, + "chunk_overlap": { + "default": 10, + "type": "integer" + }, + "chunk_size": { + "type": "integer" + }, + "custom_metadata": { + "items": { + "properties": { + "data_type": { + "enum": [ + "text", + "number", + "boolean", + "datetime" + ], + "type": "string" + }, + "field_name": { + "type": "string" + } + }, + "required": [ + "data_type", + "field_name" + ], + "type": "object" + }, + "maxItems": 5, + "type": "array" + }, + "embedding_model": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fusion_method": { + "default": "rrf", + "enum": [ + "max", + "rrf" + ], + "type": "string" + }, + "hybrid_search_enabled": { + "deprecated": true, + "description": "Deprecated — use index_method instead. Defaults to true for new instances; set false to create a vector-only instance.", + "type": "boolean" + }, + "id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "index_method": { + "description": "Controls which storage backends indexing uses. Defaults to vector and keyword indexing for new instances. When set, both vector and keyword are required.", + "properties": { + "keyword": { + "description": "Enable keyword (BM25) storage backend.", + "type": "boolean" + }, + "vector": { + "description": "Enable vector (embedding) storage backend.", + "type": "boolean" + } + }, + "required": [ + "keyword", + "vector" + ], + "type": "object" + }, + "indexing_options": { + "oneOf": [ + { + "properties": { + "keyword_tokenizer": { + "default": "porter", + "description": "Tokenizer used for keyword search indexing. porter provides word-level tokenization with Porter stemming (good for natural language queries). trigram enables character-level substring matching (good for partial matches, code, identifiers). Changing this triggers a full re-index. Defaults to porter.", + "enum": [ + "porter", + "trigram" + ], + "type": "string" + }, + "use_ocr": { + "default": false, + "description": "Enables OCR ingestion for PDFs and images. Changing this triggers a full re-index. Defaults to false.", + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "max_num_results": { + "default": 10, + "type": "integer" + }, + "metadata": { + "properties": { + "created_from_aisearch_wizard": { + "type": "boolean" + }, + "created_from_emdash_plugin": { + "properties": { + "type": { + "enum": [ + "native", + "rest" + ], + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "type", + "version" + ], + "type": "object" + }, + "worker_domain": { + "type": "string" + } + }, + "type": "object" + }, + "public_endpoint_params": { + "properties": { + "authorized_hosts": { + "items": { + "type": "string" + }, + "type": "array" + }, + "chat_completions_endpoint": { + "properties": { + "disabled": { + "default": false, + "description": "Disable chat completions endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + }, + "custom_domains": { + "description": "Custom domain hostnames that alias this public endpoint. GET and create responses return the current set; on update (PUT) this field is only echoed back when supplied in the request body, otherwise it is null (omit it to leave domains unchanged).", + "oneOf": [ + { + "items": { + "type": "string" + }, + "maxItems": 1, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "default_domain_enabled": { + "default": true, + "description": "When false, the instance is reachable only via a registered custom domain and the default .search.ai.cloudflare.com host returns 404. Requires at least one custom domain. Defaults to true. public_endpoint_params is replaced wholesale on update, so resend default_domain_enabled on every update to keep the default host off — omitting it resets to true.", + "type": "boolean" + }, + "enabled": { + "default": false, + "type": "boolean" + }, + "mcp": { + "properties": { + "description": { + "default": "Finds exactly what you're looking for", + "type": "string" + }, + "disabled": { + "default": false, + "description": "Disable MCP endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + }, + "rate_limit": { + "properties": { + "period_ms": { + "type": "integer" + }, + "requests": { + "type": "integer" + }, + "technique": { + "enum": [ + "fixed", + "sliding" + ], + "type": "string" + } + }, + "type": "object" + }, + "search_endpoint": { + "properties": { + "disabled": { + "default": false, + "description": "Disable search endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "reranking": { + "default": false, + "type": "boolean" + }, + "reranking_model": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retrieval_options": { + "oneOf": [ + { + "properties": { + "boost_by": { + "description": "Metadata fields to boost search results by. Each entry specifies a metadata field and an optional direction. Direction defaults to 'asc' for numeric/datetime fields and 'exists' for text/boolean fields. Fields must match 'timestamp' or a defined custom_metadata field.", + "items": { + "properties": { + "direction": { + "description": "Boost direction. 'desc' = higher values rank higher (e.g. newer timestamps). 'asc' = lower values rank higher. 'exists' = boost chunks that have the field. 'not_exists' = boost chunks that lack the field. Optional — defaults to 'asc' for numeric/datetime fields, 'exists' for text/boolean fields.", + "enum": [ + "asc", + "desc", + "exists", + "not_exists" + ], + "type": "string" + }, + "field": { + "description": "Metadata field name to boost by. Use 'timestamp' for document freshness, or any custom_metadata field. Numeric and datetime fields support all four directions (asc, desc, exists, not_exists); text/boolean fields only support exists/not_exists.", + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "keyword_match_mode": { + "description": "Controls which documents become candidates for BM25 scoring. 'and' restricts candidates to documents containing all query terms; 'or' includes any document containing at least one term and ranks results according to BM25 relevance. When omitted on an update, the existing stored value stays unchanged; when never set, search falls back to 'and'.", + "enum": [ + "and", + "or" + ], + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "rewrite_model": { + "description": "A Workers AI model ID or an AI Gateway model ID compatible with the OpenAI Chat Completions API. An empty string uses the configured or default model.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "rewrite_query": { + "default": false, + "type": "boolean" + }, + "score_threshold": { + "description": "Minimum similarity score a chunk must reach to be returned. Defaults to 0.4.", + "type": "number" + }, + "source": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "source_params": { + "oneOf": [ + { + "properties": { + "exclude_items": { + "description": "List of path patterns to exclude. Uses micromatch glob syntax: * matches within a path segment, ** matches across path segments (e.g., /admin/** matches /admin/users and /admin/settings/advanced). Most accounts have a limit of 10 rules; contact support to raise it.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "include_items": { + "description": "List of path patterns to include. Uses micromatch glob syntax: * matches within a path segment, ** matches across path segments (e.g., /blog/** matches /blog/post and /blog/2024/post). Most accounts have a limit of 10 rules; contact support to raise it.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "prefix": { + "type": "string" + }, + "r2_jurisdiction": { + "type": "string" + }, + "web_crawler": { + "default": { + "parse_type": "sitemap" + }, + "properties": { + "discover_options": { + "description": "Options for parse_type 'discover', where Browser Run discovers URLs through link following and sitemaps. Ignored for 'sitemap'.", + "properties": { + "depth": { + "default": 5, + "description": "Maximum link-follow depth from the seed URL.", + "type": "number" + }, + "include_external_links": { + "default": false, + "description": "Follow links that point outside the source domain. Must stay `false` because discover crawls only cover the zone you own.", + "type": "boolean" + }, + "include_subdomains": { + "default": false, + "description": "Follow links to subdomains of the source host.", + "type": "boolean" + }, + "limit": { + "default": 100000, + "description": "Maximum number of pages to crawl (1-100000).", + "type": "number" + }, + "max_age": { + "default": 86400, + "description": "Maximum content age in seconds to accept (0–604800).", + "type": "number" + }, + "source": { + "default": "all", + "description": "Where the crawler looks for URLs: 'sitemaps' reads sitemap XML only, 'links' follows page links only, 'all' does both.", + "enum": [ + "all", + "sitemaps", + "links" + ], + "type": "string" + } + }, + "type": "object" + }, + "parse_options": { + "properties": { + "content_selector": { + "description": "List of path-to-selector mappings for extracting specific content from crawled pages. Each entry pairs a URL glob pattern with a CSS selector. The first matching path wins. The crawler stores and indexes only the matched HTML fragment. Omit the field to disable content selection; the API rejects empty arrays.", + "items": { + "properties": { + "path": { + "description": "Glob pattern to match against the page URL path. Uses standard glob syntax: * matches within a segment, ** crosses directories.", + "type": "string" + }, + "selector": { + "description": "CSS selector to extract content from pages matching the path pattern. Disallowed characters: ;, `, $, {, }, \\. Must target a single element; if multiple elements match, the crawler ignores the selector and uses the full page.", + "type": "string" + } + }, + "required": [ + "path", + "selector" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + }, + "include_headers": { + "additionalProperties": { + "type": "string" + }, + "description": "Up to 5 custom HTTP headers sent with each crawl request. Names must use RFC-7230 token characters, excluding spaces, colons, and control characters. Values must use HTAB and printable ASCII only, excluding CR and LF.", + "type": "object" + }, + "include_images": { + "default": false, + "type": "boolean" + }, + "specific_sitemaps": { + "description": "List of specific sitemap URLs to use for crawling. Only valid when parse_type is 'sitemap'.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "use_browser_rendering": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + "parse_type": { + "default": "sitemap", + "description": "How the crawler finds URLs. 'sitemap' reads XML sitemaps; 'discover' follows links recursively and requires the source to belong to a Verified zone on this account.", + "enum": [ + "sitemap", + "discover" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "sync_interval": { + "description": "Interval between automatic syncs, in seconds. Allowed values: 900 (15min), 1800 (30min), 3600 (1h), 7200 (2h), 14400 (4h), 21600 (6h), 43200 (12h), 86400 (24h). Defaults to 21600 (6h); instances crawling a domain outside the account may be set to 86400.", + "enum": [ + 900, + 1800, + 3600, + 7200, + 14400, + 21600, + 43200, + 86400 + ], + "type": "integer" + }, + "token_id": { + "format": "uuid", + "type": "string" + }, + "type": { + "description": "Source type. When omitted or null with a non-blank source, HTTP(S) URLs infer web-crawler and existing R2 bucket names infer r2. A missing or blank source without a type uses managed upload-only storage.", + "oneOf": [ + { + "enum": [ + "r2", + "web-crawler" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create an AI Search instance." + }, + method: "POST", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "Unique ID for the new AI Search instance.", + "positional": true + }, + "namespace": { + "description": "Namespace to use for this operation." + }, + "source": { + "description": "R2 bucket name or HTTP(S) root website URL to index. When type is omitted, the source determines it." + }, + "source_params": { + "description": "Optional data source settings as a JSON object." + }, + "type": { + "description": "Data source type: r2 or web-crawler." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_delete", + title: "Delete an AI Search instance.", + description: "Deletes an AI Search instance and all its indexed data permanently.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation permanently deletes the AI Search instance and all its indexed data.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete an AI Search instance." + }, + method: "DELETE", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}`, + }), + }, + { + name: "ai_search_get", + title: "Get an AI Search instance.", + description: "Retrieve the configuration and status of an AI Search instance.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get an AI Search instance." + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}`, + }), + }, + { + name: "ai_search_list", + title: "List AI Search instances.", + description: "Lists all AI Search instances in the account.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "hostname": { + "description": "Return only instances with this exact Search for Agents hostname (case-insensitive).", + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + }, + "order_by": { + "default": "created_at", + "description": "Field to order results by.", + "enum": [ + "created_at" + ], + "type": "string" + }, + "order_by_direction": { + "default": "desc", + "description": "Order direction.", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "page": { + "default": 1, + "description": "Page number (1-indexed).", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Number of results per page.", + "type": "integer" + }, + "search": { + "description": "Filter instances whose id contains this string (case-insensitive).", + "type": "string" + } + }, + required: [ + "account_id", + "namespace" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List AI Search instances." + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["search", args["search"], true], + ["hostname", args["hostname"], true], + ["order_by", args["order_by"], true], + ["order_by_direction", args["order_by_direction"], true], + ], + }), + }, + { + name: "ai_search_move", + title: "Move an instance to a different namespace.", + description: "Moves an instance from its current namespace to the specified target namespace. Use 'default' with --destination-namespace to move the instance back to the default namespace. Fails with 400 if the target namespace already has an instance with the same id (ids must be unique within a namespace — the same id can exist in different namespaces).", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "new_namespace": { + "description": "Target namespace to move the instance into.", + "type": "string" + } + }, + "required": [ + "new_namespace" + ], + "type": "object" + }, + "instance_id": { + "description": "Instance id.", + "type": "string" + }, + "source_namespace": { + "description": "Current namespace of the instance.", + "type": "string" + } + }, + required: [ + "account_id", + "source_namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Move an instance to a different namespace." + }, + method: "PATCH", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace currently containing the instance." + }, + "new_namespace": { + "description": "Namespace to move the instance into." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "source_namespace")}/instances/${pathParam(args, "instance_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_multi_chat_completions", + title: "Multi-Instance Chat Completions", + description: "Performs a chat completion request against multiple AI Search instances in parallel, merging retrieved content as context for generating a response.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "ai_search_options": { + "properties": { + "cache": { + "properties": { + "cache_threshold": { + "enum": [ + "super_strict_match", + "close_enough", + "flexible_friend", + "anything_goes" + ], + "type": "string" + }, + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "custom_metadata": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "description": "Metadata added to AI Gateway logs for requests this operation triggers. Accepts up to 2 string, number, or boolean entries. Reserved keys: 'ai-search', 'task', 'origin', and any key beginning with 'cf.'.", + "type": "object" + }, + "instance_ids": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "query_rewrite": { + "properties": { + "enabled": { + "type": "boolean" + }, + "model": { + "description": "A Workers AI model ID or an AI Gateway model ID compatible with the OpenAI Chat Completions API. An empty string uses the configured or default model.", + "type": "string" + }, + "rewrite_prompt": { + "type": "string" + } + }, + "type": "object" + }, + "reranking": { + "properties": { + "enabled": { + "type": "boolean" + }, + "match_threshold": { + "default": 0.4, + "type": "number" + }, + "model": { + "type": "string" + } + }, + "type": "object" + }, + "retrieval": { + "properties": { + "boost_by": { + "description": "Metadata fields to boost search results by. Overrides the instance-level boost_by config. Direction defaults to 'asc' for numeric/datetime fields, 'exists' for text/boolean fields. Fields must match 'timestamp' or a defined custom_metadata field.", + "items": { + "properties": { + "direction": { + "description": "Boost direction. 'desc' = higher values rank higher (e.g. newer timestamps). 'asc' = lower values rank higher. 'exists' = boost chunks that have the field. 'not_exists' = boost chunks that lack the field. Optional — defaults to 'asc' for numeric/datetime fields, 'exists' for text/boolean fields.", + "enum": [ + "asc", + "desc", + "exists", + "not_exists" + ], + "type": "string" + }, + "field": { + "description": "Metadata field name to boost by. Use 'timestamp' for document freshness, or any custom_metadata field. Numeric and datetime fields support all four directions (asc, desc, exists, not_exists); text/boolean fields only support exists/not_exists.", + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "context_expansion": { + "default": 0, + "type": "integer" + }, + "filters": { + "type": "object" + }, + "fusion_method": { + "enum": [ + "max", + "rrf" + ], + "type": "string" + }, + "keyword_match_mode": { + "description": "Controls which documents become candidates for BM25 scoring. 'and' restricts candidates to documents containing all query terms; 'or' includes any document containing at least one term and ranks results according to BM25 relevance. When omitted, falls back to the instance-level retrieval_options.keyword_match_mode, then to 'and'.", + "enum": [ + "and", + "or" + ], + "type": "string" + }, + "match_threshold": { + "description": "Minimum score a chunk must reach to be returned. When omitted, each instance's chunks are filtered by that instance's score_threshold, capped at the lower of the first instance's score_threshold and 0.4.", + "type": "number" + }, + "max_num_results": { + "description": "Maximum number of merged results to return. When omitted, defaults to the first instance's max_num_results, then 10.", + "type": "integer" + }, + "retrieval_type": { + "enum": [ + "vector", + "keyword", + "hybrid" + ], + "type": "string" + }, + "return_on_failure": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": [ + "instance_ids" + ], + "type": "object" + }, + "messages": { + "items": { + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "oneOf": [ + { + "properties": { + "text": { + "type": "string" + }, + "type": { + "enum": [ + "text" + ], + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + }, + { + "properties": { + "image_url": { + "properties": { + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": { + "enum": [ + "image_url" + ], + "type": "string" + } + }, + "required": [ + "image_url", + "type" + ], + "type": "object" + }, + { + "properties": { + "file": { + "properties": { + "file_data": { + "type": "string" + }, + "file_id": { + "type": "string" + }, + "filename": { + "type": "string" + } + }, + "required": [ + "filename" + ], + "type": "object" + }, + "type": { + "enum": [ + "file" + ], + "type": "string" + } + }, + "required": [ + "file", + "type" + ], + "type": "object" + } + ] + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "role": { + "enum": [ + "system", + "developer", + "user", + "assistant", + "tool" + ], + "type": "string" + } + }, + "required": [ + "content", + "role" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "model": { + "description": "A Workers AI model ID or an AI Gateway model ID compatible with the OpenAI Chat Completions API. An empty string uses the configured or default model.", + "type": "string" + }, + "stream": { + "type": "boolean" + } + }, + "required": [ + "ai_search_options", + "messages" + ], + "type": "object" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Multi-Instance Chat Completions" + }, + method: "POST", + path: "/accounts/{account_id}/ai-search/namespaces/{name}/chat/completions", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "name": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/chat/completions`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_multi_search", + title: "Multi-Instance Search", + description: "Performs a semantic search query against multiple AI Search instances in parallel, merging the retrieved results into a single ranked response.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "ai_search_options": { + "properties": { + "cache": { + "properties": { + "cache_threshold": { + "enum": [ + "super_strict_match", + "close_enough", + "flexible_friend", + "anything_goes" + ], + "type": "string" + }, + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "custom_metadata": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "description": "Metadata added to AI Gateway logs for requests this operation triggers. Accepts up to 2 string, number, or boolean entries. Reserved keys: 'ai-search', 'task', 'origin', and any key beginning with 'cf.'.", + "type": "object" + }, + "instance_ids": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "query_rewrite": { + "properties": { + "enabled": { + "type": "boolean" + }, + "model": { + "description": "A Workers AI model ID or an AI Gateway model ID compatible with the OpenAI Chat Completions API. An empty string uses the configured or default model.", + "type": "string" + }, + "rewrite_prompt": { + "type": "string" + } + }, + "type": "object" + }, + "reranking": { + "properties": { + "enabled": { + "type": "boolean" + }, + "match_threshold": { + "default": 0.4, + "type": "number" + }, + "model": { + "type": "string" + } + }, + "type": "object" + }, + "retrieval": { + "properties": { + "boost_by": { + "description": "Metadata fields to boost search results by. Overrides the instance-level boost_by config. Direction defaults to 'asc' for numeric/datetime fields, 'exists' for text/boolean fields. Fields must match 'timestamp' or a defined custom_metadata field.", + "items": { + "properties": { + "direction": { + "description": "Boost direction. 'desc' = higher values rank higher (e.g. newer timestamps). 'asc' = lower values rank higher. 'exists' = boost chunks that have the field. 'not_exists' = boost chunks that lack the field. Optional — defaults to 'asc' for numeric/datetime fields, 'exists' for text/boolean fields.", + "enum": [ + "asc", + "desc", + "exists", + "not_exists" + ], + "type": "string" + }, + "field": { + "description": "Metadata field name to boost by. Use 'timestamp' for document freshness, or any custom_metadata field. Numeric and datetime fields support all four directions (asc, desc, exists, not_exists); text/boolean fields only support exists/not_exists.", + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "context_expansion": { + "default": 0, + "type": "integer" + }, + "filters": { + "type": "object" + }, + "fusion_method": { + "enum": [ + "max", + "rrf" + ], + "type": "string" + }, + "keyword_match_mode": { + "description": "Controls which documents become candidates for BM25 scoring. 'and' restricts candidates to documents containing all query terms; 'or' includes any document containing at least one term and ranks results according to BM25 relevance. When omitted, falls back to the instance-level retrieval_options.keyword_match_mode, then to 'and'.", + "enum": [ + "and", + "or" + ], + "type": "string" + }, + "match_threshold": { + "description": "Minimum score a chunk must reach to be returned. When omitted, each instance's chunks are filtered by that instance's score_threshold, capped at 0.4.", + "type": "number" + }, + "max_num_results": { + "description": "Maximum number of merged results to return. When omitted, defaults to the sum of the searched instances' max_num_results (each falling back to 10), up to 50.", + "type": "integer" + }, + "retrieval_type": { + "enum": [ + "vector", + "keyword", + "hybrid" + ], + "type": "string" + }, + "return_on_failure": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + } + }, + "required": [ + "instance_ids" + ], + "type": "object" + }, + "messages": { + "description": "OpenAI-compatible message array. For multimodal queries, set the last user message's `content` to an array of typed parts: `[{type:'text', text:'…'}, {type:'image_url', image_url:{url:'…'}}]`. Image inputs require the RAG's embedding_model to declare 'image' in supported_modalities.", + "items": { + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "oneOf": [ + { + "properties": { + "text": { + "type": "string" + }, + "type": { + "enum": [ + "text" + ], + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + }, + { + "properties": { + "image_url": { + "properties": { + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": { + "enum": [ + "image_url" + ], + "type": "string" + } + }, + "required": [ + "image_url", + "type" + ], + "type": "object" + }, + { + "properties": { + "file": { + "properties": { + "file_data": { + "type": "string" + }, + "file_id": { + "type": "string" + }, + "filename": { + "type": "string" + } + }, + "required": [ + "filename" + ], + "type": "object" + }, + "type": { + "enum": [ + "file" + ], + "type": "string" + } + }, + "required": [ + "file", + "type" + ], + "type": "object" + } + ] + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "role": { + "enum": [ + "system", + "developer", + "user", + "assistant", + "tool" + ], + "type": "string" + } + }, + "required": [ + "content", + "role" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "query": { + "description": "A simple text query string. Alternative to 'messages' — provide either this or 'messages', not both.", + "type": "string" + } + }, + "required": [ + "ai_search_options" + ], + "type": "object" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Multi-Instance Search" + }, + method: "POST", + path: "/accounts/{account_id}/ai-search/namespaces/{name}/search", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "name": { + "description": "Namespace to use for this operation." + }, + "query": { + "description": "Text to search for.", + "positional": true + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/search`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_purge_cache", + title: "Purge search cache.", + description: "Purges all cached search results for an AI Search instance. A new internal cache key is generated, immediately orphaning all prior cached entries.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Purge search cache." + }, + method: "POST", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/purge_cache", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/purge_cache`, + }), + }, + { + name: "ai_search_search", + title: "Search", + description: "Executes a semantic search query against an AI Search instance to find relevant indexed content.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "ai_search_options": { + "properties": { + "cache": { + "properties": { + "cache_threshold": { + "enum": [ + "super_strict_match", + "close_enough", + "flexible_friend", + "anything_goes" + ], + "type": "string" + }, + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "custom_metadata": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "description": "Metadata added to AI Gateway logs for requests this operation triggers. Accepts up to 2 string, number, or boolean entries. Reserved keys: 'ai-search', 'task', 'origin', and any key beginning with 'cf.'.", + "type": "object" + }, + "query_rewrite": { + "properties": { + "enabled": { + "type": "boolean" + }, + "model": { + "description": "A Workers AI model ID or an AI Gateway model ID compatible with the OpenAI Chat Completions API. An empty string uses the configured or default model.", + "type": "string" + }, + "rewrite_prompt": { + "type": "string" + } + }, + "type": "object" + }, + "reranking": { + "properties": { + "enabled": { + "type": "boolean" + }, + "match_threshold": { + "default": 0.4, + "type": "number" + }, + "model": { + "type": "string" + } + }, + "type": "object" + }, + "retrieval": { + "properties": { + "boost_by": { + "description": "Metadata fields to boost search results by. Overrides the instance-level boost_by config. Direction defaults to 'asc' for numeric/datetime fields, 'exists' for text/boolean fields. Fields must match 'timestamp' or a defined custom_metadata field.", + "items": { + "properties": { + "direction": { + "description": "Boost direction. 'desc' = higher values rank higher (e.g. newer timestamps). 'asc' = lower values rank higher. 'exists' = boost chunks that have the field. 'not_exists' = boost chunks that lack the field. Optional — defaults to 'asc' for numeric/datetime fields, 'exists' for text/boolean fields.", + "enum": [ + "asc", + "desc", + "exists", + "not_exists" + ], + "type": "string" + }, + "field": { + "description": "Metadata field name to boost by. Use 'timestamp' for document freshness, or any custom_metadata field. Numeric and datetime fields support all four directions (asc, desc, exists, not_exists); text/boolean fields only support exists/not_exists.", + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "context_expansion": { + "default": 0, + "type": "integer" + }, + "filters": { + "type": "object" + }, + "fusion_method": { + "enum": [ + "max", + "rrf" + ], + "type": "string" + }, + "keyword_match_mode": { + "description": "Controls which documents become candidates for BM25 scoring. 'and' restricts candidates to documents containing all query terms; 'or' includes any document containing at least one term and ranks results according to BM25 relevance. When omitted, falls back to the instance-level retrieval_options.keyword_match_mode, then to 'and'.", + "enum": [ + "and", + "or" + ], + "type": "string" + }, + "match_threshold": { + "description": "Minimum similarity score a chunk must reach to be returned. When omitted, falls back to the instance-level score_threshold, then to 0.4.", + "type": "number" + }, + "max_num_results": { + "description": "Maximum number of results to return. When omitted, falls back to the instance-level max_num_results, then to 10.", + "type": "integer" + }, + "retrieval_type": { + "enum": [ + "vector", + "keyword", + "hybrid" + ], + "type": "string" + }, + "return_on_failure": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "messages": { + "description": "OpenAI-compatible message array. For multimodal queries, set the last user message's `content` to an array of typed parts: `[{type:'text', text:'…'}, {type:'image_url', image_url:{url:'…'}}]`. Image inputs require the RAG's embedding_model to declare 'image' in supported_modalities.", + "items": { + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "oneOf": [ + { + "properties": { + "text": { + "type": "string" + }, + "type": { + "enum": [ + "text" + ], + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + }, + { + "properties": { + "image_url": { + "properties": { + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "type": { + "enum": [ + "image_url" + ], + "type": "string" + } + }, + "required": [ + "image_url", + "type" + ], + "type": "object" + }, + { + "properties": { + "file": { + "properties": { + "file_data": { + "type": "string" + }, + "file_id": { + "type": "string" + }, + "filename": { + "type": "string" + } + }, + "required": [ + "filename" + ], + "type": "object" + }, + "type": { + "enum": [ + "file" + ], + "type": "string" + } + }, + "required": [ + "file", + "type" + ], + "type": "object" + } + ] + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "role": { + "enum": [ + "system", + "developer", + "user", + "assistant", + "tool" + ], + "type": "string" + } + }, + "required": [ + "content", + "role" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "query": { + "description": "A simple text query string. Alternative to 'messages' — provide either this or 'messages', not both.", + "type": "string" + } + }, + "type": "object" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Search" + }, + method: "POST", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/search", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + }, + "query": { + "description": "Text to search for.", + "positional": true + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/search`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "ai_search_stats", + title: "Get instance statistics.", + description: "Retrieve usage and indexing statistics for an AI Search instance.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "instance_id": { + "description": "AI Search instance ID. Lowercase alphanumeric, hyphens, and underscores.", + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get instance statistics." + }, + method: "GET", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}/stats", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}/stats`, + }), + }, + { + name: "ai_search_update", + title: "Update an AI Search instance.", + description: "Updates the configuration of an AI Search instance.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "ai_gateway_id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "ai_search_model": { + "description": "A Workers AI model ID or an AI Gateway model ID compatible with the OpenAI Chat Completions API. An empty string uses the configured or default model.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "cache": { + "default": true, + "type": "boolean" + }, + "cache_threshold": { + "default": "close_enough", + "enum": [ + "super_strict_match", + "close_enough", + "flexible_friend", + "anything_goes" + ], + "type": "string" + }, + "cache_ttl": { + "default": 172800, + "description": "Cache entry TTL in seconds. Allowed values: 600 (10min), 1800 (30min), 3600 (1h), 7200 (2h), 21600 (6h), 43200 (12h), 86400 (24h), 172800 (48h), 259200 (72h), 518400 (6d).", + "enum": [ + 600, + 1800, + 3600, + 7200, + 21600, + 43200, + 86400, + 172800, + 259200, + 518400 + ], + "type": "integer" + }, + "chunk": { + "default": true, + "type": "boolean" + }, + "chunk_overlap": { + "default": 10, + "type": "integer" + }, + "chunk_size": { + "type": "integer" + }, + "custom_metadata": { + "items": { + "properties": { + "data_type": { + "enum": [ + "text", + "number", + "boolean", + "datetime" + ], + "type": "string" + }, + "field_name": { + "type": "string" + } + }, + "required": [ + "data_type", + "field_name" + ], + "type": "object" + }, + "maxItems": 5, + "type": "array" + }, + "embedding_model": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "fusion_method": { + "default": "rrf", + "enum": [ + "max", + "rrf" + ], + "type": "string" + }, + "index_method": { + "description": "Controls which storage backends indexing uses. Defaults to vector and keyword indexing for new instances. When set, both vector and keyword are required.", + "properties": { + "keyword": { + "description": "Enable keyword (BM25) storage backend.", + "type": "boolean" + }, + "vector": { + "description": "Enable vector (embedding) storage backend.", + "type": "boolean" + } + }, + "required": [ + "keyword", + "vector" + ], + "type": "object" + }, + "indexing_options": { + "oneOf": [ + { + "properties": { + "keyword_tokenizer": { + "default": "porter", + "description": "Tokenizer used for keyword search indexing. porter provides word-level tokenization with Porter stemming (good for natural language queries). trigram enables character-level substring matching (good for partial matches, code, identifiers). Changing this triggers a full re-index. Defaults to porter.", + "enum": [ + "porter", + "trigram" + ], + "type": "string" + }, + "use_ocr": { + "default": false, + "description": "Enables OCR ingestion for PDFs and images. Changing this triggers a full re-index. Defaults to false.", + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "max_num_results": { + "default": 10, + "type": "integer" + }, + "metadata": { + "properties": { + "created_from_aisearch_wizard": { + "type": "boolean" + }, + "created_from_emdash_plugin": { + "properties": { + "type": { + "enum": [ + "native", + "rest" + ], + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "type", + "version" + ], + "type": "object" + }, + "worker_domain": { + "type": "string" + } + }, + "type": "object" + }, + "paused": { + "type": "boolean" + }, + "public_endpoint_params": { + "properties": { + "authorized_hosts": { + "items": { + "type": "string" + }, + "type": "array" + }, + "chat_completions_endpoint": { + "properties": { + "disabled": { + "default": false, + "description": "Disable chat completions endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + }, + "custom_domains": { + "description": "Custom domain hostnames that alias this public endpoint. GET and create responses return the current set; on update (PUT) this field is only echoed back when supplied in the request body, otherwise it is null (omit it to leave domains unchanged).", + "oneOf": [ + { + "items": { + "type": "string" + }, + "maxItems": 1, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "default_domain_enabled": { + "default": true, + "description": "When false, the instance is reachable only via a registered custom domain and the default .search.ai.cloudflare.com host returns 404. Requires at least one custom domain. Defaults to true. public_endpoint_params is replaced wholesale on update, so resend default_domain_enabled on every update to keep the default host off — omitting it resets to true.", + "type": "boolean" + }, + "enabled": { + "default": false, + "type": "boolean" + }, + "mcp": { + "properties": { + "description": { + "default": "Finds exactly what you're looking for", + "type": "string" + }, + "disabled": { + "default": false, + "description": "Disable MCP endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + }, + "rate_limit": { + "properties": { + "period_ms": { + "type": "integer" + }, + "requests": { + "type": "integer" + }, + "technique": { + "enum": [ + "fixed", + "sliding" + ], + "type": "string" + } + }, + "type": "object" + }, + "search_endpoint": { + "properties": { + "disabled": { + "default": false, + "description": "Disable search endpoint for this public endpoint.", + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "reranking": { + "default": false, + "type": "boolean" + }, + "reranking_model": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "retrieval_options": { + "oneOf": [ + { + "properties": { + "boost_by": { + "description": "Metadata fields to boost search results by. Each entry specifies a metadata field and an optional direction. Direction defaults to 'asc' for numeric/datetime fields and 'exists' for text/boolean fields. Fields must match 'timestamp' or a defined custom_metadata field.", + "items": { + "properties": { + "direction": { + "description": "Boost direction. 'desc' = higher values rank higher (e.g. newer timestamps). 'asc' = lower values rank higher. 'exists' = boost chunks that have the field. 'not_exists' = boost chunks that lack the field. Optional — defaults to 'asc' for numeric/datetime fields, 'exists' for text/boolean fields.", + "enum": [ + "asc", + "desc", + "exists", + "not_exists" + ], + "type": "string" + }, + "field": { + "description": "Metadata field name to boost by. Use 'timestamp' for document freshness, or any custom_metadata field. Numeric and datetime fields support all four directions (asc, desc, exists, not_exists); text/boolean fields only support exists/not_exists.", + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "keyword_match_mode": { + "description": "Controls which documents become candidates for BM25 scoring. 'and' restricts candidates to documents containing all query terms; 'or' includes any document containing at least one term and ranks results according to BM25 relevance. When omitted on an update, the existing stored value stays unchanged; when never set, search falls back to 'and'.", + "enum": [ + "and", + "or" + ], + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "rewrite_model": { + "description": "A Workers AI model ID or an AI Gateway model ID compatible with the OpenAI Chat Completions API. An empty string uses the configured or default model.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "rewrite_query": { + "default": false, + "type": "boolean" + }, + "score_threshold": { + "description": "Minimum similarity score a chunk must reach to be returned. Defaults to 0.4.", + "type": "number" + }, + "source": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "source_params": { + "oneOf": [ + { + "properties": { + "exclude_items": { + "description": "List of path patterns to exclude. Uses micromatch glob syntax: * matches within a path segment, ** matches across path segments (e.g., /admin/** matches /admin/users and /admin/settings/advanced). Most accounts have a limit of 10 rules; contact support to raise it.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "include_items": { + "description": "List of path patterns to include. Uses micromatch glob syntax: * matches within a path segment, ** matches across path segments (e.g., /blog/** matches /blog/post and /blog/2024/post). Most accounts have a limit of 10 rules; contact support to raise it.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "prefix": { + "type": "string" + }, + "r2_jurisdiction": { + "type": "string" + }, + "web_crawler": { + "default": { + "parse_type": "sitemap" + }, + "properties": { + "discover_options": { + "description": "Options for parse_type 'discover', where Browser Run discovers URLs through link following and sitemaps. Ignored for 'sitemap'.", + "properties": { + "depth": { + "default": 5, + "description": "Maximum link-follow depth from the seed URL.", + "type": "number" + }, + "include_external_links": { + "default": false, + "description": "Follow links that point outside the source domain. Must stay `false` because discover crawls only cover the zone you own.", + "type": "boolean" + }, + "include_subdomains": { + "default": false, + "description": "Follow links to subdomains of the source host.", + "type": "boolean" + }, + "limit": { + "default": 100000, + "description": "Maximum number of pages to crawl (1-100000).", + "type": "number" + }, + "max_age": { + "default": 86400, + "description": "Maximum content age in seconds to accept (0–604800).", + "type": "number" + }, + "source": { + "default": "all", + "description": "Where the crawler looks for URLs: 'sitemaps' reads sitemap XML only, 'links' follows page links only, 'all' does both.", + "enum": [ + "all", + "sitemaps", + "links" + ], + "type": "string" + } + }, + "type": "object" + }, + "parse_options": { + "properties": { + "content_selector": { + "description": "List of path-to-selector mappings for extracting specific content from crawled pages. Each entry pairs a URL glob pattern with a CSS selector. The first matching path wins. The crawler stores and indexes only the matched HTML fragment. Omit the field to disable content selection; the API rejects empty arrays.", + "items": { + "properties": { + "path": { + "description": "Glob pattern to match against the page URL path. Uses standard glob syntax: * matches within a segment, ** crosses directories.", + "type": "string" + }, + "selector": { + "description": "CSS selector to extract content from pages matching the path pattern. Disallowed characters: ;, `, $, {, }, \\. Must target a single element; if multiple elements match, the crawler ignores the selector and uses the full page.", + "type": "string" + } + }, + "required": [ + "path", + "selector" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + }, + "include_headers": { + "additionalProperties": { + "type": "string" + }, + "description": "Up to 5 custom HTTP headers sent with each crawl request. Names must use RFC-7230 token characters, excluding spaces, colons, and control characters. Values must use HTAB and printable ASCII only, excluding CR and LF.", + "type": "object" + }, + "include_images": { + "default": false, + "type": "boolean" + }, + "specific_sitemaps": { + "description": "List of specific sitemap URLs to use for crawling. Only valid when parse_type is 'sitemap'.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "use_browser_rendering": { + "default": true, + "type": "boolean" + } + }, + "type": "object" + }, + "parse_type": { + "default": "sitemap", + "description": "How the crawler finds URLs. 'sitemap' reads XML sitemaps; 'discover' follows links recursively and requires the source to belong to a Verified zone on this account.", + "enum": [ + "sitemap", + "discover" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "summarization": { + "default": false, + "type": "boolean" + }, + "summarization_model": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sync_interval": { + "description": "Interval between automatic syncs, in seconds. Allowed values: 900 (15min), 1800 (30min), 3600 (1h), 7200 (2h), 14400 (4h), 21600 (6h), 43200 (12h), 86400 (24h). Defaults to 21600 (6h); instances crawling a domain outside the account may be set to 86400.", + "enum": [ + 900, + 1800, + 3600, + 7200, + 14400, + 21600, + 43200, + 86400 + ], + "type": "integer" + }, + "system_prompt_ai_search": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "system_prompt_index_summarization": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "system_prompt_rewrite_query": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "token_id": { + "format": "uuid", + "type": "string" + } + }, + "type": "object" + }, + "instance_id": { + "type": "string" + }, + "namespace": { + "description": "Namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "instance_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update an AI Search instance." + }, + method: "PUT", + path: "/accounts/{account_id}/ai-search/namespaces/{namespace}/instances/{id}", + extensions: { + "x-cfPermissionsRequired": { + "enum": [ + "com.cloudflare.api.account.ai-search" + ], + "x-fern-enum": { + "com.cloudflare.api.account.ai-search": { + "name": "com_cloudflare_api_account_ai_search" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + }, + "x-forge-params": { + "id": { + "description": "AI Search instance ID." + }, + "namespace": { + "description": "Namespace to use for this operation." + }, + "source": { + "description": "R2 bucket name or HTTP(S) root website URL to index." + }, + "source_params": { + "description": "Optional data source settings as a JSON object." + } + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/ai-search/namespaces/${pathParam(args, "namespace")}/instances/${pathParam(args, "instance_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiSecurity/customTopics/schemas.ts b/src/generated/forge-mcp/aiSecurity/customTopics/schemas.ts new file mode 100644 index 00000000..b2693bcd --- /dev/null +++ b/src/generated/forge-mcp/aiSecurity/customTopics/schemas.ts @@ -0,0 +1,42 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `waf-product-api-bundle_custom-topic`. + */ +export const waf_product_api_bundle_custom_topic: JsonSchema = { + "properties": { + "label": { + "description": "Unique label identifier. Must contain only lowercase letters (a–z), digits (0–9), and hyphens.", + "type": "string" + }, + "topic": { + "description": "Description of the topic category. Must contain only printable ASCII characters.", + "type": "string" + } + }, + "required": [ + "label", + "topic" + ], + "type": "object" +}; + +/** + * The schema of `waf-product-api-bundle_custom-topics`. + */ +export const waf_product_api_bundle_custom_topics: JsonSchema = { + "properties": { + "topics": { + "description": "Custom topic categories for AI Security for Apps content detection.", + "items": { + "$ref": "#/$defs/waf-product-api-bundle_custom-topic" + }, + "maxItems": 20, + "type": "array" + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/aiSecurity/customTopics/tools.ts b/src/generated/forge-mcp/aiSecurity/customTopics/tools.ts new file mode 100644 index 00000000..f46b3a78 --- /dev/null +++ b/src/generated/forge-mcp/aiSecurity/customTopics/tools.ts @@ -0,0 +1,81 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + waf_product_api_bundle_custom_topic, + waf_product_api_bundle_custom_topics, +} from "./schemas.js"; + +/** + * The tools of `ai_security.custom_topics`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_security_custom_topics_get", + title: "Get the AI Security for Apps custom topics of a zone.", + description: "Get the custom topic categories defined for the zone. While AI Security for Apps is enabled, it scores every incoming prompt against these topics and writes the scores to the `cf.llm.prompt.custom_topic_categories` field, keyed by topic label. Topics can be configured while the detection is disabled, but no prompt is scored until you enable it.", + inputSchema: { + type: "object", + properties: { + "zone_id": { + "description": "Defines the zone.", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get the AI Security for Apps custom topics of a zone." + }, + method: "GET", + path: "/zones/{zone_id}/ai-security/custom-topics", + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/ai-security/custom-topics`, + }), + }, + { + name: "ai_security_custom_topics_update", + title: "Update the AI Security for Apps custom topics of a zone.", + description: "Update the custom topic list of the zone, overwriting it entirely with the topics in the request, so include\nevery topic you want to keep. Changes can take up to a minute to propagate.\n\nEach entry has a `label`, used to reference the topic in rule expressions and analytics, and a `topic`\ndescription, which the classifier scores prompts against while AI Security for Apps is enabled. The following\nrules apply:\n\n- A zone can hold at most 20 topics.\n- `label` must be 2–20 characters, using only lowercase letters (a–z), digits (0–9), and hyphens.\n- `topic` must be 2–50 printable ASCII characters.\n- Labels must be unique within the zone, and so must topic descriptions.\n\nConfirm with the user before calling this tool. This operation overwrites the AI Security for Apps custom topics for a zone.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/waf-product-api-bundle_custom-topics" + }, + "zone_id": { + "description": "Defines the zone.", + "type": "string" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "waf-product-api-bundle_custom-topic": waf_product_api_bundle_custom_topic, + "waf-product-api-bundle_custom-topics": waf_product_api_bundle_custom_topics, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update the AI Security for Apps custom topics of a zone." + }, + method: "PUT", + path: "/zones/{zone_id}/ai-security/custom-topics", + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/ai-security/custom-topics`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/aiSecurity/schemas.ts b/src/generated/forge-mcp/aiSecurity/schemas.ts new file mode 100644 index 00000000..ad2480f0 --- /dev/null +++ b/src/generated/forge-mcp/aiSecurity/schemas.ts @@ -0,0 +1,18 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../_/index.js"; + +/** + * The schema of `waf-product-api-bundle_settings`. + */ +export const waf_product_api_bundle_settings: JsonSchema = { + "description": "AI Security for Apps enablement status for a zone.", + "properties": { + "enabled": { + "description": "Whether AI Security for Apps is enabled on the zone.", + "type": "boolean" + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/aiSecurity/tools.ts b/src/generated/forge-mcp/aiSecurity/tools.ts new file mode 100644 index 00000000..4391f561 --- /dev/null +++ b/src/generated/forge-mcp/aiSecurity/tools.ts @@ -0,0 +1,77 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; +import { waf_product_api_bundle_settings } from "./schemas.js"; + +/** + * The tools of `ai_security`. + */ +export const tools: readonly Tool[] = [ + { + name: "ai_security_get", + title: "Get the AI Security for Apps status for a zone.", + description: "Get the current AI Security for Apps status for the zone. While enabled, Cloudflare scans prompts sent to endpoints labeled `cf-llm` for personally identifiable information, unsafe topics, and prompt injection attempts.", + inputSchema: { + type: "object", + properties: { + "zone_id": { + "description": "Defines the zone.", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get the AI Security for Apps status for a zone." + }, + method: "GET", + path: "/zones/{zone_id}/ai-security/settings", + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/ai-security/settings`, + }), + }, + { + name: "ai_security_update", + title: "Update the AI Security for Apps status for a zone.", + description: "Update the AI Security for Apps status for the zone, enabling or disabling the detection. The detection results are exposed as `cf.llm.prompt.*` fields for use in custom rules and rate limiting rules; changes can take up to a minute to propagate.\n\nConfirm with the user before calling this tool. This operation toggles AI Security for Apps for a zone.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/waf-product-api-bundle_settings" + }, + "zone_id": { + "description": "Defines the zone.", + "type": "string" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "waf-product-api-bundle_settings": waf_product_api_bundle_settings, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update the AI Security for Apps status for a zone." + }, + method: "PUT", + path: "/zones/{zone_id}/ai-security/settings", + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/ai-security/settings`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/alerting/availableAlerts/tools.ts b/src/generated/forge-mcp/alerting/availableAlerts/tools.ts new file mode 100644 index 00000000..c3769c0b --- /dev/null +++ b/src/generated/forge-mcp/alerting/availableAlerts/tools.ts @@ -0,0 +1,48 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `alerting.available_alerts`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerting_available_alerts_list", + title: "Get Alert Types", + description: "Gets a list of all alert types for which an account is eligible.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Alert Types" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/available_alerts", + extensions: { + "x-api-token-group": [ + "Zero Trust: PII Read", + "Notifications Write", + "Notifications Read", + "Account Settings Write", + "Account Settings Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/available_alerts`, + }), + }, +]; diff --git a/src/generated/forge-mcp/alerting/destinations/eligible/tools.ts b/src/generated/forge-mcp/alerting/destinations/eligible/tools.ts new file mode 100644 index 00000000..ba66f80b --- /dev/null +++ b/src/generated/forge-mcp/alerting/destinations/eligible/tools.ts @@ -0,0 +1,39 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `alerting.destinations.eligible`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerting_destinations_eligible_get", + title: "Get delivery mechanism eligibility", + description: "Get a list of all delivery mechanism types for which an account is eligible.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get delivery mechanism eligibility" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/destinations/eligible", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/destinations/eligible`, + }), + }, +]; diff --git a/src/generated/forge-mcp/alerting/destinations/pagerduty/tools.ts b/src/generated/forge-mcp/alerting/destinations/pagerduty/tools.ts new file mode 100644 index 00000000..e8fe76bf --- /dev/null +++ b/src/generated/forge-mcp/alerting/destinations/pagerduty/tools.ts @@ -0,0 +1,164 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `alerting.destinations.pagerduty`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerting_destinations_pagerduty_create", + title: "Create PagerDuty integration token", + description: "Creates a new token for integrating with PagerDuty.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create PagerDuty integration token" + }, + method: "POST", + path: "/accounts/{account_id}/alerting/v3/destinations/pagerduty/connect", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/destinations/pagerduty/connect`, + }), + }, + { + name: "alerting_destinations_pagerduty_delete", + title: "Delete PagerDuty Services", + description: "Deletes all the PagerDuty Services connected to the account.\n\nConfirm with the user before calling this tool. This operation deletes all PagerDuty services connected to the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete PagerDuty Services" + }, + method: "DELETE", + path: "/accounts/{account_id}/alerting/v3/destinations/pagerduty", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/destinations/pagerduty`, + }), + }, + { + name: "alerting_destinations_pagerduty_get", + title: "List PagerDuty services", + description: "Get a list of all configured PagerDuty services.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List PagerDuty services" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/destinations/pagerduty", + extensions: { + "x-api-token-group": [ + "Zero Trust: PII Read", + "Notifications Write", + "Notifications Read", + "Account Settings Write", + "Account Settings Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": false, + "pro": false + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/destinations/pagerduty`, + }), + }, + { + name: "alerting_destinations_pagerduty_link", + title: "Connect PagerDuty", + description: "Links PagerDuty with the account using the integration token.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "token_id": { + "description": "The token integration key", + "type": "string" + } + }, + required: [ + "account_id", + "token_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Connect PagerDuty" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/destinations/pagerduty/connect/{token_id}", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/destinations/pagerduty/connect/${pathParam(args, "token_id")}`, + }), + }, +]; diff --git a/src/generated/forge-mcp/alerting/destinations/webhooks/schemas.ts b/src/generated/forge-mcp/alerting/destinations/webhooks/schemas.ts new file mode 100644 index 00000000..53ed0396 --- /dev/null +++ b/src/generated/forge-mcp/alerting/destinations/webhooks/schemas.ts @@ -0,0 +1,28 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `aaa_components-schemas-name`. + */ +export const aaa_components_schemas_name: JsonSchema = { + "description": "The name of the webhook destination. This will be included in the request body when you receive a webhook notification.", + "type": "string" +}; + +/** + * The schema of `aaa_secret`. + */ +export const aaa_secret: JsonSchema = { + "description": "Optional secret that will be passed in the `cf-webhook-auth` header when dispatching generic webhook notifications or formatted for supported destinations. Secrets are not returned in any API response body.", + "type": "string" +}; + +/** + * The schema of `aaa_url`. + */ +export const aaa_url: JsonSchema = { + "description": "The POST endpoint to call when dispatching a notification.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/alerting/destinations/webhooks/tools.ts b/src/generated/forge-mcp/alerting/destinations/webhooks/tools.ts new file mode 100644 index 00000000..7c6d8200 --- /dev/null +++ b/src/generated/forge-mcp/alerting/destinations/webhooks/tools.ts @@ -0,0 +1,293 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { aaa_components_schemas_name, aaa_secret, aaa_url } from "./schemas.js"; + +/** + * The tools of `alerting.destinations.webhooks`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerting_destinations_webhooks_create", + title: "Create a webhook", + description: "Creates a new webhook destination.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "body": { + "properties": { + "name": { + "$ref": "#/$defs/aaa_components-schemas-name", + "description": "The name of the webhook destination. This will be included in the request body when you receive a webhook notification." + }, + "secret": { + "$ref": "#/$defs/aaa_secret", + "description": "Optional secret that will be passed in the `cf-webhook-auth` header when dispatching generic webhook notifications or formatted for supported destinations. Secrets are not returned in any API response body." + }, + "url": { + "$ref": "#/$defs/aaa_url", + "description": "The POST endpoint to call when dispatching a notification." + } + }, + "required": [ + "name", + "url" + ], + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "aaa_components-schemas-name": aaa_components_schemas_name, + "aaa_secret": aaa_secret, + "aaa_url": aaa_url, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a webhook" + }, + method: "POST", + path: "/accounts/{account_id}/alerting/v3/destinations/webhooks", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": false, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/destinations/webhooks`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "alerting_destinations_webhooks_delete", + title: "Delete a webhook", + description: "Delete a configured webhook destination.\n\nConfirm with the user before calling this tool. This operation deletes the webhook destination.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "webhook_id": { + "description": "The unique identifier of a webhook", + "type": "string" + } + }, + required: [ + "account_id", + "webhook_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a webhook" + }, + method: "DELETE", + path: "/accounts/{account_id}/alerting/v3/destinations/webhooks/{webhook_id}", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": false, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/destinations/webhooks/${pathParam(args, "webhook_id")}`, + }), + }, + { + name: "alerting_destinations_webhooks_get", + title: "Get a webhook", + description: "Get details for a single webhooks destination.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "webhook_id": { + "description": "The unique identifier of a webhook", + "type": "string" + } + }, + required: [ + "account_id", + "webhook_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a webhook" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/destinations/webhooks/{webhook_id}", + extensions: { + "x-api-token-group": [ + "Zero Trust: PII Read", + "Notifications Write", + "Notifications Read", + "Account Settings Write", + "Account Settings Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": false, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/destinations/webhooks/${pathParam(args, "webhook_id")}`, + }), + }, + { + name: "alerting_destinations_webhooks_list", + title: "List webhooks", + description: "Gets a list of all configured webhook destinations.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List webhooks" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/destinations/webhooks", + extensions: { + "x-api-token-group": [ + "Zero Trust: PII Read", + "Notifications Write", + "Notifications Read", + "Account Settings Write", + "Account Settings Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": false, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/destinations/webhooks`, + }), + }, + { + name: "alerting_destinations_webhooks_update", + title: "Update a webhook", + description: "Update a webhook destination.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "body": { + "properties": { + "name": { + "$ref": "#/$defs/aaa_components-schemas-name", + "description": "The name of the webhook destination. This will be included in the request body when you receive a webhook notification." + }, + "secret": { + "$ref": "#/$defs/aaa_secret", + "description": "Optional secret that will be passed in the `cf-webhook-auth` header when dispatching generic webhook notifications or formatted for supported destinations. Secrets are not returned in any API response body." + }, + "url": { + "$ref": "#/$defs/aaa_url", + "description": "The POST endpoint to call when dispatching a notification." + } + }, + "required": [ + "name", + "url" + ], + "type": "object" + }, + "webhook_id": { + "description": "The unique identifier of a webhook", + "type": "string" + } + }, + required: [ + "account_id", + "webhook_id", + "body" + ], + $defs: { + "aaa_components-schemas-name": aaa_components_schemas_name, + "aaa_secret": aaa_secret, + "aaa_url": aaa_url, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update a webhook" + }, + method: "PUT", + path: "/accounts/{account_id}/alerting/v3/destinations/webhooks/{webhook_id}", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": false, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/destinations/webhooks/${pathParam(args, "webhook_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/alerting/history/schemas.ts b/src/generated/forge-mcp/alerting/history/schemas.ts new file mode 100644 index 00000000..651e4021 --- /dev/null +++ b/src/generated/forge-mcp/alerting/history/schemas.ts @@ -0,0 +1,21 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `aaa_before`. + */ +export const aaa_before: JsonSchema = { + "description": "Limit the returned results to history records older than the specified date. This must be a timestamp that conforms to RFC3339.", + "format": "date-time", + "type": "string" +}; + +/** + * The schema of `aaa_per_page`. + */ +export const aaa_per_page: JsonSchema = { + "description": "Number of items per page.", + "type": "number" +}; diff --git a/src/generated/forge-mcp/alerting/history/tools.ts b/src/generated/forge-mcp/alerting/history/tools.ts new file mode 100644 index 00000000..0faf1368 --- /dev/null +++ b/src/generated/forge-mcp/alerting/history/tools.ts @@ -0,0 +1,78 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { aaa_before, aaa_per_page } from "./schemas.js"; + +/** + * The tools of `alerting.history`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerting_history_list", + title: "List History", + description: "Gets a list of history records for notifications sent to an account. The records are displayed for last `x` number of days based on the zone plan (free = 30, pro = 30, biz = 30, ent = 90).", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "before": { + "$ref": "#/$defs/aaa_before", + "description": "Limit the returned results to history records older than the specified date. This must be a timestamp that conforms to RFC3339." + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "number" + }, + "per_page": { + "$ref": "#/$defs/aaa_per_page", + "default": 25, + "description": "Number of items per page." + }, + "since": { + "description": "Limit the returned results to history records newer than the specified date. This must be a timestamp that conforms to RFC3339.", + "format": "date-time", + "type": "string" + } + }, + required: [ + "account_id" + ], + $defs: { + "aaa_before": aaa_before, + "aaa_per_page": aaa_per_page, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List History" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/history", + extensions: { + "x-api-token-group": [ + "Zero Trust: PII Read", + "Notifications Write", + "Notifications Read", + "Account Settings Write", + "Account Settings Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/history`, + query: [ + ["per_page", args["per_page"], true], + ["before", args["before"], true], + ["page", args["page"], true], + ["since", args["since"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/alerting/policies/email/tools.ts b/src/generated/forge-mcp/alerting/policies/email/tools.ts new file mode 100644 index 00000000..1c0106f2 --- /dev/null +++ b/src/generated/forge-mcp/alerting/policies/email/tools.ts @@ -0,0 +1,111 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `alerting.policies.email`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerting_policies_email_details", + title: "Show email unsubscribe details", + description: "Shows details for unsubscribing an email address from a notification policy.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "email": { + "type": "string" + }, + "policy_id": { + "description": "The unique identifier of a notification policy", + "type": "string" + }, + "token": { + "type": "string" + } + }, + required: [ + "account_id", + "policy_id", + "email", + "token" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Show email unsubscribe details" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/policies/{policy_id}/email/unsubscribe", + extensions: { + "x-api-token-group": [ + "Zero Trust: PII Read", + "Notifications Write", + "Notifications Read", + "Account Settings Write", + "Account Settings Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/policies/${pathParam(args, "policy_id")}/email/unsubscribe`, + query: [ + ["email", args["email"], true], + ["token", args["token"], true], + ], + }), + }, + { + name: "alerting_policies_email_unsubscribe", + title: "Unsubscribe email from a Notification policy", + description: "Unsubscribes an email address from a notification policy.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "email": { + "type": "string" + }, + "policy_id": { + "description": "The unique identifier of a notification policy", + "type": "string" + }, + "token": { + "type": "string" + } + }, + required: [ + "account_id", + "policy_id", + "email", + "token" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Unsubscribe email from a Notification policy" + }, + method: "POST", + path: "/accounts/{account_id}/alerting/v3/policies/{policy_id}/email/unsubscribe", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/policies/${pathParam(args, "policy_id")}/email/unsubscribe`, + query: [ + ["email", args["email"], true], + ["token", args["token"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/alerting/policies/schemas.ts b/src/generated/forge-mcp/alerting/policies/schemas.ts new file mode 100644 index 00000000..a6b79481 --- /dev/null +++ b/src/generated/forge-mcp/alerting/policies/schemas.ts @@ -0,0 +1,502 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `aaa_alert_interval`. + */ +export const aaa_alert_interval: JsonSchema = { + "description": "Optional specification of how often to re-alert from the same incident, not support on all alert types.", + "type": "string" +}; + +/** + * The schema of `aaa_alert_type`. + */ +export const aaa_alert_type: JsonSchema = { + "description": "Refers to which event will trigger a Notification dispatch. You can use the endpoint to get available alert types which then will give you a list of possible values.", + "enum": [ + "abuse_report_alert", + "access_custom_certificate_expiration_type", + "advanced_ddos_attack_l4_alert", + "advanced_ddos_attack_l7_alert", + "advanced_http_alert_error", + "bgp_hijack_notification", + "billing_usage_alert", + "block_notification_block_removed", + "block_notification_new_block", + "block_notification_review_rejected", + "bot_traffic_basic_alert", + "brand_protection_alert", + "brand_protection_digest", + "clickhouse_alert_fw_anomaly", + "clickhouse_alert_fw_ent_anomaly", + "cloudforce_one_request_notification", + "cni_maintenance_notification", + "custom_analytics", + "custom_bot_detection_alert", + "custom_ssl_certificate_event_type", + "dedicated_ssl_certificate_event_type", + "device_connectivity_anomaly_alert", + "dos_attack_l4", + "dos_attack_l7", + "expiring_service_token_alert", + "failing_logpush_job_disabled_alert", + "fbm_auto_advertisement", + "fbm_dosd_attack", + "fbm_volumetric_attack", + "health_check_status_notification", + "hostname_aop_custom_certificate_expiration_type", + "http_alert_edge_error", + "http_alert_origin_error", + "image_notification", + "image_resizing_notification", + "incident_alert", + "load_balancing_health_alert", + "load_balancing_pool_enablement_alert", + "logo_match_alert", + "magic_tunnel_health_check_event", + "magic_wan_tunnel_health", + "maintenance_event_notification", + "mtls_certificate_store_certificate_expiration_type", + "pages_event_alert", + "radar_notification", + "real_origin_monitoring", + "scriptmonitor_alert_new_code_change_detections", + "scriptmonitor_alert_new_hosts", + "scriptmonitor_alert_new_malicious_hosts", + "scriptmonitor_alert_new_malicious_scripts", + "scriptmonitor_alert_new_malicious_url", + "scriptmonitor_alert_new_max_length_resource_url", + "scriptmonitor_alert_new_resources", + "secondary_dns_all_primaries_failing", + "secondary_dns_primaries_failing", + "secondary_dns_warning", + "secondary_dns_zone_successfully_updated", + "secondary_dns_zone_validation_warning", + "security_insights_alert", + "sentinel_alert", + "stream_live_notifications", + "synthetic_test_latency_alert", + "synthetic_test_low_availability_alert", + "traffic_anomalies_alert", + "tunnel_health_event", + "tunnel_update_event", + "universal_ssl_event_type", + "web_analytics_metrics_update", + "zone_aop_custom_certificate_expiration_type" + ], + "type": "string" +}; + +/** + * The schema of `aaa_enabled`. + */ +export const aaa_enabled: JsonSchema = { + "description": "Whether or not the Notification policy is enabled.", + "type": "boolean" +}; + +/** + * The schema of `aaa_filters`. + */ +export const aaa_filters: JsonSchema = { + "description": "Optional filters that allow you to be alerted only on a subset of events for that alert type based on some criteria. This is only available for select alert types. See alert type documentation for more details.", + "properties": { + "actions": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "affected_asns": { + "description": "Used for configuring radar_notification", + "items": { + "type": "string" + }, + "type": "array" + }, + "affected_components": { + "description": "Used for configuring incident_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "affected_locations": { + "description": "Used for configuring radar_notification", + "items": { + "type": "string" + }, + "type": "array" + }, + "airport_code": { + "description": "Used for configuring maintenance_event_notification", + "items": { + "type": "string" + }, + "type": "array" + }, + "alert_trigger_preferences": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "alert_trigger_preferences_value": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "enabled": { + "description": "Used for configuring load_balancing_pool_enablement_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "environment": { + "description": "Used for configuring pages_event_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "event": { + "description": "Used for configuring pages_event_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "event_source": { + "description": "Used for configuring load_balancing_health_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "event_type": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "group_by": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "health_check_id": { + "description": "Used for configuring health_check_status_notification", + "items": { + "type": "string" + }, + "type": "array" + }, + "incident_impact": { + "description": "Used for configuring incident_alert", + "items": { + "enum": [ + "INCIDENT_IMPACT_NONE", + "INCIDENT_IMPACT_MINOR", + "INCIDENT_IMPACT_MAJOR", + "INCIDENT_IMPACT_CRITICAL" + ], + "type": "string" + }, + "type": "array" + }, + "input_id": { + "description": "Used for configuring stream_live_notifications", + "items": { + "type": "string" + }, + "type": "array" + }, + "insight_class": { + "description": "Used for configuring security_insights_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "limit": { + "description": "Used for configuring billing_usage_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "logo_tag": { + "description": "Used for configuring logo_match_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "megabits_per_second": { + "description": "Used for configuring advanced_ddos_attack_l4_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "new_health": { + "description": "Used for configuring load_balancing_health_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "new_status": { + "description": "Used for configuring tunnel_health_event", + "items": { + "type": "string" + }, + "type": "array" + }, + "packets_per_second": { + "description": "Used for configuring advanced_ddos_attack_l4_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "pool_id": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "pop_names": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "product": { + "description": "Used for configuring billing_usage_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "project_id": { + "description": "Used for configuring pages_event_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "protocol": { + "description": "Used for configuring advanced_ddos_attack_l4_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "query_tag": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "requests_per_second": { + "description": "Used for configuring advanced_ddos_attack_l7_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "selectors": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "services": { + "description": "Used for configuring clickhouse_alert_fw_ent_anomaly", + "items": { + "type": "string" + }, + "type": "array" + }, + "slo": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "description": "Used for configuring health_check_status_notification", + "items": { + "type": "string" + }, + "type": "array" + }, + "target_hostname": { + "description": "Used for configuring advanced_ddos_attack_l7_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "target_ip": { + "description": "Used for configuring advanced_ddos_attack_l4_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "target_zone_name": { + "description": "Used for configuring advanced_ddos_attack_l7_alert", + "items": { + "type": "string" + }, + "type": "array" + }, + "token_id": { + "description": "Access service token IDs to include for expiring_service_token_alert. Omit this property to include all current and future service tokens.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "traffic_exclusions": { + "description": "Used for configuring traffic_anomalies_alert", + "items": { + "enum": [ + "security_events" + ], + "type": "string" + }, + "type": "array" + }, + "tunnel_id": { + "description": "Used for configuring tunnel_health_event", + "items": { + "type": "string" + }, + "type": "array" + }, + "tunnel_name": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "type": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "where": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + }, + "zones": { + "description": "Usage depends on specific alert type", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" +}; + +/** + * The schema of `aaa_mechanisms`. + */ +export const aaa_mechanisms: JsonSchema = { + "description": "List of IDs that will be used when dispatching a notification. IDs for email type will be the email address.", + "properties": { + "email": { + "items": { + "$ref": "#/$defs/aaa_mechanisms_emailItem" + }, + "type": "array" + }, + "pagerduty": { + "items": { + "$ref": "#/$defs/aaa_mechanisms_pagerdutyItem" + }, + "type": "array" + }, + "webhooks": { + "items": { + "$ref": "#/$defs/aaa_mechanisms_webhooksItem" + }, + "type": "array" + } + }, + "type": "object" +}; + +/** + * The schema of `aaa_mechanisms_emailItem`. + */ +export const aaa_mechanisms_emailItem: JsonSchema = { + "properties": { + "id": { + "description": "The email address", + "type": "string" + } + }, + "type": "object" +}; + +/** + * The schema of `aaa_mechanisms_pagerdutyItem`. + */ +export const aaa_mechanisms_pagerdutyItem: JsonSchema = { + "properties": { + "id": { + "$ref": "#/$defs/aaa_uuid", + "description": "UUID" + } + }, + "type": "object" +}; + +/** + * The schema of `aaa_mechanisms_webhooksItem`. + */ +export const aaa_mechanisms_webhooksItem: JsonSchema = { + "properties": { + "id": { + "$ref": "#/$defs/aaa_uuid", + "description": "UUID" + } + }, + "type": "object" +}; + +/** + * The schema of `aaa_schemas-description`. + */ +export const aaa_schemas_description: JsonSchema = { + "description": "Optional description for the Notification policy.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/alerting/policies/tools.ts b/src/generated/forge-mcp/alerting/policies/tools.ts new file mode 100644 index 00000000..3e798d1c --- /dev/null +++ b/src/generated/forge-mcp/alerting/policies/tools.ts @@ -0,0 +1,397 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { aaa_schemas_name, aaa_uuid } from "../schemas.js"; +import { + aaa_alert_interval, + aaa_alert_type, + aaa_enabled, + aaa_filters, + aaa_mechanisms, + aaa_mechanisms_emailItem, + aaa_mechanisms_pagerdutyItem, + aaa_mechanisms_webhooksItem, + aaa_schemas_description, +} from "./schemas.js"; + +/** + * The tools of `alerting.policies`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerting_policies_create", + title: "Create a Notification policy", + description: "Creates a new Notification policy.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "body": { + "properties": { + "alert_interval": { + "$ref": "#/$defs/aaa_alert_interval", + "description": "Optional specification of how often to re-alert from the same incident, not support on all alert types." + }, + "alert_type": { + "$ref": "#/$defs/aaa_alert_type", + "description": "Refers to which event will trigger a Notification dispatch. You can use the endpoint to get available alert types which then will give you a list of possible values." + }, + "description": { + "$ref": "#/$defs/aaa_schemas-description", + "description": "Optional description for the Notification policy." + }, + "enabled": { + "$ref": "#/$defs/aaa_enabled", + "default": true, + "description": "Whether or not the Notification policy is enabled." + }, + "filters": { + "$ref": "#/$defs/aaa_filters", + "description": "Optional filters that allow you to be alerted only on a subset of events for that alert type based on some criteria. This is only available for select alert types. See alert type documentation for more details." + }, + "mechanisms": { + "$ref": "#/$defs/aaa_mechanisms", + "description": "List of IDs that will be used when dispatching a notification. IDs for email type will be the email address." + }, + "name": { + "$ref": "#/$defs/aaa_schemas-name", + "description": "Name of the policy." + } + }, + "required": [ + "alert_type", + "enabled", + "mechanisms", + "name" + ], + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "aaa_alert_interval": aaa_alert_interval, + "aaa_alert_type": aaa_alert_type, + "aaa_enabled": aaa_enabled, + "aaa_filters": aaa_filters, + "aaa_mechanisms": aaa_mechanisms, + "aaa_mechanisms_emailItem": aaa_mechanisms_emailItem, + "aaa_mechanisms_pagerdutyItem": aaa_mechanisms_pagerdutyItem, + "aaa_mechanisms_webhooksItem": aaa_mechanisms_webhooksItem, + "aaa_schemas-description": aaa_schemas_description, + "aaa_schemas-name": aaa_schemas_name, + "aaa_uuid": aaa_uuid, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a Notification policy" + }, + method: "POST", + path: "/accounts/{account_id}/alerting/v3/policies", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/policies`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "alerting_policies_delete", + title: "Delete a Notification policy", + description: "Delete a Notification policy.\n\nConfirm with the user before calling this tool. This operation deletes the notification policy.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "policy_id": { + "description": "The unique identifier of a notification policy", + "type": "string" + } + }, + required: [ + "account_id", + "policy_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a Notification policy" + }, + method: "DELETE", + path: "/accounts/{account_id}/alerting/v3/policies/{policy_id}", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/policies/${pathParam(args, "policy_id")}`, + }), + }, + { + name: "alerting_policies_get", + title: "Get a Notification policy", + description: "Get details for a single policy.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "policy_id": { + "description": "The unique identifier of a notification policy", + "type": "string" + } + }, + required: [ + "account_id", + "policy_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a Notification policy" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/policies/{policy_id}", + extensions: { + "x-api-token-group": [ + "Zero Trust: PII Read", + "Notifications Write", + "Notifications Read", + "Account Settings Write", + "Account Settings Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/policies/${pathParam(args, "policy_id")}`, + }), + }, + { + name: "alerting_policies_list", + title: "List Notification policies", + description: "Get a list of all Notification policies.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Notification policies" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/policies", + extensions: { + "x-api-token-group": [ + "Zero Trust: PII Read", + "Notifications Write", + "Notifications Read", + "Account Settings Write", + "Account Settings Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/policies`, + }), + }, + { + name: "alerting_policies_test", + title: "Test a Notification policy", + description: "Send a test notification for a policy to verify delivery mechanisms are working as expected.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "body": { + "description": "Optional configuration for the test notification. When omitted, a default INFO-severity test alert is sent.", + "properties": { + "severity": { + "description": "Severity level for the test alert. Defaults to INFO (1) if omitted.", + "enum": [ + 0, + 1, + 2, + 3, + 4 + ], + "type": "integer" + }, + "source": { + "description": "Source identifier for the test alert.", + "type": "string" + }, + "state_correlation_id": { + "description": "Correlation ID for stateful test alerts. Required when state_event is set.", + "type": "string" + }, + "state_event": { + "description": "State event type for stateful test alerts. Use with state_correlation_id.", + "enum": [ + 0, + 1, + 2 + ], + "type": "integer" + } + }, + "type": "object" + }, + "policy_id": { + "description": "The unique identifier of a notification policy", + "type": "string" + } + }, + required: [ + "account_id", + "policy_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Test a Notification policy" + }, + method: "POST", + path: "/accounts/{account_id}/alerting/v3/policies/{policy_id}/test", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/policies/${pathParam(args, "policy_id")}/test`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "alerting_policies_update", + title: "Update a Notification policy", + description: "Update a Notification policy.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "body": { + "properties": { + "alert_interval": { + "$ref": "#/$defs/aaa_alert_interval", + "description": "Optional specification of how often to re-alert from the same incident, not support on all alert types." + }, + "alert_type": { + "$ref": "#/$defs/aaa_alert_type", + "description": "Refers to which event will trigger a Notification dispatch. You can use the endpoint to get available alert types which then will give you a list of possible values." + }, + "description": { + "$ref": "#/$defs/aaa_schemas-description", + "description": "Optional description for the Notification policy." + }, + "enabled": { + "$ref": "#/$defs/aaa_enabled", + "default": true, + "description": "Whether or not the Notification policy is enabled." + }, + "filters": { + "$ref": "#/$defs/aaa_filters", + "description": "Optional filters that allow you to be alerted only on a subset of events for that alert type based on some criteria. This is only available for select alert types. See alert type documentation for more details." + }, + "mechanisms": { + "$ref": "#/$defs/aaa_mechanisms", + "description": "List of IDs that will be used when dispatching a notification. IDs for email type will be the email address." + }, + "name": { + "$ref": "#/$defs/aaa_schemas-name", + "description": "Name of the policy." + } + }, + "type": "object" + }, + "policy_id": { + "description": "The unique identifier of a notification policy", + "type": "string" + } + }, + required: [ + "account_id", + "policy_id", + "body" + ], + $defs: { + "aaa_alert_interval": aaa_alert_interval, + "aaa_alert_type": aaa_alert_type, + "aaa_enabled": aaa_enabled, + "aaa_filters": aaa_filters, + "aaa_mechanisms": aaa_mechanisms, + "aaa_mechanisms_emailItem": aaa_mechanisms_emailItem, + "aaa_mechanisms_pagerdutyItem": aaa_mechanisms_pagerdutyItem, + "aaa_mechanisms_webhooksItem": aaa_mechanisms_webhooksItem, + "aaa_schemas-description": aaa_schemas_description, + "aaa_schemas-name": aaa_schemas_name, + "aaa_uuid": aaa_uuid, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update a Notification policy" + }, + method: "PUT", + path: "/accounts/{account_id}/alerting/v3/policies/{policy_id}", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/policies/${pathParam(args, "policy_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/alerting/schemas.ts b/src/generated/forge-mcp/alerting/schemas.ts new file mode 100644 index 00000000..5cdf8fba --- /dev/null +++ b/src/generated/forge-mcp/alerting/schemas.ts @@ -0,0 +1,28 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../_/index.js"; + +/** + * The schema of `aaa_policy-id`. + */ +export const aaa_policy_id: JsonSchema = { + "description": "The unique identifier of a notification policy", + "type": "string" +}; + +/** + * The schema of `aaa_schemas-name`. + */ +export const aaa_schemas_name: JsonSchema = { + "description": "Name of the policy.", + "type": "string" +}; + +/** + * The schema of `aaa_uuid`. + */ +export const aaa_uuid: JsonSchema = { + "description": "UUID", + "type": "string" +}; diff --git a/src/generated/forge-mcp/alerting/silences/schemas.ts b/src/generated/forge-mcp/alerting/silences/schemas.ts new file mode 100644 index 00000000..113f3865 --- /dev/null +++ b/src/generated/forge-mcp/alerting/silences/schemas.ts @@ -0,0 +1,54 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `aaa_silence-id`. + */ +export const aaa_silence_id: JsonSchema = { + "description": "Silence ID", + "type": "string" +}; + +/** + * The schema of `aaa_silence_create_request`. + */ +export const aaa_silence_create_request: JsonSchema = { + "properties": { + "end_time": { + "description": "When the silence ends.", + "type": "string" + }, + "policy_id": { + "$ref": "#/$defs/aaa_policy-id", + "description": "The unique identifier of a notification policy" + }, + "start_time": { + "description": "When the silence starts.", + "type": "string" + } + }, + "type": "object" +}; + +/** + * The schema of `aaa_silence_update_request`. + */ +export const aaa_silence_update_request: JsonSchema = { + "properties": { + "end_time": { + "description": "When the silence ends.", + "type": "string" + }, + "id": { + "$ref": "#/$defs/aaa_silence-id", + "description": "Silence ID" + }, + "start_time": { + "description": "When the silence starts.", + "type": "string" + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/alerting/silences/tools.ts b/src/generated/forge-mcp/alerting/silences/tools.ts new file mode 100644 index 00000000..0ed9fd14 --- /dev/null +++ b/src/generated/forge-mcp/alerting/silences/tools.ts @@ -0,0 +1,231 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { aaa_policy_id } from "../schemas.js"; +import { + aaa_silence_create_request, + aaa_silence_id, + aaa_silence_update_request, +} from "./schemas.js"; + +/** + * The tools of `alerting.silences`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerting_silences_create", + title: "Create Silences", + description: "Creates a new silence for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "body": { + "items": { + "$ref": "#/$defs/aaa_silence_create_request" + }, + "type": "array" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "aaa_policy-id": aaa_policy_id, + "aaa_silence_create_request": aaa_silence_create_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Silences" + }, + method: "POST", + path: "/accounts/{account_id}/alerting/v3/silences", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/silences`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "alerting_silences_delete", + title: "Delete Silence", + description: "Deletes an existing silence for an account.\n\nConfirm with the user before calling this tool. This operation deletes the notification silence.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "silence_id": { + "description": "Silence ID", + "type": "string" + } + }, + required: [ + "account_id", + "silence_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Silence" + }, + method: "DELETE", + path: "/accounts/{account_id}/alerting/v3/silences/{silence_id}", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/silences/${pathParam(args, "silence_id")}`, + }), + }, + { + name: "alerting_silences_get", + title: "Get Silence", + description: "Gets a specific silence for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "silence_id": { + "description": "Silence ID", + "type": "string" + } + }, + required: [ + "account_id", + "silence_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Silence" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/silences/{silence_id}", + extensions: { + "x-api-token-group": [ + "Zero Trust: PII Read", + "Notifications Write", + "Notifications Read", + "Account Settings Write", + "Account Settings Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/silences/${pathParam(args, "silence_id")}`, + }), + }, + { + name: "alerting_silences_list", + title: "List Silences", + description: "Gets a list of silences for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Silences" + }, + method: "GET", + path: "/accounts/{account_id}/alerting/v3/silences", + extensions: { + "x-api-token-group": [ + "Zero Trust: PII Read", + "Notifications Write", + "Notifications Read", + "Account Settings Write", + "Account Settings Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/silences`, + }), + }, + { + name: "alerting_silences_update", + title: "Update Silences", + description: "Updates existing silences for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "The account id", + "type": "string" + }, + "body": { + "items": { + "$ref": "#/$defs/aaa_silence_update_request" + }, + "type": "array" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "aaa_silence-id": aaa_silence_id, + "aaa_silence_update_request": aaa_silence_update_request, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Silences" + }, + method: "PUT", + path: "/accounts/{account_id}/alerting/v3/silences", + extensions: { + "x-api-token-group": [ + "Notifications Write", + "Account Settings Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/alerting/v3/silences`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/alerts/clear/tools.ts b/src/generated/forge-mcp/alerts/clear/tools.ts new file mode 100644 index 00000000..e1dfc115 --- /dev/null +++ b/src/generated/forge-mcp/alerts/clear/tools.ts @@ -0,0 +1,43 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `alerts.clear`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerts_clear_edit", + title: "Update verification statuses of tracked URLs to awaiting by ID", + description: "Return a success message after updating verification statuses of tracked URLs to awaiting by ID", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update verification statuses of tracked URLs to awaiting by ID" + }, + method: "PATCH", + path: "/accounts/{account_id}/brand-protection/alerts/clear", + extensions: { + "x-api-token-group": [ + "Intel Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/alerts/clear`, + }), + }, +]; diff --git a/src/generated/forge-mcp/alerts/refute/tools.ts b/src/generated/forge-mcp/alerts/refute/tools.ts new file mode 100644 index 00000000..4b6af142 --- /dev/null +++ b/src/generated/forge-mcp/alerts/refute/tools.ts @@ -0,0 +1,43 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `alerts.refute`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerts_refute_edit", + title: "Update verification statuses of tracked URLs to disproven by ID", + description: "Return a success message after updating verification statuses of tracked URLs to disproven by ID", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update verification statuses of tracked URLs to disproven by ID" + }, + method: "PATCH", + path: "/accounts/{account_id}/brand-protection/alerts/refute", + extensions: { + "x-api-token-group": [ + "Intel Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/alerts/refute`, + }), + }, +]; diff --git a/src/generated/forge-mcp/alerts/tools.ts b/src/generated/forge-mcp/alerts/tools.ts new file mode 100644 index 00000000..175c1349 --- /dev/null +++ b/src/generated/forge-mcp/alerts/tools.ts @@ -0,0 +1,77 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; + +/** + * The tools of `alerts`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerts_edit", + title: "Update alerts on submitted domains by ID", + description: "Return a success message after updating alerts on submitted domains by ID", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update alerts on submitted domains by ID" + }, + method: "PATCH", + path: "/accounts/{account_id}/brand-protection/alerts", + extensions: { + "x-api-token-group": [ + "Intel Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/alerts`, + }), + }, + { + name: "alerts_get", + title: "Read all alerts on submitted domains", + description: "Return all alerts on submitted domains", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Read all alerts on submitted domains" + }, + method: "GET", + path: "/accounts/{account_id}/brand-protection/alerts", + extensions: { + "x-api-token-group": [ + "Intel Write", + "Intel Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/alerts`, + }), + }, +]; diff --git a/src/generated/forge-mcp/alerts/verify/tools.ts b/src/generated/forge-mcp/alerts/verify/tools.ts new file mode 100644 index 00000000..5030f6a7 --- /dev/null +++ b/src/generated/forge-mcp/alerts/verify/tools.ts @@ -0,0 +1,43 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `alerts.verify`. + */ +export const tools: readonly Tool[] = [ + { + name: "alerts_verify_edit", + title: "Update verification statuses of tracked URLs to confirmed by ID", + description: "Return a success message after updating verification statuses of tracked URLs to confirmed by ID", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update verification statuses of tracked URLs to confirmed by ID" + }, + method: "PATCH", + path: "/accounts/{account_id}/brand-protection/alerts/verify", + extensions: { + "x-api-token-group": [ + "Intel Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/alerts/verify`, + }), + }, +]; diff --git a/src/generated/forge-mcp/analytics/latency/colos/tools.ts b/src/generated/forge-mcp/analytics/latency/colos/tools.ts new file mode 100644 index 00000000..db2d5974 --- /dev/null +++ b/src/generated/forge-mcp/analytics/latency/colos/tools.ts @@ -0,0 +1,50 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `analytics.latency.colos`. + */ +export const tools: readonly Tool[] = [ + { + name: "analytics_latency_colos_get", + title: "Argo Analytics for a zone at different PoPs", + description: "Retrieves Argo Smart Routing analytics broken down by geographic points of presence (PoPs). Shows latency improvements and routing efficiency per location.", + inputSchema: { + type: "object", + properties: { + "zone_id": { + "description": "Identifier", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Argo Analytics for a zone at different PoPs" + }, + method: "GET", + path: "/zones/{zone_id}/analytics/latency/colos", + extensions: { + "x-api-token-group": [ + "Analytics Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/analytics/latency/colos`, + }), + }, +]; diff --git a/src/generated/forge-mcp/analytics/latency/tools.ts b/src/generated/forge-mcp/analytics/latency/tools.ts new file mode 100644 index 00000000..92cca8d4 --- /dev/null +++ b/src/generated/forge-mcp/analytics/latency/tools.ts @@ -0,0 +1,66 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `analytics.latency`. + */ +export const tools: readonly Tool[] = [ + { + name: "analytics_latency_get", + title: "Argo Analytics for a zone", + description: "Retrieves aggregate Argo Smart Routing analytics for a zone, including latency improvements, bandwidth savings, and routing statistics.", + inputSchema: { + type: "object", + properties: { + "bins": { + "type": "string" + }, + "zone_id": { + "description": "Identifier", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Argo Analytics for a zone" + }, + method: "GET", + path: "/zones/{zone_id}/analytics/latency", + extensions: { + "x-api-token-group": [ + "Analytics Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#analytics:read" + ], + "x-fern-enum": { + "#analytics:read": { + "name": "analytics_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/analytics/latency`, + query: [ + ["bins", args["bins"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/analytics/query/dataSecurity/contentFindings/schemas.ts b/src/generated/forge-mcp/analytics/query/dataSecurity/contentFindings/schemas.ts new file mode 100644 index 00000000..51be1f3d --- /dev/null +++ b/src/generated/forge-mcp/analytics/query/dataSecurity/contentFindings/schemas.ts @@ -0,0 +1,41 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../../_/index.js"; + +/** + * The schema of `art_DataSecurityContentFindingsTopNQuery`. + */ +export const art_DataSecurityContentFindingsTopNQuery: JsonSchema = { + "description": "Returns the top N integrations for content findings.", + "properties": { + "filters": { + "description": "Filters to apply. `findingType = content` is applied automatically for CASB data.", + "items": { + "$ref": "#/$defs/art_Filter" + }, + "type": "array" + }, + "from": { + "description": "Start of the query time range (inclusive). RFC3339.", + "format": "date-time", + "type": "string" + }, + "n": { + "description": "Maximum number of integrations to return.", + "type": "integer" + }, + "to": { + "description": "End of the query time range (exclusive). RFC3339.", + "format": "date-time", + "type": "string" + } + }, + "required": [ + "filters", + "from", + "n", + "to" + ], + "type": "object" +}; diff --git a/src/generated/forge-mcp/analytics/query/dataSecurity/contentFindings/tools.ts b/src/generated/forge-mcp/analytics/query/dataSecurity/contentFindings/tools.ts new file mode 100644 index 00000000..1fdad202 --- /dev/null +++ b/src/generated/forge-mcp/analytics/query/dataSecurity/contentFindings/tools.ts @@ -0,0 +1,56 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; +import { art_Filter } from "../../schemas.js"; +import { art_DataSecurityContentFindingsTopNQuery } from "./schemas.js"; + +/** + * The tools of `analytics.query.data_security.content_findings`. + */ +export const tools: readonly Tool[] = [ + { + name: "analytics_query_data_security_content_findings_top_n", + title: "Top integrations by content findings", + description: "Returns the top N integrations ranked by total content findings.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account identifier.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/art_DataSecurityContentFindingsTopNQuery" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "art_DataSecurityContentFindingsTopNQuery": art_DataSecurityContentFindingsTopNQuery, + "art_Filter": art_Filter, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Top integrations by content findings" + }, + method: "POST", + path: "/accounts/{account_id}/analytics/query/data-security/content-findings/top-n", + extensions: { + "x-api-token-group": [ + "Zero Trust Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/analytics/query/data-security/content-findings/top-n`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/analytics/query/dataSecurity/findings/schemas.ts b/src/generated/forge-mcp/analytics/query/dataSecurity/findings/schemas.ts new file mode 100644 index 00000000..d1758c8b --- /dev/null +++ b/src/generated/forge-mcp/analytics/query/dataSecurity/findings/schemas.ts @@ -0,0 +1,68 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../../_/index.js"; + +/** + * The schema of `art_DataSecurityFindingsSummaryQuery`. + */ +export const art_DataSecurityFindingsSummaryQuery: JsonSchema = { + "description": "Query for aggregate findings summary.", + "properties": { + "filters": { + "description": "Filters to apply.", + "items": { + "$ref": "#/$defs/art_Filter" + }, + "type": "array" + }, + "from": { + "description": "Start of the query time range (inclusive). RFC3339.", + "format": "date-time", + "type": "string" + }, + "to": { + "description": "End of the query time range (exclusive). RFC3339.", + "format": "date-time", + "type": "string" + } + }, + "required": [ + "filters", + "from", + "to" + ], + "type": "object" +}; + +/** + * The schema of `art_DataSecurityFindingsTimeseriesQuery`. + */ +export const art_DataSecurityFindingsTimeseriesQuery: JsonSchema = { + "description": "Query for findings timeseries.", + "properties": { + "filters": { + "description": "Filters to apply.", + "items": { + "$ref": "#/$defs/art_Filter" + }, + "type": "array" + }, + "from": { + "description": "Start of the query time range (inclusive). RFC3339.", + "format": "date-time", + "type": "string" + }, + "to": { + "description": "End of the query time range (exclusive). RFC3339.", + "format": "date-time", + "type": "string" + } + }, + "required": [ + "filters", + "from", + "to" + ], + "type": "object" +}; diff --git a/src/generated/forge-mcp/analytics/query/dataSecurity/findings/tools.ts b/src/generated/forge-mcp/analytics/query/dataSecurity/findings/tools.ts new file mode 100644 index 00000000..3e1f1b1f --- /dev/null +++ b/src/generated/forge-mcp/analytics/query/dataSecurity/findings/tools.ts @@ -0,0 +1,103 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; +import { art_Filter } from "../../schemas.js"; +import { + art_DataSecurityFindingsSummaryQuery, + art_DataSecurityFindingsTimeseriesQuery, +} from "./schemas.js"; + +/** + * The tools of `analytics.query.data_security.findings`. + */ +export const tools: readonly Tool[] = [ + { + name: "analytics_query_data_security_findings_summary", + title: "Data security findings summary", + description: "Returns aggregate current-period and previous-period totals for CASB findings.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account identifier.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/art_DataSecurityFindingsSummaryQuery" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "art_DataSecurityFindingsSummaryQuery": art_DataSecurityFindingsSummaryQuery, + "art_Filter": art_Filter, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Data security findings summary" + }, + method: "POST", + path: "/accounts/{account_id}/analytics/query/data-security/findings/summary", + extensions: { + "x-api-token-group": [ + "Zero Trust Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/analytics/query/data-security/findings/summary`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "analytics_query_data_security_findings_timeseries", + title: "Data security findings timeseries", + description: "Returns merged time-bucketed CASB findings.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account identifier.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/art_DataSecurityFindingsTimeseriesQuery" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "art_DataSecurityFindingsTimeseriesQuery": art_DataSecurityFindingsTimeseriesQuery, + "art_Filter": art_Filter, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Data security findings timeseries" + }, + method: "POST", + path: "/accounts/{account_id}/analytics/query/data-security/findings/timeseries", + extensions: { + "x-api-token-group": [ + "Zero Trust Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/analytics/query/data-security/findings/timeseries`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/analytics/query/schemas.ts b/src/generated/forge-mcp/analytics/query/schemas.ts new file mode 100644 index 00000000..73954c62 --- /dev/null +++ b/src/generated/forge-mcp/analytics/query/schemas.ts @@ -0,0 +1,206 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `art_CommonQuery`. + */ +export const art_CommonQuery: JsonSchema = { + "description": "Defines fields that all query types share.", + "properties": { + "filters": { + "description": "Filters to apply before aggregating results.", + "items": { + "$ref": "#/$defs/art_Filter" + }, + "type": "array" + }, + "from": { + "description": "The start of the query time range (inclusive). RFC3339 format with timezone is required (e.g. `2024-11-05T00:00:00Z`).", + "format": "date-time", + "type": "string" + }, + "groupBy": { + "description": "Specifies the column names to group results by. Requires valid columns for the target dataset.", + "items": { + "type": "string" + }, + "type": "array" + }, + "stats": { + "description": "Specifies the stat names to include in results. Requires valid stats for the target dataset (e.g. `attemptsTotal`, `bytesTotal`).", + "items": { + "type": "string" + }, + "type": "array" + }, + "to": { + "description": "Specifies the end of the query time range (exclusive). Requires RFC3339 format with timezone.", + "format": "date-time", + "type": "string" + } + }, + "required": [ + "filters", + "from", + "groupBy", + "stats", + "to" + ], + "type": "object" +}; + +/** + * The schema of `art_Filter`. + */ +export const art_Filter: JsonSchema = { + "description": "A filter to apply to the query.", + "properties": { + "name": { + "description": "Specifies the column name to filter on. Requires a valid column for the target dataset (e.g. `country`, `allowed`, `appId`).", + "type": "string" + }, + "op": { + "description": "Filter operator. Common values: `eq`, `neq`, `in`, `not_in`, `gt`, `lt`, `gte`, `lte`.\n", + "type": "string" + }, + "values": { + "description": "Values to match against. Type depends on the column.", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "type": "integer" + }, + { + "type": "number" + } + ] + }, + "type": "array" + } + }, + "required": [ + "name", + "op", + "values" + ], + "type": "object" +}; + +/** + * The schema of `art_QueryTimeseries`. + */ +export const art_QueryTimeseries: JsonSchema = { + "description": "Defines fields that all query types share.", + "properties": { + "filters": { + "description": "Filters to apply before aggregating results.", + "items": { + "$ref": "#/$defs/art_Filter" + }, + "type": "array" + }, + "from": { + "description": "The start of the query time range (inclusive). RFC3339 format with timezone is required (e.g. `2024-11-05T00:00:00Z`).", + "format": "date-time", + "type": "string" + }, + "groupBy": { + "description": "Specifies the column names to group results by. Requires valid columns for the target dataset.", + "items": { + "type": "string" + }, + "type": "array" + }, + "resolution": { + "description": "Time bucket size for grouping results. Controls the granularity of the returned time slots.\n", + "type": "string" + }, + "stats": { + "description": "Specifies the stat names to include in results. Requires valid stats for the target dataset (e.g. `attemptsTotal`, `bytesTotal`).", + "items": { + "type": "string" + }, + "type": "array" + }, + "to": { + "description": "Specifies the end of the query time range (exclusive). Requires RFC3339 format with timezone.", + "format": "date-time", + "type": "string" + } + }, + "required": [ + "filters", + "from", + "groupBy", + "stats", + "to", + "resolution" + ], + "type": "object" +}; + +/** + * The schema of `art_QueryTopN`. + */ +export const art_QueryTopN: JsonSchema = { + "description": "Defines fields that all query types share.", + "properties": { + "filters": { + "description": "Filters to apply before aggregating results.", + "items": { + "$ref": "#/$defs/art_Filter" + }, + "type": "array" + }, + "from": { + "description": "The start of the query time range (inclusive). RFC3339 format with timezone is required (e.g. `2024-11-05T00:00:00Z`).", + "format": "date-time", + "type": "string" + }, + "groupBy": { + "description": "Specifies the column names to group results by. Requires valid columns for the target dataset.", + "items": { + "type": "string" + }, + "type": "array" + }, + "n": { + "description": "Maximum number of results to return.", + "type": "integer" + }, + "orderBy": { + "description": "Specifies the stat name for sorting results in descending order. Requires a valid stat for the target dataset.", + "type": "string" + }, + "stats": { + "description": "Specifies the stat names to include in results. Requires valid stats for the target dataset (e.g. `attemptsTotal`, `bytesTotal`).", + "items": { + "type": "string" + }, + "type": "array" + }, + "to": { + "description": "Specifies the end of the query time range (exclusive). Requires RFC3339 format with timezone.", + "format": "date-time", + "type": "string" + } + }, + "required": [ + "filters", + "from", + "groupBy", + "stats", + "to", + "n", + "orderBy" + ], + "type": "object" +}; diff --git a/src/generated/forge-mcp/analytics/query/tools.ts b/src/generated/forge-mcp/analytics/query/tools.ts new file mode 100644 index 00000000..5d3f9ba6 --- /dev/null +++ b/src/generated/forge-mcp/analytics/query/tools.ts @@ -0,0 +1,163 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + art_CommonQuery, + art_Filter, + art_QueryTimeseries, + art_QueryTopN, +} from "./schemas.js"; + +/** + * The tools of `analytics.query`. + */ +export const tools: readonly Tool[] = [ + { + name: "analytics_query_summary", + title: "Query analytics summary", + description: "Returns aggregate summary stats for a dataset. Includes current-period and previous-period totals for trend comparison.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account identifier.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/art_CommonQuery" + }, + "dataset": { + "description": "Dataset name to query. Examples: `access-logins`, `gateway-http`, `gateway-dns`, `gateway-http`, `shadow-it`.\n", + "type": "string" + } + }, + required: [ + "account_id", + "dataset", + "body" + ], + $defs: { + "art_CommonQuery": art_CommonQuery, + "art_Filter": art_Filter, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Query analytics summary" + }, + method: "POST", + path: "/accounts/{account_id}/analytics/query/{dataset}/summary", + extensions: { + "x-api-token-group": [ + "Zero Trust Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/analytics/query/${pathParam(args, "dataset")}/summary`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "analytics_query_timeseries", + title: "Query analytics timeseries", + description: "Returns time-bucketed analytics data for a dataset. Includes time slots, each containing the requested stats, group-by dimensions, and resolution-controlled bucket size (e.g. `hour`, `day`).\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account identifier.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/art_QueryTimeseries" + }, + "dataset": { + "description": "Dataset name to query. Examples: `access-logins`, `gateway-http`, `gateway-dns`, `gateway-http`, `shadow-it`.\n", + "type": "string" + } + }, + required: [ + "account_id", + "dataset", + "body" + ], + $defs: { + "art_Filter": art_Filter, + "art_QueryTimeseries": art_QueryTimeseries, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Query analytics timeseries" + }, + method: "POST", + path: "/accounts/{account_id}/analytics/query/{dataset}/timeseries", + extensions: { + "x-api-token-group": [ + "Zero Trust Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/analytics/query/${pathParam(args, "dataset")}/timeseries`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "analytics_query_top_n", + title: "Query analytics top-N", + description: "Returns the top N results for a dataset by a specified stat. Includes an array of result rows, each containing the requested stats and group-by dimensions.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account identifier.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/art_QueryTopN" + }, + "dataset": { + "description": "Dataset name to query. Examples: `access-logins`, `gateway-http`, `gateway-dns`, `gateway-http`, `shadow-it`.\n", + "type": "string" + } + }, + required: [ + "account_id", + "dataset", + "body" + ], + $defs: { + "art_Filter": art_Filter, + "art_QueryTopN": art_QueryTopN, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Query analytics top-N" + }, + method: "POST", + path: "/accounts/{account_id}/analytics/query/{dataset}/top-n", + extensions: { + "x-api-token-group": [ + "Zero Trust Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/analytics/query/${pathParam(args, "dataset")}/top-n`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/analytics/sql/accounts/introspection/tools.ts b/src/generated/forge-mcp/analytics/sql/accounts/introspection/tools.ts new file mode 100644 index 00000000..0b341f42 --- /dev/null +++ b/src/generated/forge-mcp/analytics/sql/accounts/introspection/tools.ts @@ -0,0 +1,84 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; + +/** + * The tools of `analytics.sql.accounts.introspection`. + */ +export const tools: readonly Tool[] = [ + { + name: "analytics_sql_accounts_introspection_get", + title: "List available analytics datasets", + description: "Returns the dataset catalogue for the account in the request path. API Gateway preserves the account path, and SQL API requires it to match the signed JWT account; account_tag is not required as a query parameter. If supplied, it must match the path account. Dataset and column discovery options are identical to the legacy introspection endpoint.\n\nThis method is alpha.", + inputSchema: { + type: "object", + properties: { + "account_tag": { + "description": "Account that authorizes and scopes the request.", + "type": "string" + }, + "dataset_name": { + "description": "Return only the dataset with this exact name. An empty value is treated as if the parameter had been omitted, and does not filter the catalogue. A name that matches no dataset in this deployment's catalogue is rejected with `422`; a dataset that exists but is not describable here is rejected identically, so the two cases cannot be told apart.\n\nA Workers Analytics Engine dataset is named in full, as `events.analyticsEngine.`; the namespace on its own returns every such dataset the account has. A `dataset_name` the account does not have is rejected with `422` like any other unknown name.\n", + "type": "string" + }, + "include_attributes": { + "default": false, + "description": "Include a capped set of attribute names and types observed during the preceding seven days, as `attributes`. Requires a nonempty dataset_name. Replaces `include_custom_attributes`, which is deprecated.\n", + "type": "boolean" + }, + "include_columns": { + "default": false, + "description": "Include column metadata for each returned dataset.", + "type": "boolean" + }, + "include_custom_attributes": { + "default": false, + "description": "Include a capped set of custom attribute names and types observed during the preceding seven days, as `custom_attributes`. Requires a nonempty dataset_name. Deprecated in favor of `include_attributes`.\n", + "type": "boolean" + }, + "include_lex": { + "default": true, + "description": "Include Log Explorer datasets, which are listed only where the account has them. Set to `false` to return only datasets described from the static catalogue, which avoids that lookup.\n", + "type": "boolean" + }, + "include_wae": { + "default": true, + "description": "Include Workers Analytics Engine datasets, which are discovered from the account's own data. Set to `false` to return only datasets described from the static catalogue, which avoids that lookup.\n", + "type": "boolean" + } + }, + required: [ + "account_tag" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List available analytics datasets" + }, + method: "GET", + path: "/accounts/{account_tag}/analytics/sql/introspection", + extensions: { + "x-api-token-group": [ + "Account Analytics Read" + ], + "x-fern-audiences": [ + "sdk" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_tag")}/analytics/sql/introspection`, + query: [ + ["include_columns", args["include_columns"], true], + ["include_custom_attributes", args["include_custom_attributes"], true], + ["include_attributes", args["include_attributes"], true], + ["include_wae", args["include_wae"], true], + ["include_lex", args["include_lex"], true], + ["dataset_name", args["dataset_name"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/analytics/sql/accounts/tools.ts b/src/generated/forge-mcp/analytics/sql/accounts/tools.ts new file mode 100644 index 00000000..b2ebeeea --- /dev/null +++ b/src/generated/forge-mcp/analytics/sql/accounts/tools.ts @@ -0,0 +1,113 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { + analytics_sql_SqlQueryAccountScope, + analytics_sql_SqlQueryRequest, + analytics_sql_SqlQueryRequest_params, + analytics_sql_SqlQueryScope, + analytics_sql_SqlQueryTimeRange, + analytics_sql_SqlQueryZoneScope, +} from "../../../schemas.js"; + +/** + * The tools of `analytics.sql.accounts`. + */ +export const tools: readonly Tool[] = [ + { + name: "analytics_sql_accounts_get", + title: "Query analytics datasets", + description: "Executes a SQL query scoped to the account in the request path. API Gateway preserves the account path, and SQL API requires it to match the signed JWT account, so an accountTag predicate or JSON scope is not required. Explicit account scope must match the path account. Any zone restrictions must belong to that account. Query parameters, time ranges, output formats, authorization, and responses follow the legacy query endpoint.\n\nThis method is alpha.", + inputSchema: { + type: "object", + properties: { + "account_tag": { + "description": "Account that authorizes and scopes the request.", + "type": "string" + }, + "query": { + "description": "SQL query to execute. A trailing FORMAT selects JSON, JSONEachRow, TabSeparated, or TSV output on any dataset.\n", + "type": "string" + } + }, + required: [ + "account_tag", + "query" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Query analytics datasets" + }, + method: "GET", + path: "/accounts/{account_tag}/analytics/sql", + extensions: { + "x-api-token-group": [ + "Account Analytics Read" + ], + "x-fern-audiences": [ + "sdk" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_tag")}/analytics/sql`, + query: [ + ["query", args["query"], true], + ], + }), + }, + { + name: "analytics_sql_accounts_post", + title: "Query analytics datasets", + description: "Executes a SQL query scoped to the account in the request path. API Gateway preserves the account path, and SQL API requires it to match the signed JWT account, so an accountTag predicate or JSON scope is not required. Explicit account scope must match the path account. Any zone restrictions must belong to that account. Query parameters, time ranges, output formats, authorization, and responses follow the legacy query endpoint.\n\nThis method is alpha.", + inputSchema: { + type: "object", + properties: { + "account_tag": { + "description": "Account that authorizes and scopes the request.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/analytics-sql_SqlQueryRequest" + } + }, + required: [ + "account_tag", + "body" + ], + $defs: { + "analytics-sql_SqlQueryAccountScope": analytics_sql_SqlQueryAccountScope, + "analytics-sql_SqlQueryRequest": analytics_sql_SqlQueryRequest, + "analytics-sql_SqlQueryRequest_params": analytics_sql_SqlQueryRequest_params, + "analytics-sql_SqlQueryScope": analytics_sql_SqlQueryScope, + "analytics-sql_SqlQueryTimeRange": analytics_sql_SqlQueryTimeRange, + "analytics-sql_SqlQueryZoneScope": analytics_sql_SqlQueryZoneScope, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Query analytics datasets" + }, + method: "POST", + path: "/accounts/{account_tag}/analytics/sql", + extensions: { + "x-api-token-group": [ + "Account Analytics Read" + ], + "x-fern-audiences": [ + "sdk" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_tag")}/analytics/sql`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/analytics/sql/tools.ts b/src/generated/forge-mcp/analytics/sql/tools.ts new file mode 100644 index 00000000..05015284 --- /dev/null +++ b/src/generated/forge-mcp/analytics/sql/tools.ts @@ -0,0 +1,50 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { Tool } from "../../_/index.js"; + +/** + * The tools of `analytics.sql`. + */ +export const tools: readonly Tool[] = [ + { + name: "analytics_sql_get", + title: "Query analytics datasets", + description: "Executes a SQL query against the analytics datasets available to the caller. SQL placeholders can be bound with query parameters named `param_`, such as `param_status=404` for `$status`. A trailing `FORMAT JSON`, `FORMAT JSONEachRow`, `FORMAT TabSeparated`, or `FORMAT TSV` is supported for all datasets. Without FORMAT, each backend retains its existing default JSON response.", + inputSchema: { + type: "object", + properties: { + "query": { + "description": "SQL query to execute. A trailing FORMAT selects JSON, JSONEachRow, TabSeparated, or TSV output on any dataset.\n", + "type": "string" + } + }, + required: [ + "query" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Query analytics datasets" + }, + method: "GET", + path: "/analytics/sql", + extensions: { + "x-api-token-group": [ + "Account Analytics Read" + ], + "x-fern-audiences": [ + "sdk" + ] + }, + request: (args) => ({ + path: `/analytics/sql`, + query: [ + ["query", args["query"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/hosts/tools.ts b/src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/hosts/tools.ts new file mode 100644 index 00000000..21b7d4ff --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/hosts/tools.ts @@ -0,0 +1,68 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; +import { + api_shield_identifier, + api_shield_identifier_2, +} from "../../../../schemas.js"; + +/** + * The tools of `api_security.schema_validation.schemas.hosts`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_schema_validation_schemas_hosts_list", + title: "List hosts covered by uploaded schemas", + description: "Lists all unique hosts found in uploaded OpenAPI schemas for the zone.", + inputSchema: { + type: "object", + properties: { + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Maximum number of results per page.", + "type": "integer" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List hosts covered by uploaded schemas" + }, + method: "GET", + path: "/zones/{zone_id}/schema_validation/schemas/hosts", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/schemas/hosts`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/operations/tools.ts b/src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/operations/tools.ts new file mode 100644 index 00000000..c5109962 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/operations/tools.ts @@ -0,0 +1,129 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; +import { + api_shield_identifier, + api_shield_identifier_2, + api_shield_uuid, + api_shield_uuid_2, +} from "../../../../schemas.js"; + +/** + * The tools of `api_security.schema_validation.schemas.operations`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_schema_validation_schemas_operations_list", + title: "Retrieve all operations from the schema", + description: "Retrieves all operations from the schema. Operations that already exist in API Shield Endpoint Management will be returned as full operations.", + inputSchema: { + type: "object", + properties: { + "endpoint": { + "description": "Filter results to only include endpoints containing this pattern.", + "type": "string" + }, + "feature": { + "description": "Add feature(s) to the results. The feature name that is given here corresponds to the resulting feature object. Have a look at the top-level object description for more details on the specific meaning.", + "items": { + "enum": [ + "thresholds", + "parameter_schemas", + "schema_info", + "confidence_intervals" + ], + "type": "string" + }, + "type": "array" + }, + "host": { + "description": "Filter results to only include the specified hosts.", + "items": { + "type": "string" + }, + "type": "array" + }, + "method": { + "description": "Filter results to only include the specified HTTP methods.", + "items": { + "type": "string" + }, + "type": "array" + }, + "operation_status": { + "description": "Filter results by whether operations exist in Web Asset Management or not. `new` will just return operations from the schema that do not exist otherwise. `existing` will just return operations from the schema that already exist.", + "enum": [ + "new", + "existing" + ], + "type": "string" + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Maximum number of results per page.", + "type": "integer" + }, + "schema_id": { + "allOf": [ + { + "$ref": "#/$defs/api-shield_uuid-2" + }, + { + "format": "uuid", + "type": "string" + } + ], + "description": "The unique identifier of the schema" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "schema_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Retrieve all operations from the schema" + }, + method: "GET", + path: "/zones/{zone_id}/schema_validation/schemas/{schema_id}/operations", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/schemas/${pathParam(args, "schema_id")}/operations`, + query: [ + ["feature", args["feature"], true], + ["host", args["host"], true], + ["method", args["method"], true], + ["endpoint", args["endpoint"], true], + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["operation_status", args["operation_status"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/tools.ts b/src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/tools.ts new file mode 100644 index 00000000..8fa8b171 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/tools.ts @@ -0,0 +1,331 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { + api_shield_identifier, + api_shield_identifier_2, + api_shield_uuid, + api_shield_uuid_2, +} from "../../../schemas.js"; + +/** + * The tools of `api_security.schema_validation.schemas`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_schema_validation_schemas_create", + title: "Upload a schema", + description: "Uploads an OpenAPI schema that defines expected request formats for API operations.", + inputSchema: { + type: "object", + properties: { + "body": { + "properties": { + "kind": { + "description": "The kind of the schema", + "enum": [ + "openapi_v3" + ], + "type": "string" + }, + "name": { + "description": "A human-readable name for the schema", + "type": "string" + }, + "source": { + "description": "The raw schema, e.g., the OpenAPI schema, either as JSON or YAML", + "type": "string" + }, + "validation_enabled": { + "description": "An indicator if this schema is enabled", + "type": "boolean" + } + }, + "required": [ + "kind", + "name", + "source", + "validation_enabled" + ], + "type": "object" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Upload a schema" + }, + method: "POST", + path: "/zones/{zone_id}/schema_validation/schemas", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/schemas`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_schema_validation_schemas_delete", + title: "Delete a schema", + description: "Permanently removes an uploaded OpenAPI schema from API Security. Operations using this schema will lose their validation rules.\n\nConfirm with the user before calling this tool. This operation permanently deletes the uploaded schema and removes its validation coverage.", + inputSchema: { + type: "object", + properties: { + "schema_id": { + "allOf": [ + { + "$ref": "#/$defs/api-shield_uuid-2" + }, + { + "format": "uuid", + "type": "string" + } + ], + "description": "The unique identifier of the schema" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "schema_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a schema" + }, + method: "DELETE", + path: "/zones/{zone_id}/schema_validation/schemas/{schema_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/schemas/${pathParam(args, "schema_id")}`, + }), + }, + { + name: "api_security_schema_validation_schemas_get", + title: "Get details of a schema", + description: "Gets the contents and metadata of a specific OpenAPI schema uploaded to API Security.", + inputSchema: { + type: "object", + properties: { + "omit_source": { + "default": false, + "description": "Omit the source-files of schemas and only retrieve their meta-data.", + "type": "boolean" + }, + "schema_id": { + "allOf": [ + { + "$ref": "#/$defs/api-shield_uuid-2" + }, + { + "format": "uuid", + "type": "string" + } + ], + "description": "The unique identifier of the schema" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "schema_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get details of a schema" + }, + method: "GET", + path: "/zones/{zone_id}/schema_validation/schemas/{schema_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/schemas/${pathParam(args, "schema_id")}`, + query: [ + ["omit_source", args["omit_source"], true], + ], + }), + }, + { + name: "api_security_schema_validation_schemas_list", + title: "List all uploaded schemas", + description: "Lists all OpenAPI schemas uploaded to API Security.", + inputSchema: { + type: "object", + properties: { + "omit_source": { + "default": false, + "description": "Omit the source-files of schemas and only retrieve their meta-data.", + "type": "boolean" + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Maximum number of results per page.", + "type": "integer" + }, + "validation_enabled": { + "description": "Filter for enabled schemas", + "type": "boolean" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List all uploaded schemas" + }, + method: "GET", + path: "/zones/{zone_id}/schema_validation/schemas", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/schemas`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ["omit_source", args["omit_source"], true], + ["validation_enabled", args["validation_enabled"], true], + ], + }), + }, + { + name: "api_security_schema_validation_schemas_set_validation", + title: "Set schema validation state", + description: "Enables or disables validation for an uploaded OpenAPI schema without changing the schema document.", + inputSchema: { + type: "object", + properties: { + "body": { + "properties": { + "validation_enabled": { + "description": "Flag whether schema is enabled for validation.", + "type": "boolean" + } + }, + "type": "object" + }, + "schema_id": { + "allOf": [ + { + "$ref": "#/$defs/api-shield_uuid-2" + }, + { + "format": "uuid", + "type": "string" + } + ], + "description": "The unique identifier of the schema" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "schema_id", + "body" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Set schema validation state" + }, + method: "PATCH", + path: "/zones/{zone_id}/schema_validation/schemas/{schema_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/schemas/${pathParam(args, "schema_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/operations/schemas.ts b/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/operations/schemas.ts new file mode 100644 index 00000000..e1c65070 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/operations/schemas.ts @@ -0,0 +1,30 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../../_/index.js"; + +/** + * The schema of `api-shield_per_operation_settings_bulk_edit_value`. + */ +export const api_shield_per_operation_settings_bulk_edit_value: JsonSchema = { + "description": "Operation ID to mitigation action mappings", + "properties": { + "mitigation_action": { + "description": "Mitigation actions are as follows:\n* `log` - log request when request does not conform to schema * `block` - deny access to the site when request does not conform to schema * `none` - skip running schema validation * null - clears any existing per-operation setting\n", + "oneOf": [ + { + "enum": [ + "none", + "log", + "block" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/operations/tools.ts b/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/operations/tools.ts new file mode 100644 index 00000000..4efa87c3 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/operations/tools.ts @@ -0,0 +1,277 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; +import { + api_shield_identifier, + api_shield_identifier_2, + api_shield_uuid, +} from "../../../../schemas.js"; +import { api_shield_per_operation_settings_bulk_edit_value } from "./schemas.js"; + +/** + * The tools of `api_security.schema_validation.settings.operations`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_schema_validation_settings_operations_bulk_edit", + title: "Bulk edit per-operation schema validation settings", + description: "Updates schema validation settings for multiple API operations in a single request. Efficient for applying consistent validation rules across endpoints.", + inputSchema: { + type: "object", + properties: { + "body": { + "additionalProperties": { + "$ref": "#/$defs/api-shield_per_operation_settings_bulk_edit_value" + }, + "type": "object" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_per_operation_settings_bulk_edit_value": api_shield_per_operation_settings_bulk_edit_value, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Bulk edit per-operation schema validation settings" + }, + method: "PATCH", + path: "/zones/{zone_id}/schema_validation/settings/operations", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/settings/operations`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_schema_validation_settings_operations_delete", + title: "Delete per-operation schema validation setting", + description: "Removes custom schema validation settings for a specific API operation, reverting to zone-level defaults.\n\nConfirm with the user before calling this tool. This operation deletes the operation-specific schema validation setting and restores the zone default.", + inputSchema: { + type: "object", + properties: { + "operation_id": { + "$ref": "#/$defs/api-shield_uuid", + "description": "Identifier for the operation" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "operation_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete per-operation schema validation setting" + }, + method: "DELETE", + path: "/zones/{zone_id}/schema_validation/settings/operations/{operation_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/settings/operations/${pathParam(args, "operation_id")}`, + }), + }, + { + name: "api_security_schema_validation_settings_operations_get", + title: "Get per-operation schema validation setting", + description: "Retrieves the schema validation settings configured for a specific API operation.", + inputSchema: { + type: "object", + properties: { + "operation_id": { + "$ref": "#/$defs/api-shield_uuid", + "description": "Identifier for the operation" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "operation_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get per-operation schema validation setting" + }, + method: "GET", + path: "/zones/{zone_id}/schema_validation/settings/operations/{operation_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/settings/operations/${pathParam(args, "operation_id")}`, + }), + }, + { + name: "api_security_schema_validation_settings_operations_list", + title: "List per-operation schema validation settings", + description: "Lists per-operation schema validation settings configured for the zone.", + inputSchema: { + type: "object", + properties: { + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Maximum number of results per page.", + "type": "integer" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List per-operation schema validation settings" + }, + method: "GET", + path: "/zones/{zone_id}/schema_validation/settings/operations", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/settings/operations`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, + { + name: "api_security_schema_validation_settings_operations_update", + title: "Update per-operation schema validation setting", + description: "Fully updates schema validation settings for a specific API operation.", + inputSchema: { + type: "object", + properties: { + "body": { + "properties": { + "mitigation_action": { + "description": "When set, this applies a mitigation action to this operation\n\n - `\"log\"` - log request when request does not conform to schema for this operation\n - `\"block\"` - deny access to the site when request does not conform to schema for this operation\n - `\"none\"` - will skip mitigation for this operation\n - `null` - clears any mitigation action\n", + "oneOf": [ + { + "enum": [ + "log", + "block", + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "mitigation_action" + ], + "type": "object" + }, + "operation_id": { + "$ref": "#/$defs/api-shield_uuid", + "description": "Identifier for the operation" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "operation_id", + "body" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update per-operation schema validation setting" + }, + method: "PUT", + path: "/zones/{zone_id}/schema_validation/settings/operations/{operation_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/settings/operations/${pathParam(args, "operation_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/schemas.ts b/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/schemas.ts new file mode 100644 index 00000000..a36500a8 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/schemas.ts @@ -0,0 +1,36 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `api-shield_global_setting_change_base`. + */ +export const api_shield_global_setting_change_base: JsonSchema = { + "properties": { + "validation_default_mitigation_action": { + "description": "The default mitigation action used\nMitigation actions are as follows:\n\n - `\"log\"` - log request when request does not conform to schema\n - `\"block\"` - deny access to the site when request does not conform to schema\n - `\"none\"` - skip running schema validation\n", + "enum": [ + "none", + "log", + "block" + ], + "type": "string" + }, + "validation_override_mitigation_action": { + "description": "When set, this overrides both zone level and operation level mitigation actions.\n\n - `\"none\"` - skip running schema validation entirely for the request\n - `null` - clears any existing override\n", + "oneOf": [ + { + "enum": [ + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/tools.ts b/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/tools.ts new file mode 100644 index 00000000..b78dc558 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/schemaValidation/settings/tools.ts @@ -0,0 +1,170 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { + api_shield_identifier, + api_shield_identifier_2, +} from "../../../schemas.js"; +import { api_shield_global_setting_change_base } from "./schemas.js"; + +/** + * The tools of `api_security.schema_validation.settings`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_schema_validation_settings_edit", + title: "Edit global schema validation settings", + description: "Partially updates global schema validation settings for a zone using PATCH semantics.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/api-shield_global_setting_change_base" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "api-shield_global_setting_change_base": api_shield_global_setting_change_base, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Edit global schema validation settings" + }, + method: "PATCH", + path: "/zones/{zone_id}/schema_validation/settings", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/settings`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_schema_validation_settings_get", + title: "Get global schema validation settings", + description: "Retrieves the current global schema validation settings for a zone.", + inputSchema: { + type: "object", + properties: { + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get global schema validation settings" + }, + method: "GET", + path: "/zones/{zone_id}/schema_validation/settings", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/settings`, + }), + }, + { + name: "api_security_schema_validation_settings_update", + title: "Update global schema validation settings", + description: "Fully updates global schema validation settings for a zone, replacing existing configuration.", + inputSchema: { + type: "object", + properties: { + "body": { + "properties": { + "validation_default_mitigation_action": { + "description": "The default mitigation action used\nMitigation actions are as follows:\n\n - `\"log\"` - log request when request does not conform to schema\n - `\"block\"` - deny access to the site when request does not conform to schema\n - `\"none\"` - skip running schema validation\n", + "enum": [ + "none", + "log", + "block" + ], + "type": "string" + }, + "validation_override_mitigation_action": { + "description": "When set, this overrides both zone level and operation level mitigation actions.\n\n - `\"none\"` - skip running schema validation entirely for the request\n - `null` - clears any existing override\n", + "oneOf": [ + { + "enum": [ + "none" + ], + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "validation_default_mitigation_action" + ], + "type": "object" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update global schema validation settings" + }, + method: "PUT", + path: "/zones/{zone_id}/schema_validation/settings", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/schema_validation/settings`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/sessionIdentifiers/schemas.ts b/src/generated/forge-mcp/apiSecurity/sessionIdentifiers/schemas.ts new file mode 100644 index 00000000..ff6620a0 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/sessionIdentifiers/schemas.ts @@ -0,0 +1,88 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `api-shield_auth_id_characteristic`. + */ +export const api_shield_auth_id_characteristic: JsonSchema = { + "description": "Auth ID Characteristic", + "properties": { + "name": { + "description": "The name of the characteristic field, i.e., the header or cookie name.", + "type": "string" + }, + "type": { + "description": "The type of characteristic.", + "enum": [ + "header", + "cookie" + ], + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" +}; + +/** + * The schema of `api-shield_auth_id_characteristic_jwt_claim`. + */ +export const api_shield_auth_id_characteristic_jwt_claim: JsonSchema = { + "description": "Auth ID Characteristic extracted from JWT Token Claims", + "properties": { + "name": { + "description": "Claim location expressed as `$(token_config_id):$(json_path)`, where `token_config_id` \nis the ID of the token configuration used in validating the JWT, and `json_path` is a RFC 9535 \nJSONPath (https://goessner.net/articles/JsonPath/, https://www.rfc-editor.org/rfc/rfc9535.html).\nThe JSONPath expression may be in dot or bracket notation, may only specify literal keys\nor array indexes, and must return a singleton value, which will be interpreted as a string.\n", + "type": "string" + }, + "type": { + "description": "The type of characteristic.", + "enum": [ + "jwt" + ], + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" +}; + +/** + * The schema of `api-shield_auth_id_characteristics`. + */ +export const api_shield_auth_id_characteristics: JsonSchema = { + "items": { + "anyOf": [ + { + "$ref": "#/$defs/api-shield_auth_id_characteristic" + }, + { + "$ref": "#/$defs/api-shield_auth_id_characteristic_jwt_claim" + } + ] + }, + "maxItems": 10, + "type": "array" +}; + +/** + * The schema of `api-shield_configuration`. + */ +export const api_shield_configuration: JsonSchema = { + "properties": { + "auth_id_characteristics": { + "$ref": "#/$defs/api-shield_auth_id_characteristics" + } + }, + "required": [ + "auth_id_characteristics" + ], + "type": "object" +}; diff --git a/src/generated/forge-mcp/apiSecurity/sessionIdentifiers/tools.ts b/src/generated/forge-mcp/apiSecurity/sessionIdentifiers/tools.ts new file mode 100644 index 00000000..6d40a928 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/sessionIdentifiers/tools.ts @@ -0,0 +1,121 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + api_shield_identifier, + api_shield_identifier_2, +} from "../../schemas.js"; +import { + api_shield_auth_id_characteristic, + api_shield_auth_id_characteristic_jwt_claim, + api_shield_auth_id_characteristics, + api_shield_configuration, +} from "./schemas.js"; + +/** + * The tools of `api_security.session_identifiers`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_session_identifiers_get", + title: "Get session identifier settings", + description: "Returns the authentication identifier characteristics configured for the zone. Header, cookie, or JWT claim values identify distinct API sessions.", + inputSchema: { + type: "object", + properties: { + "normalize": { + "description": "Ensures that the configuration is written or retrieved in normalized fashion", + "type": "boolean" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get session identifier settings" + }, + method: "GET", + path: "/zones/{zone_id}/api_gateway/configuration", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/api_gateway/configuration`, + query: [ + ["normalize", args["normalize"], true], + ], + }), + }, + { + name: "api_security_session_identifiers_update", + title: "Update session identifier settings", + description: "Replaces the zone's authentication identifier characteristics used to identify distinct API sessions.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/api-shield_configuration" + }, + "normalize": { + "description": "Ensures that the configuration is written or retrieved in normalized fashion", + "type": "boolean" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "api-shield_auth_id_characteristic": api_shield_auth_id_characteristic, + "api-shield_auth_id_characteristic_jwt_claim": api_shield_auth_id_characteristic_jwt_claim, + "api-shield_auth_id_characteristics": api_shield_auth_id_characteristics, + "api-shield_configuration": api_shield_configuration, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update session identifier settings" + }, + method: "PUT", + path: "/zones/{zone_id}/api_gateway/configuration", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/api_gateway/configuration`, + query: [ + ["normalize", args["normalize"], true], + ], + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/credentials/schemas.ts b/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/credentials/schemas.ts new file mode 100644 index 00000000..94e9d585 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/credentials/schemas.ts @@ -0,0 +1,85 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../../_/index.js"; + +/** + * The schema of `api-shield_credentials-JWT-Key-oct-patch-request`. + */ +export const api_shield_credentials_JWT_Key_oct_patch_request: JsonSchema = { + "description": "JSON representation of a symmetric key for PATCH requests.", + "properties": { + "alg": { + "description": "Algorithm", + "enum": [ + "HS256", + "HS384", + "HS512" + ], + "type": "string" + }, + "k": { + "description": "Symmetric key material. Optional for PATCH: omit to preserve existing secret for matching `{alg,kid}`; send a string to rotate. `k: null` is invalid.", + "type": "string" + }, + "kid": { + "description": "Key ID", + "type": "string" + }, + "kty": { + "description": "Key Type", + "enum": [ + "oct" + ], + "type": "string" + } + }, + "required": [ + "kid", + "alg", + "kty" + ], + "type": "object" +}; + +/** + * The schema of `api-shield_credentials-JWT-Key-patch-request`. + */ +export const api_shield_credentials_JWT_Key_patch_request: JsonSchema = { + "description": "JSON representation of a JWKS key for PATCH credentials requests.", + "oneOf": [ + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-RSA" + }, + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-EC-ES256" + }, + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-EC-ES384" + }, + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-oct-patch-request" + } + ] +}; + +/** + * The schema of `api-shield_credentials-patch-request`. + */ +export const api_shield_credentials_patch_request: JsonSchema = { + "description": "Request payload for PATCH credentials. Provided keys define the complete stored key set, and stored keys omitted from payload are removed. For each provided key identity (`{alg,kid}`), payload fields overwrite the stored key before validation and omitted fields inherit from the stored key. Key identities must be unique.", + "properties": { + "keys": { + "items": { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-patch-request" + }, + "maxItems": 64, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "keys" + ], + "type": "object" +}; diff --git a/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/credentials/tools.ts b/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/credentials/tools.ts new file mode 100644 index 00000000..a4ce6bd8 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/credentials/tools.ts @@ -0,0 +1,147 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; +import { + api_shield_identifier, + api_shield_identifier_2, + api_shield_uuid, + api_shield_uuid_2, +} from "../../../../schemas.js"; +import { + api_shield_credentials_JWT_Key_EC_ES256, + api_shield_credentials_JWT_Key_EC_ES384, + api_shield_credentials_JWT_Key_EC_common, + api_shield_credentials_JWT_Key_RSA, + api_shield_credentials_JWT_Key_common, + api_shield_credentials_JWT_Key_oct_request, + api_shield_credentials_JWT_Key_request, + api_shield_credentials_request, +} from "../schemas.js"; +import { + api_shield_credentials_JWT_Key_oct_patch_request, + api_shield_credentials_JWT_Key_patch_request, + api_shield_credentials_patch_request, +} from "./schemas.js"; + +/** + * The tools of `api_security.token_validation.configurations.credentials`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_token_validation_configurations_credentials_edit", + title: "Edit token validation credentials", + description: "Updates the configuration's complete key set while allowing omitted fields on existing keys to retain stored values. Omitted key identities are removed.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/api-shield_credentials-patch-request" + }, + "config_id": { + "$ref": "#/$defs/api-shield_uuid-2", + "description": "Token Configuration ID" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "config_id", + "body" + ], + $defs: { + "api-shield_credentials-JWT-Key-EC-ES256": api_shield_credentials_JWT_Key_EC_ES256, + "api-shield_credentials-JWT-Key-EC-ES384": api_shield_credentials_JWT_Key_EC_ES384, + "api-shield_credentials-JWT-Key-EC-common": api_shield_credentials_JWT_Key_EC_common, + "api-shield_credentials-JWT-Key-RSA": api_shield_credentials_JWT_Key_RSA, + "api-shield_credentials-JWT-Key-common": api_shield_credentials_JWT_Key_common, + "api-shield_credentials-JWT-Key-oct-patch-request": api_shield_credentials_JWT_Key_oct_patch_request, + "api-shield_credentials-JWT-Key-patch-request": api_shield_credentials_JWT_Key_patch_request, + "api-shield_credentials-patch-request": api_shield_credentials_patch_request, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Edit token validation credentials" + }, + method: "PATCH", + path: "/zones/{zone_id}/token_validation/config/{config_id}/credentials", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/config/${pathParam(args, "config_id")}/credentials`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_token_validation_configurations_credentials_update", + title: "Replace token validation credentials", + description: "Replaces the configuration's complete key set. Symmetric keys must include their key material.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/api-shield_credentials-request" + }, + "config_id": { + "$ref": "#/$defs/api-shield_uuid-2", + "description": "Token Configuration ID" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "config_id", + "body" + ], + $defs: { + "api-shield_credentials-JWT-Key-EC-ES256": api_shield_credentials_JWT_Key_EC_ES256, + "api-shield_credentials-JWT-Key-EC-ES384": api_shield_credentials_JWT_Key_EC_ES384, + "api-shield_credentials-JWT-Key-EC-common": api_shield_credentials_JWT_Key_EC_common, + "api-shield_credentials-JWT-Key-RSA": api_shield_credentials_JWT_Key_RSA, + "api-shield_credentials-JWT-Key-common": api_shield_credentials_JWT_Key_common, + "api-shield_credentials-JWT-Key-oct-request": api_shield_credentials_JWT_Key_oct_request, + "api-shield_credentials-JWT-Key-request": api_shield_credentials_JWT_Key_request, + "api-shield_credentials-request": api_shield_credentials_request, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Replace token validation credentials" + }, + method: "PUT", + path: "/zones/{zone_id}/token_validation/config/{config_id}/credentials", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/config/${pathParam(args, "config_id")}/credentials`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/schemas.ts b/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/schemas.ts new file mode 100644 index 00000000..bf93c08c --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/schemas.ts @@ -0,0 +1,314 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `api-shield_cookie`. + */ +export const api_shield_cookie: JsonSchema = { + "description": "HTTP request cookie", + "type": "string" +}; + +/** + * The schema of `api-shield_credentials-JWT-Key-EC-ES256`. + */ +export const api_shield_credentials_JWT_Key_EC_ES256: JsonSchema = { + "allOf": [ + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-common" + }, + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-EC-common" + }, + { + "properties": { + "alg": { + "description": "Algorithm", + "enum": [ + "ES256" + ], + "type": "string" + }, + "crv": { + "description": "Curve", + "enum": [ + "P-256" + ], + "type": "string" + } + }, + "required": [ + "alg", + "crv" + ], + "type": "object" + } + ], + "description": "JSON representation of an ES256 key" +}; + +/** + * The schema of `api-shield_credentials-JWT-Key-EC-ES384`. + */ +export const api_shield_credentials_JWT_Key_EC_ES384: JsonSchema = { + "allOf": [ + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-common" + }, + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-EC-common" + }, + { + "properties": { + "alg": { + "description": "Algorithm", + "enum": [ + "ES384" + ], + "type": "string" + }, + "crv": { + "description": "Curve", + "enum": [ + "P-384" + ], + "type": "string" + } + }, + "required": [ + "alg", + "crv" + ], + "type": "object" + } + ], + "description": "JSON representation of an ES384 key" +}; + +/** + * The schema of `api-shield_credentials-JWT-Key-EC-common`. + */ +export const api_shield_credentials_JWT_Key_EC_common: JsonSchema = { + "properties": { + "kty": { + "description": "Key Type", + "enum": [ + "EC" + ], + "type": "string" + }, + "x": { + "description": "X EC coordinate", + "type": "string" + }, + "y": { + "description": "Y EC coordinate", + "type": "string" + } + }, + "required": [ + "kty", + "x", + "y" + ], + "type": "object" +}; + +/** + * The schema of `api-shield_credentials-JWT-Key-RSA`. + */ +export const api_shield_credentials_JWT_Key_RSA: JsonSchema = { + "description": "JSON representation of an RSA key.", + "properties": { + "alg": { + "description": "Algorithm", + "enum": [ + "RS256", + "RS384", + "RS512", + "PS256", + "PS384", + "PS512" + ], + "type": "string" + }, + "e": { + "description": "RSA exponent", + "type": "string" + }, + "kid": { + "description": "Key ID", + "type": "string" + }, + "kty": { + "description": "Key Type", + "enum": [ + "RSA" + ], + "type": "string" + }, + "n": { + "description": "RSA modulus", + "type": "string" + } + }, + "required": [ + "kid", + "alg", + "e", + "kty", + "n" + ], + "type": "object" +}; + +/** + * The schema of `api-shield_credentials-JWT-Key-common`. + */ +export const api_shield_credentials_JWT_Key_common: JsonSchema = { + "properties": { + "kid": { + "description": "Key ID", + "type": "string" + } + }, + "required": [ + "kid" + ], + "type": "object" +}; + +/** + * The schema of `api-shield_credentials-JWT-Key-oct-request`. + */ +export const api_shield_credentials_JWT_Key_oct_request: JsonSchema = { + "description": "JSON representation of a symmetric key for create/PUT requests.", + "properties": { + "alg": { + "description": "Algorithm", + "enum": [ + "HS256", + "HS384", + "HS512" + ], + "type": "string" + }, + "k": { + "description": "Symmetric key material. Required for create and PUT update requests.", + "type": "string" + }, + "kid": { + "description": "Key ID", + "type": "string" + }, + "kty": { + "description": "Key Type", + "enum": [ + "oct" + ], + "type": "string" + } + }, + "required": [ + "kid", + "alg", + "k", + "kty" + ], + "type": "object" +}; + +/** + * The schema of `api-shield_credentials-JWT-Key-request`. + */ +export const api_shield_credentials_JWT_Key_request: JsonSchema = { + "description": "JSON representation of a JWKS key for create and PUT requests.", + "oneOf": [ + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-RSA" + }, + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-EC-ES256" + }, + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-EC-ES384" + }, + { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-oct-request" + } + ] +}; + +/** + * The schema of `api-shield_credentials-request`. + */ +export const api_shield_credentials_request: JsonSchema = { + "description": "Request payload for create and PUT credentials operations. Provided keys define the complete stored key set. Key identities (`{alg,kid}`) must be unique.", + "properties": { + "keys": { + "items": { + "$ref": "#/$defs/api-shield_credentials-JWT-Key-request" + }, + "maxItems": 64, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "keys" + ], + "type": "object" +}; + +/** + * The schema of `api-shield_description`. + */ +export const api_shield_description: JsonSchema = { + "type": "string" +}; + +/** + * The schema of `api-shield_header`. + */ +export const api_shield_header: JsonSchema = { + "description": "HTTP request header (must be lowercase)", + "type": "string" +}; + +/** + * The schema of `api-shield_title`. + */ +export const api_shield_title: JsonSchema = { + "type": "string" +}; + +/** + * The schema of `api-shield_token_sources`. + */ +export const api_shield_token_sources: JsonSchema = { + "items": { + "anyOf": [ + { + "$ref": "#/$defs/api-shield_header" + }, + { + "$ref": "#/$defs/api-shield_cookie" + } + ] + }, + "maxItems": 4, + "minItems": 1, + "type": "array" +}; + +/** + * The schema of `api-shield_token_type`. + */ +export const api_shield_token_type: JsonSchema = { + "enum": [ + "JWT" + ], + "type": "string" +}; diff --git a/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/tools.ts b/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/tools.ts new file mode 100644 index 00000000..14cb6552 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/tools.ts @@ -0,0 +1,326 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { + api_shield_identifier, + api_shield_identifier_2, + api_shield_uuid, + api_shield_uuid_2, +} from "../../../schemas.js"; +import { + api_shield_cookie, + api_shield_credentials_JWT_Key_EC_ES256, + api_shield_credentials_JWT_Key_EC_ES384, + api_shield_credentials_JWT_Key_EC_common, + api_shield_credentials_JWT_Key_RSA, + api_shield_credentials_JWT_Key_common, + api_shield_credentials_JWT_Key_oct_request, + api_shield_credentials_JWT_Key_request, + api_shield_credentials_request, + api_shield_description, + api_shield_header, + api_shield_title, + api_shield_token_sources, + api_shield_token_type, +} from "./schemas.js"; + +/** + * The tools of `api_security.token_validation.configurations`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_token_validation_configurations_create", + title: "Create a token validation configuration", + description: "Creates a JWT validation configuration for the zone.", + inputSchema: { + type: "object", + properties: { + "body": { + "properties": { + "credentials": { + "$ref": "#/$defs/api-shield_credentials-request", + "description": "Request payload for create and PUT credentials operations. Provided keys define the complete stored key set. Key identities (`{alg,kid}`) must be unique." + }, + "description": { + "$ref": "#/$defs/api-shield_description" + }, + "title": { + "$ref": "#/$defs/api-shield_title" + }, + "token_sources": { + "$ref": "#/$defs/api-shield_token_sources" + }, + "token_type": { + "$ref": "#/$defs/api-shield_token_type" + } + }, + "required": [ + "credentials", + "description", + "title", + "token_sources", + "token_type" + ], + "type": "object" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "api-shield_cookie": api_shield_cookie, + "api-shield_credentials-JWT-Key-EC-ES256": api_shield_credentials_JWT_Key_EC_ES256, + "api-shield_credentials-JWT-Key-EC-ES384": api_shield_credentials_JWT_Key_EC_ES384, + "api-shield_credentials-JWT-Key-EC-common": api_shield_credentials_JWT_Key_EC_common, + "api-shield_credentials-JWT-Key-RSA": api_shield_credentials_JWT_Key_RSA, + "api-shield_credentials-JWT-Key-common": api_shield_credentials_JWT_Key_common, + "api-shield_credentials-JWT-Key-oct-request": api_shield_credentials_JWT_Key_oct_request, + "api-shield_credentials-JWT-Key-request": api_shield_credentials_JWT_Key_request, + "api-shield_credentials-request": api_shield_credentials_request, + "api-shield_description": api_shield_description, + "api-shield_header": api_shield_header, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_title": api_shield_title, + "api-shield_token_sources": api_shield_token_sources, + "api-shield_token_type": api_shield_token_type, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a token validation configuration" + }, + method: "POST", + path: "/zones/{zone_id}/token_validation/config", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/config`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_token_validation_configurations_delete", + title: "Delete a token validation configuration", + description: "Deletes a JWT validation configuration from the zone.\n\nConfirm with the user before calling this tool. This operation deletes the token validation configuration. The request is rejected if rules, operations, or JWT authentication identifiers still reference it.", + inputSchema: { + type: "object", + properties: { + "config_id": { + "$ref": "#/$defs/api-shield_uuid-2", + "description": "Token Configuration ID" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "config_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a token validation configuration" + }, + method: "DELETE", + path: "/zones/{zone_id}/token_validation/config/{config_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/config/${pathParam(args, "config_id")}`, + }), + }, + { + name: "api_security_token_validation_configurations_edit", + title: "Edit a token validation configuration", + description: "Updates only the supplied fields on a JWT validation configuration.", + inputSchema: { + type: "object", + properties: { + "body": { + "properties": { + "description": { + "$ref": "#/$defs/api-shield_description" + }, + "title": { + "$ref": "#/$defs/api-shield_title" + }, + "token_sources": { + "$ref": "#/$defs/api-shield_token_sources" + } + }, + "type": "object" + }, + "config_id": { + "$ref": "#/$defs/api-shield_uuid-2", + "description": "Token Configuration ID" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "config_id", + "body" + ], + $defs: { + "api-shield_cookie": api_shield_cookie, + "api-shield_description": api_shield_description, + "api-shield_header": api_shield_header, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_title": api_shield_title, + "api-shield_token_sources": api_shield_token_sources, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Edit a token validation configuration" + }, + method: "PATCH", + path: "/zones/{zone_id}/token_validation/config/{config_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/config/${pathParam(args, "config_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_token_validation_configurations_get", + title: "Get a token validation configuration", + description: "Returns a JWT validation configuration by ID.", + inputSchema: { + type: "object", + properties: { + "config_id": { + "$ref": "#/$defs/api-shield_uuid-2", + "description": "Token Configuration ID" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "config_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a token validation configuration" + }, + method: "GET", + path: "/zones/{zone_id}/token_validation/config/{config_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/config/${pathParam(args, "config_id")}`, + }), + }, + { + name: "api_security_token_validation_configurations_list", + title: "List token validation configurations", + description: "Lists the JWT validation configurations defined for the zone.", + inputSchema: { + type: "object", + properties: { + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Maximum number of results per page.", + "type": "integer" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List token validation configurations" + }, + method: "GET", + path: "/zones/{zone_id}/token_validation/config", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/config`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/tokenValidation/rules/schemas.ts b/src/generated/forge-mcp/apiSecurity/tokenValidation/rules/schemas.ts new file mode 100644 index 00000000..930b66c1 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/tokenValidation/rules/schemas.ts @@ -0,0 +1,260 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `api-shield_action`. + */ +export const api_shield_action: JsonSchema = { + "description": "Action to take on requests that match operations included in `selector` and fail `expression`.", + "enum": [ + "log", + "block" + ], + "type": "string" +}; + +/** + * The schema of `api-shield_after`. + */ +export const api_shield_after: JsonSchema = { + "description": "Move rule to before rule with ID.", + "properties": { + "after": { + "description": "Move rule to after rule with this ID.", + "format": "uuid", + "type": "string" + } + }, + "type": "object" +}; + +/** + * The schema of `api-shield_before`. + */ +export const api_shield_before: JsonSchema = { + "description": "Move rule to after rule with ID.", + "properties": { + "before": { + "description": "Move rule to before rule with this ID.", + "format": "uuid", + "type": "string" + } + }, + "type": "object" +}; + +/** + * The schema of `api-shield_create-single-rule-request`. + */ +export const api_shield_create_single_rule_request: JsonSchema = { + "properties": { + "action": { + "$ref": "#/$defs/api-shield_action", + "description": "Action to take on requests that match operations included in `selector` and fail `expression`." + }, + "description": { + "$ref": "#/$defs/api-shield_description-2", + "description": "A human-readable description that gives more details than `title`." + }, + "enabled": { + "$ref": "#/$defs/api-shield_enabled", + "description": "Toggle rule on or off." + }, + "expression": { + "$ref": "#/$defs/api-shield_expression", + "description": "Rule expression. Requests that fail to match this expression will be subject to `action`.\n\nFor details on expressions, see the [Cloudflare Docs](https://developers.cloudflare.com/api-shield/security/jwt-validation/).\n" + }, + "selector": { + "$ref": "#/$defs/api-shield_selector", + "description": "Select operations covered by this rule.\n\nFor details on selectors, see the [Cloudflare Docs](https://developers.cloudflare.com/api-shield/security/jwt-validation/).\n" + }, + "title": { + "$ref": "#/$defs/api-shield_title-2", + "description": "A human-readable name for the rule." + } + }, + "required": [ + "action", + "description", + "enabled", + "expression", + "selector", + "title" + ], + "type": "object" +}; + +/** + * The schema of `api-shield_description-2`. + */ +export const api_shield_description_2: JsonSchema = { + "description": "A human-readable description that gives more details than `title`.", + "type": "string" +}; + +/** + * The schema of `api-shield_edit-single-rule-request`. + */ +export const api_shield_edit_single_rule_request: JsonSchema = { + "properties": { + "action": { + "$ref": "#/$defs/api-shield_action", + "description": "Action to take on requests that match operations included in `selector` and fail `expression`." + }, + "description": { + "$ref": "#/$defs/api-shield_description-2", + "description": "A human-readable description that gives more details than `title`." + }, + "enabled": { + "$ref": "#/$defs/api-shield_enabled", + "description": "Toggle rule on or off." + }, + "expression": { + "$ref": "#/$defs/api-shield_expression", + "description": "Rule expression. Requests that fail to match this expression will be subject to `action`.\n\nFor details on expressions, see the [Cloudflare Docs](https://developers.cloudflare.com/api-shield/security/jwt-validation/).\n" + }, + "position": { + "$ref": "#/$defs/api-shield_position", + "description": "Update rule order among zone rules." + }, + "selector": { + "$ref": "#/$defs/api-shield_selector", + "description": "Select operations covered by this rule.\n\nFor details on selectors, see the [Cloudflare Docs](https://developers.cloudflare.com/api-shield/security/jwt-validation/).\n" + }, + "title": { + "$ref": "#/$defs/api-shield_title-2", + "description": "A human-readable name for the rule." + } + }, + "type": "object" +}; + +/** + * The schema of `api-shield_enabled`. + */ +export const api_shield_enabled: JsonSchema = { + "description": "Toggle rule on or off.", + "type": "boolean" +}; + +/** + * The schema of `api-shield_expression`. + */ +export const api_shield_expression: JsonSchema = { + "description": "Rule expression. Requests that fail to match this expression will be subject to `action`.\n\nFor details on expressions, see the [Cloudflare Docs](https://developers.cloudflare.com/api-shield/security/jwt-validation/).\n", + "type": "string" +}; + +/** + * The schema of `api-shield_index`. + */ +export const api_shield_index: JsonSchema = { + "properties": { + "index": { + "description": "Move rule to this position", + "type": "integer" + } + }, + "required": [ + "index" + ], + "type": "object" +}; + +/** + * The schema of `api-shield_position`. + */ +export const api_shield_position: JsonSchema = { + "description": "Update rule order among zone rules.", + "oneOf": [ + { + "$ref": "#/$defs/api-shield_index" + }, + { + "$ref": "#/$defs/api-shield_before" + }, + { + "$ref": "#/$defs/api-shield_after" + } + ] +}; + +/** + * The schema of `api-shield_selector`. + */ +export const api_shield_selector: JsonSchema = { + "description": "Select operations covered by this rule.\n\nFor details on selectors, see the [Cloudflare Docs](https://developers.cloudflare.com/api-shield/security/jwt-validation/).\n", + "properties": { + "exclude": { + "description": "Ignore operations that were otherwise included by `include`.", + "oneOf": [ + { + "items": { + "$ref": "#/$defs/api-shield_selector-exclude" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "include": { + "description": "Select all matching operations.", + "oneOf": [ + { + "items": { + "$ref": "#/$defs/api-shield_selector-include" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}; + +/** + * The schema of `api-shield_selector-exclude`. + */ +export const api_shield_selector_exclude: JsonSchema = { + "properties": { + "operation_ids": { + "description": "Excluded operation IDs.", + "items": { + "$ref": "#/$defs/api-shield_uuid-2" + }, + "type": "array" + } + }, + "type": "object" +}; + +/** + * The schema of `api-shield_selector-include`. + */ +export const api_shield_selector_include: JsonSchema = { + "properties": { + "host": { + "description": "Included hostnames.", + "items": { + "$ref": "#/$defs/api-shield_host" + }, + "type": "array" + } + }, + "type": "object" +}; + +/** + * The schema of `api-shield_title-2`. + */ +export const api_shield_title_2: JsonSchema = { + "description": "A human-readable name for the rule.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/apiSecurity/tokenValidation/rules/tools.ts b/src/generated/forge-mcp/apiSecurity/tokenValidation/rules/tools.ts new file mode 100644 index 00000000..beef9432 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/tokenValidation/rules/tools.ts @@ -0,0 +1,478 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { + api_shield_host, + api_shield_identifier, + api_shield_identifier_2, + api_shield_uuid, + api_shield_uuid_2, +} from "../../../schemas.js"; +import { + api_shield_action, + api_shield_after, + api_shield_before, + api_shield_create_single_rule_request, + api_shield_description_2, + api_shield_edit_single_rule_request, + api_shield_enabled, + api_shield_expression, + api_shield_index, + api_shield_position, + api_shield_selector, + api_shield_selector_exclude, + api_shield_selector_include, + api_shield_title_2, +} from "./schemas.js"; + +/** + * The tools of `api_security.token_validation.rules`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_token_validation_rules_bulk_create", + title: "Create token validation rules", + description: "Creates multiple token validation rules for the zone in one request.", + inputSchema: { + type: "object", + properties: { + "body": { + "items": { + "$ref": "#/$defs/api-shield_create-single-rule-request" + }, + "type": "array" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "api-shield_action": api_shield_action, + "api-shield_create-single-rule-request": api_shield_create_single_rule_request, + "api-shield_description-2": api_shield_description_2, + "api-shield_enabled": api_shield_enabled, + "api-shield_expression": api_shield_expression, + "api-shield_host": api_shield_host, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_selector": api_shield_selector, + "api-shield_selector-exclude": api_shield_selector_exclude, + "api-shield_selector-include": api_shield_selector_include, + "api-shield_title-2": api_shield_title_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create token validation rules" + }, + method: "POST", + path: "/zones/{zone_id}/token_validation/rules/bulk", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/rules/bulk`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_token_validation_rules_bulk_edit", + title: "Edit token validation rules", + description: "Updates and reorders multiple token validation rules in one request, then returns the updated rules.", + inputSchema: { + type: "object", + properties: { + "body": { + "items": { + "allOf": [ + { + "properties": { + "id": { + "description": "Rule ID this patch applies to", + "format": "uuid", + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + { + "$ref": "#/$defs/api-shield_edit-single-rule-request" + } + ] + }, + "type": "array" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "api-shield_action": api_shield_action, + "api-shield_after": api_shield_after, + "api-shield_before": api_shield_before, + "api-shield_description-2": api_shield_description_2, + "api-shield_edit-single-rule-request": api_shield_edit_single_rule_request, + "api-shield_enabled": api_shield_enabled, + "api-shield_expression": api_shield_expression, + "api-shield_host": api_shield_host, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_index": api_shield_index, + "api-shield_position": api_shield_position, + "api-shield_selector": api_shield_selector, + "api-shield_selector-exclude": api_shield_selector_exclude, + "api-shield_selector-include": api_shield_selector_include, + "api-shield_title-2": api_shield_title_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Edit token validation rules" + }, + method: "PATCH", + path: "/zones/{zone_id}/token_validation/rules/bulk", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/rules/bulk`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_token_validation_rules_create", + title: "Create a token validation rule", + description: "Creates a token validation rule for the zone.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/api-shield_create-single-rule-request" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "api-shield_action": api_shield_action, + "api-shield_create-single-rule-request": api_shield_create_single_rule_request, + "api-shield_description-2": api_shield_description_2, + "api-shield_enabled": api_shield_enabled, + "api-shield_expression": api_shield_expression, + "api-shield_host": api_shield_host, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_selector": api_shield_selector, + "api-shield_selector-exclude": api_shield_selector_exclude, + "api-shield_selector-include": api_shield_selector_include, + "api-shield_title-2": api_shield_title_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a token validation rule" + }, + method: "POST", + path: "/zones/{zone_id}/token_validation/rules", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/rules`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_token_validation_rules_delete", + title: "Delete a token validation rule", + description: "Deletes a token validation rule from the zone.\n\nConfirm with the user before calling this tool. This operation deletes the token validation rule from the zone.", + inputSchema: { + type: "object", + properties: { + "rule_id": { + "$ref": "#/$defs/api-shield_uuid-2", + "description": "Token Validation Rule ID" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "rule_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a token validation rule" + }, + method: "DELETE", + path: "/zones/{zone_id}/token_validation/rules/{rule_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/rules/${pathParam(args, "rule_id")}`, + }), + }, + { + name: "api_security_token_validation_rules_edit", + title: "Edit a token validation rule", + description: "Updates only the supplied fields on a token validation rule.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/api-shield_edit-single-rule-request" + }, + "rule_id": { + "$ref": "#/$defs/api-shield_uuid-2", + "description": "Token Validation Rule ID" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "rule_id", + "body" + ], + $defs: { + "api-shield_action": api_shield_action, + "api-shield_after": api_shield_after, + "api-shield_before": api_shield_before, + "api-shield_description-2": api_shield_description_2, + "api-shield_edit-single-rule-request": api_shield_edit_single_rule_request, + "api-shield_enabled": api_shield_enabled, + "api-shield_expression": api_shield_expression, + "api-shield_host": api_shield_host, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_index": api_shield_index, + "api-shield_position": api_shield_position, + "api-shield_selector": api_shield_selector, + "api-shield_selector-exclude": api_shield_selector_exclude, + "api-shield_selector-include": api_shield_selector_include, + "api-shield_title-2": api_shield_title_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Edit a token validation rule" + }, + method: "PATCH", + path: "/zones/{zone_id}/token_validation/rules/{rule_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Domain API Gateway" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/rules/${pathParam(args, "rule_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_token_validation_rules_get", + title: "Get a token validation rule", + description: "Returns a token validation rule by ID.", + inputSchema: { + type: "object", + properties: { + "rule_id": { + "$ref": "#/$defs/api-shield_uuid-2", + "description": "Token Validation Rule ID" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id", + "rule_id" + ], + $defs: { + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a token validation rule" + }, + method: "GET", + path: "/zones/{zone_id}/token_validation/rules/{rule_id}", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/rules/${pathParam(args, "rule_id")}`, + }), + }, + { + name: "api_security_token_validation_rules_list", + title: "List token validation rules", + description: "Lists token validation rules for the zone, with filters for configuration, action, state, ID, and host.", + inputSchema: { + type: "object", + properties: { + "action": { + "$ref": "#/$defs/api-shield_action", + "description": "Action to take on requests that match operations included in `selector` and fail `expression`." + }, + "enabled": { + "$ref": "#/$defs/api-shield_enabled", + "description": "Toggle rule on or off." + }, + "host": { + "$ref": "#/$defs/api-shield_host", + "description": "Select rules with this host in `include`." + }, + "hostname": { + "$ref": "#/$defs/api-shield_host", + "description": "Select rules with this host in `include`." + }, + "id": { + "$ref": "#/$defs/api-shield_uuid-2", + "description": "Select rules with these IDs." + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Maximum number of results per page.", + "type": "integer" + }, + "rule_id": { + "$ref": "#/$defs/api-shield_uuid-2", + "description": "Select rules with these IDs." + }, + "token_configuration": { + "description": "Select rules using any of these token configurations.", + "items": { + "$ref": "#/$defs/api-shield_uuid-2" + }, + "type": "array" + }, + "zone_id": { + "$ref": "#/$defs/api-shield_identifier-2" + } + }, + required: [ + "zone_id" + ], + $defs: { + "api-shield_action": api_shield_action, + "api-shield_enabled": api_shield_enabled, + "api-shield_host": api_shield_host, + "api-shield_identifier": api_shield_identifier, + "api-shield_identifier-2": api_shield_identifier_2, + "api-shield_uuid": api_shield_uuid, + "api-shield_uuid-2": api_shield_uuid_2, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List token validation rules" + }, + method: "GET", + path: "/zones/{zone_id}/token_validation/rules", + extensions: { + "x-api-token-group": [ + "Account API Gateway", + "Account API Gateway Read", + "Domain API Gateway", + "Domain API Gateway Read" + ] + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/token_validation/rules`, + query: [ + ["per_page", args["per_page"], true], + ["page", args["page"], true], + ["token_configuration", args["token_configuration"], true], + ["action", args["action"], true], + ["enabled", args["enabled"], true], + ["id", args["id"], true], + ["rule_id", args["rule_id"], true], + ["host", args["host"], true], + ["hostname", args["hostname"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/credentials/schemas.ts b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/credentials/schemas.ts new file mode 100644 index 00000000..2c777360 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/credentials/schemas.ts @@ -0,0 +1,105 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../../_/index.js"; + +/** + * The schema of `vuln_scanner_create-credential-request`. + */ +export const vuln_scanner_create_credential_request: JsonSchema = { + "properties": { + "location": { + "$ref": "#/$defs/vuln_scanner_credential-location", + "description": "Where the credential is attached in outgoing requests." + }, + "location_name": { + "description": "Name of the header or cookie where the credential is attached.\n", + "type": "string" + }, + "name": { + "description": "Human-readable name.", + "type": "string" + }, + "value": { + "description": "The credential value (e.g. API key, session token). Write-only.\nNever returned in responses.\n", + "type": "string" + } + }, + "required": [ + "location", + "location_name", + "name", + "value" + ], + "type": "object" +}; + +/** + * The schema of `vuln_scanner_credential-location`. + */ +export const vuln_scanner_credential_location: JsonSchema = { + "description": "Where the credential is attached in outgoing requests.", + "enum": [ + "header", + "cookie" + ], + "type": "string" +}; + +/** + * The schema of `vuln_scanner_patch-credential-request`. + */ +export const vuln_scanner_patch_credential_request: JsonSchema = { + "description": "Applies a partial update. Only the provided fields change; omitted fields remain unchanged.", + "properties": { + "location": { + "$ref": "#/$defs/vuln_scanner_credential-location", + "description": "Where the credential is attached in outgoing requests." + }, + "location_name": { + "description": "Name of the header or cookie where the credential is attached.\n", + "type": "string" + }, + "name": { + "description": "Human-readable name.", + "type": "string" + }, + "value": { + "description": "The credential value. Write-only. Never returned in responses.\n", + "type": "string" + } + }, + "type": "object" +}; + +/** + * The schema of `vuln_scanner_update-credential-request`. + */ +export const vuln_scanner_update_credential_request: JsonSchema = { + "description": "Full replacement. Provide all fields.", + "properties": { + "location": { + "$ref": "#/$defs/vuln_scanner_credential-location", + "description": "Where the credential is attached in outgoing requests." + }, + "location_name": { + "description": "Name of the header or cookie where the credential is attached.\n", + "type": "string" + }, + "name": { + "description": "Human-readable name.", + "type": "string" + }, + "value": { + "description": "The credential value. Write-only. Never returned in responses.\n", + "type": "string" + } + }, + "required": [ + "location", + "location_name", + "name", + "value" + ], + "type": "object" +}; diff --git a/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/credentials/tools.ts b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/credentials/tools.ts new file mode 100644 index 00000000..47f693a1 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/credentials/tools.ts @@ -0,0 +1,305 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; +import { vuln_scanner_identifier } from "../../schemas.js"; +import { + vuln_scanner_create_credential_request, + vuln_scanner_credential_location, + vuln_scanner_patch_credential_request, + vuln_scanner_update_credential_request, +} from "./schemas.js"; + +/** + * The tools of + * `api_security.vulnerability_scanner.credential_sets.credentials`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_vulnerability_scanner_credential_sets_credentials_create", + title: "Create credential", + description: "Creates a new credential within a credential set.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "body": { + "$ref": "#/$defs/vuln_scanner_create-credential-request" + }, + "credential_set_id": { + "description": "Credential set identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "credential_set_id", + "body" + ], + $defs: { + "vuln_scanner_create-credential-request": vuln_scanner_create_credential_request, + "vuln_scanner_credential-location": vuln_scanner_credential_location, + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create credential" + }, + method: "POST", + path: "/accounts/{account_id}/vuln_scanner/credential_sets/{credential_set_id}/credentials", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets/${pathParam(args, "credential_set_id")}/credentials`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_vulnerability_scanner_credential_sets_credentials_delete", + title: "Delete credential", + description: "Deletes a credential.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation permanently deletes the credential from the credential set.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "credential_id": { + "description": "Credential identifier.", + "format": "uuid", + "type": "string" + }, + "credential_set_id": { + "description": "Credential set identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "credential_set_id", + "credential_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete credential" + }, + method: "DELETE", + path: "/accounts/{account_id}/vuln_scanner/credential_sets/{credential_set_id}/credentials/{credential_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets/${pathParam(args, "credential_set_id")}/credentials/${pathParam(args, "credential_id")}`, + }), + }, + { + name: "api_security_vulnerability_scanner_credential_sets_credentials_edit", + title: "Edit credential", + description: "Updates a credential with only the provided fields; omitted fields remain unchanged.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "body": { + "$ref": "#/$defs/vuln_scanner_patch-credential-request" + }, + "credential_id": { + "description": "Credential identifier.", + "format": "uuid", + "type": "string" + }, + "credential_set_id": { + "description": "Credential set identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "credential_set_id", + "credential_id", + "body" + ], + $defs: { + "vuln_scanner_credential-location": vuln_scanner_credential_location, + "vuln_scanner_identifier": vuln_scanner_identifier, + "vuln_scanner_patch-credential-request": vuln_scanner_patch_credential_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Edit credential" + }, + method: "PATCH", + path: "/accounts/{account_id}/vuln_scanner/credential_sets/{credential_set_id}/credentials/{credential_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets/${pathParam(args, "credential_set_id")}/credentials/${pathParam(args, "credential_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_vulnerability_scanner_credential_sets_credentials_get", + title: "Get credential", + description: "Returns a single credential by ID.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "credential_id": { + "description": "Credential identifier.", + "format": "uuid", + "type": "string" + }, + "credential_set_id": { + "description": "Credential set identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "credential_set_id", + "credential_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get credential" + }, + method: "GET", + path: "/accounts/{account_id}/vuln_scanner/credential_sets/{credential_set_id}/credentials/{credential_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets/${pathParam(args, "credential_set_id")}/credentials/${pathParam(args, "credential_id")}`, + }), + }, + { + name: "api_security_vulnerability_scanner_credential_sets_credentials_list", + title: "List credentials", + description: "Returns all credentials within a credential set.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "credential_set_id": { + "description": "Credential set identifier.", + "format": "uuid", + "type": "string" + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Number of results per page.", + "type": "integer" + } + }, + required: [ + "account_id", + "credential_set_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List credentials" + }, + method: "GET", + path: "/accounts/{account_id}/vuln_scanner/credential_sets/{credential_set_id}/credentials", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets/${pathParam(args, "credential_set_id")}/credentials`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, + { + name: "api_security_vulnerability_scanner_credential_sets_credentials_update", + title: "Update credential", + description: "Replaces a credential. All fields must be provided.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "body": { + "$ref": "#/$defs/vuln_scanner_update-credential-request" + }, + "credential_id": { + "description": "Credential identifier.", + "format": "uuid", + "type": "string" + }, + "credential_set_id": { + "description": "Credential set identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "credential_set_id", + "credential_id", + "body" + ], + $defs: { + "vuln_scanner_credential-location": vuln_scanner_credential_location, + "vuln_scanner_identifier": vuln_scanner_identifier, + "vuln_scanner_update-credential-request": vuln_scanner_update_credential_request, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update credential" + }, + method: "PUT", + path: "/accounts/{account_id}/vuln_scanner/credential_sets/{credential_set_id}/credentials/{credential_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets/${pathParam(args, "credential_set_id")}/credentials/${pathParam(args, "credential_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/schemas.ts b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/schemas.ts new file mode 100644 index 00000000..c36f02b6 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/schemas.ts @@ -0,0 +1,51 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `vuln_scanner_create-credential-set-request`. + */ +export const vuln_scanner_create_credential_set_request: JsonSchema = { + "properties": { + "name": { + "description": "Human-readable name.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" +}; + +/** + * The schema of `vuln_scanner_patch-credential-set-request`. + */ +export const vuln_scanner_patch_credential_set_request: JsonSchema = { + "description": "Applies a partial update. Only the provided fields change; omitted fields remain unchanged.", + "properties": { + "name": { + "description": "Human-readable name.", + "type": "string" + } + }, + "type": "object" +}; + +/** + * The schema of `vuln_scanner_update-credential-set-request`. + */ +export const vuln_scanner_update_credential_set_request: JsonSchema = { + "description": "Full replacement. Provide all fields.", + "properties": { + "name": { + "description": "Human-readable name.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" +}; diff --git a/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/tools.ts b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/tools.ts new file mode 100644 index 00000000..17d9fd80 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/tools.ts @@ -0,0 +1,264 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { vuln_scanner_identifier } from "../schemas.js"; +import { + vuln_scanner_create_credential_set_request, + vuln_scanner_patch_credential_set_request, + vuln_scanner_update_credential_set_request, +} from "./schemas.js"; + +/** + * The tools of `api_security.vulnerability_scanner.credential_sets`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_vulnerability_scanner_credential_sets_create", + title: "Create credential set", + description: "Creates a new credential set.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "body": { + "$ref": "#/$defs/vuln_scanner_create-credential-set-request" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "vuln_scanner_create-credential-set-request": vuln_scanner_create_credential_set_request, + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create credential set" + }, + method: "POST", + path: "/accounts/{account_id}/vuln_scanner/credential_sets", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_vulnerability_scanner_credential_sets_delete", + title: "Delete credential set", + description: "Deletes a credential set and all of its credentials.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation permanently deletes the credential set and every credential it contains.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "credential_set_id": { + "description": "Credential set identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "credential_set_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete credential set" + }, + method: "DELETE", + path: "/accounts/{account_id}/vuln_scanner/credential_sets/{credential_set_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets/${pathParam(args, "credential_set_id")}`, + }), + }, + { + name: "api_security_vulnerability_scanner_credential_sets_edit", + title: "Edit credential set", + description: "Updates a credential set with only the provided fields; omitted fields remain unchanged.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "body": { + "$ref": "#/$defs/vuln_scanner_patch-credential-set-request" + }, + "credential_set_id": { + "description": "Credential set identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "credential_set_id", + "body" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + "vuln_scanner_patch-credential-set-request": vuln_scanner_patch_credential_set_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Edit credential set" + }, + method: "PATCH", + path: "/accounts/{account_id}/vuln_scanner/credential_sets/{credential_set_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets/${pathParam(args, "credential_set_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_vulnerability_scanner_credential_sets_get", + title: "Get credential set", + description: "Returns a single credential set by ID.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "credential_set_id": { + "description": "Credential set identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "credential_set_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get credential set" + }, + method: "GET", + path: "/accounts/{account_id}/vuln_scanner/credential_sets/{credential_set_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets/${pathParam(args, "credential_set_id")}`, + }), + }, + { + name: "api_security_vulnerability_scanner_credential_sets_list", + title: "List credential sets", + description: "Returns all credential sets for the account.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Number of results per page.", + "type": "integer" + } + }, + required: [ + "account_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List credential sets" + }, + method: "GET", + path: "/accounts/{account_id}/vuln_scanner/credential_sets", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, + { + name: "api_security_vulnerability_scanner_credential_sets_update", + title: "Update credential set", + description: "Replaces a credential set. All fields must be provided.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "body": { + "$ref": "#/$defs/vuln_scanner_update-credential-set-request" + }, + "credential_set_id": { + "description": "Credential set identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "credential_set_id", + "body" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + "vuln_scanner_update-credential-set-request": vuln_scanner_update_credential_set_request, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update credential set" + }, + method: "PUT", + path: "/accounts/{account_id}/vuln_scanner/credential_sets/{credential_set_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/credential_sets/${pathParam(args, "credential_set_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/scans/schemas.ts b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/scans/schemas.ts new file mode 100644 index 00000000..2775af6a --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/scans/schemas.ts @@ -0,0 +1,70 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `vuln_scanner_bola-credential-sets`. + */ +export const vuln_scanner_bola_credential_sets: JsonSchema = { + "description": "Credential set references for a BOLA scan. The scanner uses the\n`owner` credentials for legitimate requests and the `attacker`\ncredentials to attempt unauthorized access.\n", + "properties": { + "attacker": { + "description": "Credential set ID for the attacker.", + "format": "uuid", + "type": "string" + }, + "owner": { + "description": "Credential set ID for the resource owner.", + "format": "uuid", + "type": "string" + } + }, + "required": [ + "attacker", + "owner" + ], + "type": "object" +}; + +/** + * The schema of `vuln_scanner_create-bola-scan-request`. + */ +export const vuln_scanner_create_bola_scan_request: JsonSchema = { + "properties": { + "credential_sets": { + "$ref": "#/$defs/vuln_scanner_bola-credential-sets", + "description": "Credential set references for a BOLA scan. The scanner uses the\n`owner` credentials for legitimate requests and the `attacker`\ncredentials to attempt unauthorized access.\n" + }, + "open_api": { + "description": "OpenAPI schema definition for the API under test. The scanner\nuses this to discover endpoints and construct requests.\n", + "type": "string" + }, + "scan_type": { + "enum": [ + "bola" + ], + "type": "string" + }, + "target_environment_id": { + "description": "The target environment to scan.", + "format": "uuid", + "type": "string" + } + }, + "required": [ + "credential_sets", + "open_api", + "scan_type", + "target_environment_id" + ], + "type": "object" +}; + +/** + * The schema of `vuln_scanner_create-scan-request`. + */ +export const vuln_scanner_create_scan_request: JsonSchema = { + "$ref": "#/$defs/vuln_scanner_create-bola-scan-request", + "description": "Create a new vulnerability scan. The `scan_type` discriminator\nselects the scan variant and its required context fields.\n" +}; diff --git a/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/scans/tools.ts b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/scans/tools.ts new file mode 100644 index 00000000..11f6a655 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/scans/tools.ts @@ -0,0 +1,178 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { vuln_scanner_identifier } from "../schemas.js"; +import { + vuln_scanner_bola_credential_sets, + vuln_scanner_create_bola_scan_request, + vuln_scanner_create_scan_request, +} from "./schemas.js"; + +/** + * The tools of `api_security.vulnerability_scanner.scans`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_vulnerability_scanner_scans_create", + title: "Create scan", + description: "Creates and starts a new vulnerability scan. The response may include non-fatal warnings in the `messages` array.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "body": { + "$ref": "#/$defs/vuln_scanner_create-scan-request" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "vuln_scanner_bola-credential-sets": vuln_scanner_bola_credential_sets, + "vuln_scanner_create-bola-scan-request": vuln_scanner_create_bola_scan_request, + "vuln_scanner_create-scan-request": vuln_scanner_create_scan_request, + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create scan" + }, + method: "POST", + path: "/accounts/{account_id}/vuln_scanner/scans", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/scans`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_vulnerability_scanner_scans_delete", + title: "Delete scan", + description: "Deletes a scan and all associated data. Only scans in a terminal state (`finished`, `failed`) may be deleted. Attempting to delete a scan that is still being created or executed (`created`, `scheduled`, `planning`, `running`) returns `400`.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation permanently deletes the completed or failed scan and all associated scan data.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "scan_id": { + "description": "Scan identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "scan_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete scan" + }, + method: "DELETE", + path: "/accounts/{account_id}/vuln_scanner/scans/{scan_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/scans/${pathParam(args, "scan_id")}`, + }), + }, + { + name: "api_security_vulnerability_scanner_scans_get", + title: "Get scan", + description: "Returns a single scan by ID.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "scan_id": { + "description": "Scan identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "scan_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get scan" + }, + method: "GET", + path: "/accounts/{account_id}/vuln_scanner/scans/{scan_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/scans/${pathParam(args, "scan_id")}`, + }), + }, + { + name: "api_security_vulnerability_scanner_scans_list", + title: "List scans", + description: "Returns all scans for the account.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Number of results per page.", + "type": "integer" + } + }, + required: [ + "account_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List scans" + }, + method: "GET", + path: "/accounts/{account_id}/vuln_scanner/scans", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/scans`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/schemas.ts b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/schemas.ts new file mode 100644 index 00000000..5621bf61 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/schemas.ts @@ -0,0 +1,12 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `vuln_scanner_identifier`. + */ +export const vuln_scanner_identifier: JsonSchema = { + "description": "Identifier.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/targetEnvironments/schemas.ts b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/targetEnvironments/schemas.ts new file mode 100644 index 00000000..5a942df3 --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/targetEnvironments/schemas.ts @@ -0,0 +1,129 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../../_/index.js"; + +/** + * The schema of `vuln_scanner_create-target-environment-request`. + */ +export const vuln_scanner_create_target_environment_request: JsonSchema = { + "properties": { + "description": { + "description": "Optional description.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "name": { + "description": "Human-readable name.", + "type": "string" + }, + "target": { + "$ref": "#/$defs/vuln_scanner_target-type", + "description": "Identifies the Cloudflare asset to scan. Uses a `type` discriminator.\nCurrently the service supports only `zone` targets.\n" + } + }, + "required": [ + "name", + "target" + ], + "type": "object" +}; + +/** + * The schema of `vuln_scanner_patch-target-environment-request`. + */ +export const vuln_scanner_patch_target_environment_request: JsonSchema = { + "description": "Applies a partial update. Only the provided fields change; omitted fields remain unchanged.\n\nThe `description` field supports three states:\n- **omitted**: leave unchanged\n- **`null`**: clear the description\n- **`\"value\"`**: set to the given string\n", + "properties": { + "description": { + "description": "Optional description. Omit to leave unchanged, set to `null`\nto clear, or provide a string to update.\n", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "name": { + "description": "Human-readable name.", + "type": "string" + }, + "target": { + "$ref": "#/$defs/vuln_scanner_target-type", + "description": "Identifies the Cloudflare asset to scan. Uses a `type` discriminator.\nCurrently the service supports only `zone` targets.\n" + } + }, + "type": "object" +}; + +/** + * The schema of `vuln_scanner_target-type`. + */ +export const vuln_scanner_target_type: JsonSchema = { + "$ref": "#/$defs/vuln_scanner_zone-target", + "description": "Identifies the Cloudflare asset to scan. Uses a `type` discriminator.\nCurrently the service supports only `zone` targets.\n" +}; + +/** + * The schema of `vuln_scanner_update-target-environment-request`. + */ +export const vuln_scanner_update_target_environment_request: JsonSchema = { + "description": "Full replacement.", + "properties": { + "description": { + "description": "Optional description.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "name": { + "description": "Human-readable name.", + "type": "string" + }, + "target": { + "$ref": "#/$defs/vuln_scanner_target-type", + "description": "Identifies the Cloudflare asset to scan. Uses a `type` discriminator.\nCurrently the service supports only `zone` targets.\n" + } + }, + "required": [ + "name", + "target" + ], + "type": "object" +}; + +/** + * The schema of `vuln_scanner_zone-target`. + */ +export const vuln_scanner_zone_target: JsonSchema = { + "properties": { + "type": { + "enum": [ + "zone" + ], + "type": "string" + }, + "zone_tag": { + "description": "Cloudflare zone tag. The zone must belong to the account.\n", + "type": "string" + } + }, + "required": [ + "type", + "zone_tag" + ], + "type": "object" +}; diff --git a/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/targetEnvironments/tools.ts b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/targetEnvironments/tools.ts new file mode 100644 index 00000000..891b7b2f --- /dev/null +++ b/src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/targetEnvironments/tools.ts @@ -0,0 +1,272 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; +import { vuln_scanner_identifier } from "../schemas.js"; +import { + vuln_scanner_create_target_environment_request, + vuln_scanner_patch_target_environment_request, + vuln_scanner_target_type, + vuln_scanner_update_target_environment_request, + vuln_scanner_zone_target, +} from "./schemas.js"; + +/** + * The tools of `api_security.vulnerability_scanner.target_environments`. + */ +export const tools: readonly Tool[] = [ + { + name: "api_security_vulnerability_scanner_target_environments_create", + title: "Create target environment", + description: "Creates a new target environment for the account.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "body": { + "$ref": "#/$defs/vuln_scanner_create-target-environment-request" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "vuln_scanner_create-target-environment-request": vuln_scanner_create_target_environment_request, + "vuln_scanner_identifier": vuln_scanner_identifier, + "vuln_scanner_target-type": vuln_scanner_target_type, + "vuln_scanner_zone-target": vuln_scanner_zone_target, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create target environment" + }, + method: "POST", + path: "/accounts/{account_id}/vuln_scanner/target_environments", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/target_environments`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_vulnerability_scanner_target_environments_delete", + title: "Delete target environment", + description: "Removes a target environment.\n\nThis method is beta.\n\nConfirm with the user before calling this tool. This operation permanently deletes the target environment from Vulnerability Scanner.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "target_environment_id": { + "description": "Target environment identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "target_environment_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete target environment" + }, + method: "DELETE", + path: "/accounts/{account_id}/vuln_scanner/target_environments/{target_environment_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/target_environments/${pathParam(args, "target_environment_id")}`, + }), + }, + { + name: "api_security_vulnerability_scanner_target_environments_edit", + title: "Edit target environment", + description: "Updates a target environment with only the provided fields; omitted fields remain unchanged.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "body": { + "$ref": "#/$defs/vuln_scanner_patch-target-environment-request" + }, + "target_environment_id": { + "description": "Target environment identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "target_environment_id", + "body" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + "vuln_scanner_patch-target-environment-request": vuln_scanner_patch_target_environment_request, + "vuln_scanner_target-type": vuln_scanner_target_type, + "vuln_scanner_zone-target": vuln_scanner_zone_target, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Edit target environment" + }, + method: "PATCH", + path: "/accounts/{account_id}/vuln_scanner/target_environments/{target_environment_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/target_environments/${pathParam(args, "target_environment_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "api_security_vulnerability_scanner_target_environments_get", + title: "Get target environment", + description: "Returns a single target environment by ID.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "target_environment_id": { + "description": "Target environment identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "target_environment_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get target environment" + }, + method: "GET", + path: "/accounts/{account_id}/vuln_scanner/target_environments/{target_environment_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/target_environments/${pathParam(args, "target_environment_id")}`, + }), + }, + { + name: "api_security_vulnerability_scanner_target_environments_list", + title: "List target environments", + description: "Returns all target environments for the account.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "page": { + "default": 1, + "description": "Page number of paginated results.", + "type": "integer" + }, + "per_page": { + "default": 20, + "description": "Number of results per page.", + "type": "integer" + } + }, + required: [ + "account_id" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List target environments" + }, + method: "GET", + path: "/accounts/{account_id}/vuln_scanner/target_environments", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/target_environments`, + query: [ + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, + { + name: "api_security_vulnerability_scanner_target_environments_update", + title: "Update target environment", + description: "Replaces a target environment. All fields must be provided.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/vuln_scanner_identifier", + "description": "Account identifier." + }, + "body": { + "$ref": "#/$defs/vuln_scanner_update-target-environment-request" + }, + "target_environment_id": { + "description": "Target environment identifier.", + "format": "uuid", + "type": "string" + } + }, + required: [ + "account_id", + "target_environment_id", + "body" + ], + $defs: { + "vuln_scanner_identifier": vuln_scanner_identifier, + "vuln_scanner_target-type": vuln_scanner_target_type, + "vuln_scanner_update-target-environment-request": vuln_scanner_update_target_environment_request, + "vuln_scanner_zone-target": vuln_scanner_zone_target, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update target environment" + }, + method: "PUT", + path: "/accounts/{account_id}/vuln_scanner/target_environments/{target_environment_id}", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/vuln_scanner/target_environments/${pathParam(args, "target_environment_id")}`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/argo/smartRouting/schemas.ts b/src/generated/forge-mcp/argo/smartRouting/schemas.ts new file mode 100644 index 00000000..38010d0d --- /dev/null +++ b/src/generated/forge-mcp/argo/smartRouting/schemas.ts @@ -0,0 +1,33 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `argo-config_patch`. + */ +export const argo_config_patch: JsonSchema = { + "description": "Configures the enablement of Argo Smart Routing.", + "properties": { + "value": { + "$ref": "#/$defs/argo-config_setting_value", + "description": "Specifies the enablement value of Argo Smart Routing." + } + }, + "required": [ + "value" + ], + "type": "object" +}; + +/** + * The schema of `argo-config_setting_value`. + */ +export const argo_config_setting_value: JsonSchema = { + "description": "Specifies the enablement value of Argo Smart Routing.", + "enum": [ + "on", + "off" + ], + "type": "string" +}; diff --git a/src/generated/forge-mcp/argo/smartRouting/tools.ts b/src/generated/forge-mcp/argo/smartRouting/tools.ts new file mode 100644 index 00000000..ef9536e1 --- /dev/null +++ b/src/generated/forge-mcp/argo/smartRouting/tools.ts @@ -0,0 +1,223 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { argo_config_patch, argo_config_setting_value } from "./schemas.js"; + +/** + * The tools of `argo.smart_routing`. + */ +export const tools: readonly Tool[] = [ + { + name: "argo_smart_routing_count_zones_enabled_for_account", + title: "Get count of zones with Argo Smart Routing enabled for account", + description: "Returns the number of zones that have Argo Smart Routing enabled for the specified account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier of the account.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get count of zones with Argo Smart Routing enabled for account" + }, + method: "GET", + path: "/accounts/{account_id}/argo/count_zones_enabled", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read", + "Zone Read", + "Zone Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#zone_settings:read" + ], + "x-fern-enum": { + "#zone_settings:read": { + "name": "zone_settings_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/argo/count_zones_enabled`, + }), + }, + { + name: "argo_smart_routing_count_zones_enabled_for_user", + title: "Get count of zones with Argo Smart Routing enabled for user", + description: "Returns the number of zones that have Argo Smart Routing enabled for the authenticated user.", + inputSchema: { + type: "object", + properties: {}, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get count of zones with Argo Smart Routing enabled for user" + }, + method: "GET", + path: "/user/argo/count_zones_enabled", + extensions: { + "x-api-token-group": [ + "Trust and Safety Write", + "Trust and Safety Read", + "Zone Read", + "Zone Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#zone_settings:read" + ], + "x-fern-enum": { + "#zone_settings:read": { + "name": "zone_settings_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (_args) => ({ + path: `/user/argo/count_zones_enabled`, + }), + }, + { + name: "argo_smart_routing_edit", + title: "Patch Argo Smart Routing setting", + description: "Configures the value of the Argo Smart Routing enablement setting.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/argo-config_patch" + }, + "zone_id": { + "description": "Specifies the zone associated with the API call.", + "type": "string" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "argo-config_patch": argo_config_patch, + "argo-config_setting_value": argo_config_setting_value, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Patch Argo Smart Routing setting" + }, + method: "PATCH", + path: "/zones/{zone_id}/argo/smart_routing", + extensions: { + "x-api-token-group": [ + "Zone Settings Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#zone_settings:read", + "#zone_settings:edit" + ], + "x-fern-enum": { + "#zone_settings:edit": { + "name": "zone_settings_edit" + }, + "#zone_settings:read": { + "name": "zone_settings_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/argo/smart_routing`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "argo_smart_routing_get", + title: "Get Argo Smart Routing setting", + description: "Retrieves the value of Argo Smart Routing enablement setting.", + inputSchema: { + type: "object", + properties: { + "zone_id": { + "description": "Specifies the zone associated with the API call.", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Argo Smart Routing setting" + }, + method: "GET", + path: "/zones/{zone_id}/argo/smart_routing", + extensions: { + "x-api-token-group": [ + "Zone Settings Write", + "Zone Settings Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#zone_settings:read" + ], + "x-fern-enum": { + "#zone_settings:read": { + "name": "zone_settings_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/argo/smart_routing`, + }), + }, +]; diff --git a/src/generated/forge-mcp/argo/tieredCaching/schemas.ts b/src/generated/forge-mcp/argo/tieredCaching/schemas.ts new file mode 100644 index 00000000..7428a201 --- /dev/null +++ b/src/generated/forge-mcp/argo/tieredCaching/schemas.ts @@ -0,0 +1,33 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `cache-settings_patch`. + */ +export const cache_settings_patch: JsonSchema = { + "description": "Update enablement of Tiered Caching.", + "properties": { + "value": { + "$ref": "#/$defs/cache-settings_value", + "description": "Enables Tiered Caching." + } + }, + "required": [ + "value" + ], + "type": "object" +}; + +/** + * The schema of `cache-settings_value`. + */ +export const cache_settings_value: JsonSchema = { + "description": "Enables Tiered Caching.", + "enum": [ + "on", + "off" + ], + "type": "string" +}; diff --git a/src/generated/forge-mcp/argo/tieredCaching/tools.ts b/src/generated/forge-mcp/argo/tieredCaching/tools.ts new file mode 100644 index 00000000..c7f5fcbc --- /dev/null +++ b/src/generated/forge-mcp/argo/tieredCaching/tools.ts @@ -0,0 +1,94 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { cache_settings_patch, cache_settings_value } from "./schemas.js"; + +/** + * The tools of `argo.tiered_caching`. + */ +export const tools: readonly Tool[] = [ + { + name: "argo_tiered_caching_edit", + title: "Patch Tiered Caching setting", + description: "Tiered Cache works by dividing Cloudflare's data centers into a hierarchy of lower-tiers and upper-tiers. If content is not cached in lower-tier data centers (generally the ones closest to a visitor), the lower-tier must ask an upper-tier to see if it has the content. If the upper-tier does not have the content, only the upper-tier can ask the origin for content. This practice improves bandwidth efficiency by limiting the number of data centers that can ask the origin for content, which reduces origin load and makes websites more cost-effective to operate. Additionally, Tiered Cache concentrates connections to origin servers so they come from a small number of data centers rather than the full set of network locations. This results in fewer open connections using server resources.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/cache-settings_patch" + }, + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "cache-settings_patch": cache_settings_patch, + "cache-settings_value": cache_settings_value, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Patch Tiered Caching setting" + }, + method: "PATCH", + path: "/zones/{zone_id}/argo/tiered_caching", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/argo/tiered_caching`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "argo_tiered_caching_get", + title: "Get Tiered Caching setting", + description: "Tiered Cache works by dividing Cloudflare's data centers into a hierarchy of lower-tiers and upper-tiers. If content is not cached in lower-tier data centers (generally the ones closest to a visitor), the lower-tier must ask an upper-tier to see if it has the content. If the upper-tier does not have the content, only the upper-tier can ask the origin for content. This practice improves bandwidth efficiency by limiting the number of data centers that can ask the origin for content, which reduces origin load and makes websites more cost-effective to operate. Additionally, Tiered Cache concentrates connections to origin servers so they come from a small number of data centers rather than the full set of network locations. This results in fewer open connections using server resources.", + inputSchema: { + type: "object", + properties: { + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Tiered Caching setting" + }, + method: "GET", + path: "/zones/{zone_id}/argo/tiered_caching", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/argo/tiered_caching`, + }), + }, +]; diff --git a/src/generated/forge-mcp/artifacts/namespaces/repos/blobs/tools.ts b/src/generated/forge-mcp/artifacts/namespaces/repos/blobs/tools.ts new file mode 100644 index 00000000..a5ee4d72 --- /dev/null +++ b/src/generated/forge-mcp/artifacts/namespaces/repos/blobs/tools.ts @@ -0,0 +1,60 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; + +/** + * The tools of `artifacts.namespaces.repos.blobs`. + */ +export const tools: readonly Tool[] = [ + { + name: "artifacts_namespaces_repos_blobs_get", + title: "Read a Git blob", + description: "Returns raw bytes for an immutable Git blob object. Blob responses are cacheable forever by hash.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "hash": { + "description": "40-character lowercase hexadecimal Git object hash.", + "type": "string" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name", + "hash" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Read a Git blob" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/blob/{hash}", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}/blob/${pathParam(args, "hash")}`, + }), + }, +]; diff --git a/src/generated/forge-mcp/artifacts/namespaces/repos/commits/tools.ts b/src/generated/forge-mcp/artifacts/namespaces/repos/commits/tools.ts new file mode 100644 index 00000000..d8d5f10d --- /dev/null +++ b/src/generated/forge-mcp/artifacts/namespaces/repos/commits/tools.ts @@ -0,0 +1,60 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; + +/** + * The tools of `artifacts.namespaces.repos.commits`. + */ +export const tools: readonly Tool[] = [ + { + name: "artifacts_namespaces_repos_commits_get", + title: "Read a Git commit", + description: "Returns decoded metadata for an immutable Git commit object. Commit responses are cacheable forever by hash.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "hash": { + "description": "40-character lowercase hexadecimal Git object hash.", + "type": "string" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name", + "hash" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Read a Git commit" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/commit/{hash}", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}/commit/${pathParam(args, "hash")}`, + }), + }, +]; diff --git a/src/generated/forge-mcp/artifacts/namespaces/repos/files/tools.ts b/src/generated/forge-mcp/artifacts/namespaces/repos/files/tools.ts new file mode 100644 index 00000000..41e31ee3 --- /dev/null +++ b/src/generated/forge-mcp/artifacts/namespaces/repos/files/tools.ts @@ -0,0 +1,69 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; + +/** + * The tools of `artifacts.namespaces.repos.files`. + */ +export const tools: readonly Tool[] = [ + { + name: "artifacts_namespaces_repos_files_get", + title: "Read a file", + description: "Returns raw bytes for a file resolved by ref and path.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + }, + "path": { + "description": "File path.", + "type": "string" + }, + "ref": { + "description": "Git ref, branch, tag, or commit hash.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name", + "ref", + "path" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Read a file" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/file", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}/file`, + query: [ + ["ref", args["ref"], true], + ["path", args["path"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/artifacts/namespaces/repos/logs/tools.ts b/src/generated/forge-mcp/artifacts/namespaces/repos/logs/tools.ts new file mode 100644 index 00000000..27481b9c --- /dev/null +++ b/src/generated/forge-mcp/artifacts/namespaces/repos/logs/tools.ts @@ -0,0 +1,70 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; + +/** + * The tools of `artifacts.namespaces.repos.logs`. + */ +export const tools: readonly Tool[] = [ + { + name: "artifacts_namespaces_repos_logs_get", + title: "Read commit history", + description: "Returns commit metadata walking backwards from a ref, branch, tag, or HEAD.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "limit": { + "type": "integer" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + }, + "offset": { + "type": "integer" + }, + "ref": { + "description": "Git ref, branch, tag, or commit hash. Defaults to HEAD.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Read commit history" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/log", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}/log`, + query: [ + ["ref", args["ref"], true], + ["limit", args["limit"], true], + ["offset", args["offset"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/artifacts/namespaces/repos/raw/tools.ts b/src/generated/forge-mcp/artifacts/namespaces/repos/raw/tools.ts new file mode 100644 index 00000000..9832d229 --- /dev/null +++ b/src/generated/forge-mcp/artifacts/namespaces/repos/raw/tools.ts @@ -0,0 +1,65 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; + +/** + * The tools of `artifacts.namespaces.repos.raw`. + */ +export const tools: readonly Tool[] = [ + { + name: "artifacts_namespaces_repos_raw_get", + title: "Read a raw file with content type", + description: "Returns file bytes resolved by ref and path, with a sniffed content type and browser-safe response headers.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + }, + "path": { + "description": "File path. May contain slashes.", + "type": "string" + }, + "ref": { + "description": "Git ref, branch, tag, or 40-character commit hash.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name", + "ref", + "path" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Read a raw file with content type" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/raw/{ref}/{path}", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}/raw/${pathParam(args, "ref")}/${pathParam(args, "path")}`, + }), + }, +]; diff --git a/src/generated/forge-mcp/artifacts/namespaces/repos/tokens/tools.ts b/src/generated/forge-mcp/artifacts/namespaces/repos/tokens/tools.ts new file mode 100644 index 00000000..e295a073 --- /dev/null +++ b/src/generated/forge-mcp/artifacts/namespaces/repos/tokens/tools.ts @@ -0,0 +1,78 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; + +/** + * The tools of `artifacts.namespaces.repos.tokens`. + */ +export const tools: readonly Tool[] = [ + { + name: "artifacts_namespaces_repos_tokens_list", + title: "List repository tokens", + description: "Lists tokens for a repository.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + }, + "page": { + "default": 1, + "type": "integer" + }, + "per_page": { + "default": 30, + "type": "integer" + }, + "state": { + "default": "active", + "enum": [ + "active", + "expired", + "revoked", + "all" + ], + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List repository tokens" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/tokens", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}/tokens`, + query: [ + ["state", args["state"], true], + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/artifacts/namespaces/repos/tools.ts b/src/generated/forge-mcp/artifacts/namespaces/repos/tools.ts new file mode 100644 index 00000000..01c29f44 --- /dev/null +++ b/src/generated/forge-mcp/artifacts/namespaces/repos/tools.ts @@ -0,0 +1,367 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `artifacts.namespaces.repos`. + */ +export const tools: readonly Tool[] = [ + { + name: "artifacts_namespaces_repos_create", + title: "Create a repository", + description: "Creates a Git-compatible Artifacts repository in a namespace.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "body": { + "properties": { + "default_branch": { + "description": "Git branch name. Must match /^[a-zA-Z0-9][a-zA-Z0-9._/-]*$/, must not contain '..', and must not end with '/' or '.'.", + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "read_only": { + "type": "boolean" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a repository" + }, + method: "POST", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos", + extensions: { + "x-api-token-group": [ + "Artifacts Edit" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "artifacts_namespaces_repos_delete", + title: "Delete a repository", + description: "Deletes a repository and schedules cleanup of its backing data.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a repository" + }, + method: "DELETE", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}", + extensions: { + "x-api-token-group": [ + "Artifacts Edit" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}`, + }), + }, + { + name: "artifacts_namespaces_repos_fork", + title: "Fork a repository", + description: "Forks a source repository into a new repository.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "body": { + "properties": { + "default_branch_only": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "read_only": { + "type": "boolean" + } + }, + "type": "object" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Fork a repository" + }, + method: "POST", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/fork", + extensions: { + "x-api-token-group": [ + "Artifacts Edit" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}/fork`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "artifacts_namespaces_repos_get", + title: "Get a repository", + description: "Returns repository metadata.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a repository" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}`, + }), + }, + { + name: "artifacts_namespaces_repos_import", + title: "Import a repository", + description: "Imports an HTTPS Git repository into an Artifacts repository.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "body": { + "properties": { + "branch": { + "description": "Git branch name. Must match /^[a-zA-Z0-9][a-zA-Z0-9._/-]*$/, must not contain '..', and must not end with '/' or '.'.", + "type": "string" + }, + "depth": { + "type": "integer" + }, + "read_only": { + "type": "boolean" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Import a repository" + }, + method: "POST", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/import", + extensions: { + "x-api-token-group": [ + "Artifacts Edit" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}/import`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "artifacts_namespaces_repos_list", + title: "List repositories", + description: "Lists repositories in a namespace.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "cursor": { + "type": "string" + }, + "direction": { + "default": "desc", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "limit": { + "default": 50, + "type": "integer" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + }, + "search": { + "type": "string" + }, + "sort": { + "default": "created_at", + "enum": [ + "created_at", + "updated_at", + "last_push_at", + "name" + ], + "type": "string" + } + }, + required: [ + "account_id", + "namespace" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List repositories" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos`, + query: [ + ["limit", args["limit"], true], + ["cursor", args["cursor"], true], + ["search", args["search"], true], + ["sort", args["sort"], true], + ["direction", args["direction"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/artifacts/namespaces/repos/trees/tools.ts b/src/generated/forge-mcp/artifacts/namespaces/repos/trees/tools.ts new file mode 100644 index 00000000..ef003880 --- /dev/null +++ b/src/generated/forge-mcp/artifacts/namespaces/repos/trees/tools.ts @@ -0,0 +1,60 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; + +/** + * The tools of `artifacts.namespaces.repos.trees`. + */ +export const tools: readonly Tool[] = [ + { + name: "artifacts_namespaces_repos_trees_get", + title: "Read a Git tree", + description: "Returns decoded entries for an immutable Git tree object. Tree responses are cacheable forever by hash.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "hash": { + "description": "40-character lowercase hexadecimal Git object hash.", + "type": "string" + }, + "name": { + "description": "Repository name.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "name", + "hash" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Read a Git tree" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/repos/{name}/tree/{hash}", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/repos/${pathParam(args, "name")}/tree/${pathParam(args, "hash")}`, + }), + }, +]; diff --git a/src/generated/forge-mcp/artifacts/namespaces/tokens/tools.ts b/src/generated/forge-mcp/artifacts/namespaces/tokens/tools.ts new file mode 100644 index 00000000..16ce4223 --- /dev/null +++ b/src/generated/forge-mcp/artifacts/namespaces/tokens/tools.ts @@ -0,0 +1,118 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `artifacts.namespaces.tokens`. + */ +export const tools: readonly Tool[] = [ + { + name: "artifacts_namespaces_tokens_create", + title: "Create a repository token", + description: "Creates a scoped Git token for a repository.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "body": { + "properties": { + "repo": { + "type": "string" + }, + "scope": { + "enum": [ + "read", + "write" + ], + "type": "string" + }, + "ttl": { + "type": "integer" + } + }, + "required": [ + "repo" + ], + "type": "object" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a repository token" + }, + method: "POST", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/tokens", + extensions: { + "x-api-token-group": [ + "Artifacts Edit" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/tokens`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "artifacts_namespaces_tokens_revoke", + title: "Revoke a token", + description: "Revokes an Artifacts repository token. Token IDs are resolved through an eventually consistent index, so revoking a token within about a second of creating it can return 404; retry after a short delay.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "id": { + "description": "Token ID. Must match /^[0-9a-z]{16}$/.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace", + "id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Revoke a token" + }, + method: "DELETE", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}/tokens/{id}", + extensions: { + "x-api-token-group": [ + "Artifacts Edit" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}/tokens/${pathParam(args, "id")}`, + }), + }, +]; diff --git a/src/generated/forge-mcp/artifacts/namespaces/tools.ts b/src/generated/forge-mcp/artifacts/namespaces/tools.ts new file mode 100644 index 00000000..68c716f4 --- /dev/null +++ b/src/generated/forge-mcp/artifacts/namespaces/tools.ts @@ -0,0 +1,194 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `artifacts.namespaces`. + */ +export const tools: readonly Tool[] = [ + { + name: "artifacts_namespaces_create", + title: "Create a namespace", + description: "Creates an empty Artifacts namespace for an account.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "body": { + "properties": { + "jurisdiction": { + "default": "unrestricted", + "enum": [ + "unrestricted", + "us", + "eu", + "fedramp" + ], + "type": "string" + }, + "namespace": { + "type": "string" + } + }, + "required": [ + "namespace" + ], + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create a namespace" + }, + method: "POST", + path: "/accounts/{account_id}/artifacts/namespaces", + extensions: { + "x-api-token-group": [ + "Artifacts Edit" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "artifacts_namespaces_delete", + title: "Delete a namespace", + description: "Deletes an empty Artifacts namespace.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete a namespace" + }, + method: "DELETE", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}", + extensions: { + "x-api-token-group": [ + "Artifacts Edit" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}`, + }), + }, + { + name: "artifacts_namespaces_get", + title: "Get a namespace", + description: "Returns an Artifacts namespace summary.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "namespace": { + "description": "Artifacts namespace name.", + "type": "string" + } + }, + required: [ + "account_id", + "namespace" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get a namespace" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces/{namespace}", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces/${pathParam(args, "namespace")}`, + }), + }, + { + name: "artifacts_namespaces_list", + title: "List namespaces", + description: "Lists Artifacts namespaces for an account.\n\nThis method is beta.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Cloudflare account ID.", + "type": "string" + }, + "cursor": { + "type": "string" + }, + "limit": { + "default": 100, + "type": "integer" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List namespaces" + }, + method: "GET", + path: "/accounts/{account_id}/artifacts/namespaces", + extensions: { + "x-api-token-group": [ + "Artifacts Read" + ], + "x-stability": "beta" + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/artifacts/namespaces`, + query: [ + ["limit", args["limit"], true], + ["cursor", args["cursor"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/auditLogs/tools.ts b/src/generated/forge-mcp/auditLogs/tools.ts new file mode 100644 index 00000000..716c0dea --- /dev/null +++ b/src/generated/forge-mcp/auditLogs/tools.ts @@ -0,0 +1,137 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; + +/** + * The tools of `audit_logs`. + */ +export const tools: readonly Tool[] = [ + { + name: "audit_logs_list", + title: "Get account audit logs", + description: "Gets a list of audit logs for an account. Can be filtered by who made the change, on which zone, and the timeframe of the change.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "action_type": { + "description": "Filters by the action type.", + "type": "string" + }, + "actor_email": { + "description": "Filters by the email address of the actor that made the change.", + "type": "string" + }, + "actor_ip": { + "description": "Filters by the IP address of the request that made the change by specific IP address or valid CIDR Range.", + "type": "string" + }, + "before": { + "oneOf": [ + { + "format": "date", + "type": "string" + }, + { + "format": "date-time", + "type": "string" + } + ] + }, + "direction": { + "default": "desc", + "description": "Changes the direction of the chronological sorting.", + "enum": [ + "desc", + "asc" + ], + "type": "string" + }, + "export": { + "description": "Indicates that this request is an export of logs in CSV format.", + "type": "boolean" + }, + "hide_user_logs": { + "default": false, + "description": "Indicates whether or not to hide user level audit logs.", + "type": "boolean" + }, + "id": { + "description": "Finds a specific log by its ID.", + "type": "string" + }, + "page": { + "default": 1, + "description": "Defines which page of results to return.", + "type": "number" + }, + "per_page": { + "default": 100, + "description": "Sets the number of results to return per page.", + "type": "number" + }, + "since": { + "oneOf": [ + { + "format": "date", + "type": "string" + }, + { + "format": "date-time", + "type": "string" + } + ] + }, + "zone_name": { + "description": "Filters by the name of the zone associated to the change.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get account audit logs" + }, + method: "GET", + path: "/accounts/{account_id}/audit_logs", + extensions: { + "x-api-token-group": [ + "Account Settings Write", + "Account Settings Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/audit_logs`, + query: [ + ["id", args["id"], true], + ["export", args["export"], true], + ["action.type", args["action_type"], true], + ["actor.ip", args["actor_ip"], true], + ["actor.email", args["actor_email"], true], + ["since", args["since"], true], + ["before", args["before"], true], + ["zone.name", args["zone_name"], true], + ["direction", args["direction"], true], + ["per_page", args["per_page"], true], + ["page", args["page"], true], + ["hide_user_logs", args["hide_user_logs"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/basinCatalog/credentials/tools.ts b/src/generated/forge-mcp/basinCatalog/credentials/tools.ts new file mode 100644 index 00000000..b58d7fe9 --- /dev/null +++ b/src/generated/forge-mcp/basinCatalog/credentials/tools.ts @@ -0,0 +1,98 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { r2_data_catalog_catalog_credential_request } from "../../schemas.js"; + +/** + * The tools of `basin_catalog.credentials`. + */ +export const tools: readonly Tool[] = [ + { + name: "basin_catalog_credentials_create", + title: "Store catalog credentials", + description: "Store authentication credentials for a catalog. These credentials are used\nto authenticate with R2 storage when performing catalog operations.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/r2-data-catalog_catalog-credential-request" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name", + "body" + ], + $defs: { + "r2-data-catalog_catalog-credential-request": r2_data_catalog_catalog_credential_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Store catalog credentials" + }, + method: "POST", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/credential", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/credential`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "basin_catalog_credentials_status", + title: "Get Basin Catalog credential status", + description: "Check whether the configured catalog credentials are valid, invalid,\nor absent by probing authentication against the catalog.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Basin Catalog credential status" + }, + method: "GET", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/credential/status", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write", + "Workers R2 Data Catalog Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/credential/status`, + }), + }, +]; diff --git a/src/generated/forge-mcp/basinCatalog/maintenanceConfigs/tools.ts b/src/generated/forge-mcp/basinCatalog/maintenanceConfigs/tools.ts new file mode 100644 index 00000000..36dab7a3 --- /dev/null +++ b/src/generated/forge-mcp/basinCatalog/maintenanceConfigs/tools.ts @@ -0,0 +1,108 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + r2_data_catalog_catalog_maintenance_state, + r2_data_catalog_catalog_maintenance_update_request, + r2_data_catalog_catalog_target_file_size, + r2_data_catalog_compaction_update_params, + r2_data_catalog_snapshot_expiration_update_params, +} from "../../schemas.js"; + +/** + * The tools of `basin_catalog.maintenance_configs`. + */ +export const tools: readonly Tool[] = [ + { + name: "basin_catalog_maintenance_configs_get", + title: "Get catalog maintenance configuration", + description: "Retrieve the maintenance configuration for a specific catalog,\nincluding compaction settings and credential status.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get catalog maintenance configuration" + }, + method: "GET", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/maintenance-configs", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write", + "Workers R2 Data Catalog Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/maintenance-configs`, + }), + }, + { + name: "basin_catalog_maintenance_configs_update", + title: "Update catalog maintenance configuration", + description: "Update the maintenance configuration for a catalog. This allows you to\nenable or disable compaction and adjust target file sizes for optimization.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/r2-data-catalog_catalog-maintenance-update-request" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name", + "body" + ], + $defs: { + "r2-data-catalog_catalog-maintenance-state": r2_data_catalog_catalog_maintenance_state, + "r2-data-catalog_catalog-maintenance-update-request": r2_data_catalog_catalog_maintenance_update_request, + "r2-data-catalog_catalog-target-file-size": r2_data_catalog_catalog_target_file_size, + "r2-data-catalog_compaction-update-params": r2_data_catalog_compaction_update_params, + "r2-data-catalog_snapshot-expiration-update-params": r2_data_catalog_snapshot_expiration_update_params, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update catalog maintenance configuration" + }, + method: "POST", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/maintenance-configs", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/maintenance-configs`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/basinCatalog/namespaces/tables/maintenanceConfigs/tools.ts b/src/generated/forge-mcp/basinCatalog/namespaces/tables/maintenanceConfigs/tools.ts new file mode 100644 index 00000000..e59be31d --- /dev/null +++ b/src/generated/forge-mcp/basinCatalog/namespaces/tables/maintenanceConfigs/tools.ts @@ -0,0 +1,187 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; +import { + r2_data_catalog_catalog_maintenance_state, + r2_data_catalog_catalog_target_file_size, + r2_data_catalog_queue_maintenance_request, + r2_data_catalog_snapshot_expiration_update_params, + r2_data_catalog_table_compaction_update_params, + r2_data_catalog_table_maintenance_update_request, +} from "../../../../schemas.js"; + +/** + * The tools of `basin_catalog.namespaces.tables.maintenance_configs`. + */ +export const tools: readonly Tool[] = [ + { + name: "basin_catalog_namespaces_tables_maintenance_configs_get", + title: "Get table maintenance configuration", + description: "Retrieve the maintenance configuration for a specific table,\nincluding compaction settings.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + }, + "namespace": { + "description": "The namespace identifier (use %1F as separator for nested namespaces).", + "type": "string" + }, + "table_name": { + "description": "The table name.", + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name", + "namespace", + "table_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get table maintenance configuration" + }, + method: "GET", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/namespaces/{namespace}/tables/{table_name}/maintenance-configs", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write", + "Workers R2 Data Catalog Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/namespaces/${pathParam(args, "namespace")}/tables/${pathParam(args, "table_name")}/maintenance-configs`, + }), + }, + { + name: "basin_catalog_namespaces_tables_maintenance_configs_queue", + title: "Queue table maintenance", + description: "Queue maintenance for normal polling. This request does not start a run.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Use this to identify the account.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/r2-data-catalog_queue-maintenance-request" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + }, + "configuration_type": { + "enum": [ + "compaction", + "snapshot_expiration" + ], + "type": "string" + }, + "namespace": { + "type": "string" + }, + "table_name": { + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name", + "namespace", + "table_name", + "configuration_type", + "body" + ], + $defs: { + "r2-data-catalog_queue-maintenance-request": r2_data_catalog_queue_maintenance_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Queue table maintenance" + }, + method: "POST", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/namespaces/{namespace}/tables/{table_name}/maintenance-configs/{configuration_type}/queue", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/namespaces/${pathParam(args, "namespace")}/tables/${pathParam(args, "table_name")}/maintenance-configs/${pathParam(args, "configuration_type")}/queue`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "basin_catalog_namespaces_tables_maintenance_configs_update", + title: "Update table maintenance configuration", + description: "Update the maintenance configuration for a specific table. This allows you to\nenable or disable compaction and adjust target file sizes for optimization.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "body": { + "$ref": "#/$defs/r2-data-catalog_table-maintenance-update-request" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + }, + "namespace": { + "description": "The namespace identifier (use %1F as separator for nested namespaces).", + "type": "string" + }, + "table_name": { + "description": "The table name.", + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name", + "namespace", + "table_name", + "body" + ], + $defs: { + "r2-data-catalog_catalog-maintenance-state": r2_data_catalog_catalog_maintenance_state, + "r2-data-catalog_catalog-target-file-size": r2_data_catalog_catalog_target_file_size, + "r2-data-catalog_snapshot-expiration-update-params": r2_data_catalog_snapshot_expiration_update_params, + "r2-data-catalog_table-compaction-update-params": r2_data_catalog_table_compaction_update_params, + "r2-data-catalog_table-maintenance-update-request": r2_data_catalog_table_maintenance_update_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update table maintenance configuration" + }, + method: "POST", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/namespaces/{namespace}/tables/{table_name}/maintenance-configs", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/namespaces/${pathParam(args, "namespace")}/tables/${pathParam(args, "table_name")}/maintenance-configs`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/basinCatalog/namespaces/tables/maintenanceRuns/tools.ts b/src/generated/forge-mcp/basinCatalog/namespaces/tables/maintenanceRuns/tools.ts new file mode 100644 index 00000000..e16a7ba5 --- /dev/null +++ b/src/generated/forge-mcp/basinCatalog/namespaces/tables/maintenanceRuns/tools.ts @@ -0,0 +1,62 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../../_/index.js"; + +/** + * The tools of `basin_catalog.namespaces.tables.maintenance_runs`. + */ +export const tools: readonly Tool[] = [ + { + name: "basin_catalog_namespaces_tables_maintenance_runs_list", + title: "List table maintenance runs", + description: "Retrieves recent table maintenance runs for the current table.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Use this to identify the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + }, + "namespace": { + "type": "string" + }, + "page_size": { + "type": "integer" + }, + "page_token": { + "type": "string" + }, + "table_name": { + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name", + "namespace", + "table_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List table maintenance runs" + }, + method: "GET", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/namespaces/{namespace}/tables/{table_name}/maintenance-runs", + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/namespaces/${pathParam(args, "namespace")}/tables/${pathParam(args, "table_name")}/maintenance-runs`, + query: [ + ["page_size", args["page_size"], true], + ["page_token", args["page_token"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/basinCatalog/namespaces/tables/tools.ts b/src/generated/forge-mcp/basinCatalog/namespaces/tables/tools.ts new file mode 100644 index 00000000..57fcd74d --- /dev/null +++ b/src/generated/forge-mcp/basinCatalog/namespaces/tables/tools.ts @@ -0,0 +1,130 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `basin_catalog.namespaces.tables`. + */ +export const tools: readonly Tool[] = [ + { + name: "basin_catalog_namespaces_tables_get", + title: "Get table details", + description: "Returns full Apache Iceberg metadata for a single table: schema,\npartition specs, sort orders, properties, and recent snapshot history.\nDesigned for catalog introspection UIs that need per-table details\nwithout holding R2 credentials.\n\nThe `metadata.snapshots`, `metadata.snapshot-log`, and\n`metadata.metadata-log` arrays are pruned to the most recent 10\nentries by `timestamp-ms`. Use `total_snapshots` and\n`returned_snapshots` to surface the truncation to end users.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + }, + "namespace": { + "description": "The namespace identifier.\nFor nested namespaces, use %1F as separator (e.g., \"bronze%1Fanalytics\").\n", + "type": "string" + }, + "table_name": { + "description": "The table name within the given namespace.", + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name", + "namespace", + "table_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get table details" + }, + method: "GET", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/namespaces/{namespace}/tables/{table_name}", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write", + "Workers R2 Data Catalog Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/namespaces/${pathParam(args, "namespace")}/tables/${pathParam(args, "table_name")}`, + }), + }, + { + name: "basin_catalog_namespaces_tables_list", + title: "List tables in namespace", + description: "Returns a list of tables in the specified namespace within a Basin Catalog.\nSupports pagination for efficient traversal of large table collections.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + }, + "namespace": { + "description": "The namespace identifier.\nFor nested namespaces, use %1F as separator (e.g., \"bronze%1Fanalytics\").\n", + "type": "string" + }, + "page_size": { + "default": 100, + "description": "Maximum number of tables to return per page.\nDefaults to 100, maximum 1000.\n", + "type": "integer" + }, + "page_token": { + "description": "Opaque pagination token from a previous response.\nUse this to fetch the next page of results.\n", + "type": "string" + }, + "return_details": { + "default": false, + "description": "Whether to include additional metadata (timestamps, locations).\nWhen true, response includes created_at, updated_at, metadata_locations, and locations arrays.\n", + "type": "boolean" + }, + "return_uuids": { + "default": false, + "description": "Whether to include table UUIDs in the response.\nSet to true to receive the table_uuids array.\n", + "type": "boolean" + } + }, + required: [ + "account_id", + "bucket_name", + "namespace" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List tables in namespace" + }, + method: "GET", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/namespaces/{namespace}/tables", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write", + "Workers R2 Data Catalog Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/namespaces/${pathParam(args, "namespace")}/tables`, + query: [ + ["page_token", args["page_token"], true], + ["page_size", args["page_size"], true], + ["return_uuids", args["return_uuids"], true], + ["return_details", args["return_details"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/basinCatalog/namespaces/tools.ts b/src/generated/forge-mcp/basinCatalog/namespaces/tools.ts new file mode 100644 index 00000000..6473c337 --- /dev/null +++ b/src/generated/forge-mcp/basinCatalog/namespaces/tools.ts @@ -0,0 +1,80 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `basin_catalog.namespaces`. + */ +export const tools: readonly Tool[] = [ + { + name: "basin_catalog_namespaces_list", + title: "List namespaces in catalog", + description: "Returns a list of namespaces in the specified Basin Catalog.\nSupports hierarchical filtering and pagination for efficient traversal\nof large namespace hierarchies.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + }, + "page_size": { + "default": 100, + "description": "Maximum number of namespaces to return per page.\nDefaults to 100, maximum 1000.\n", + "type": "integer" + }, + "page_token": { + "description": "Opaque pagination token from a previous response.\nUse this to fetch the next page of results.\n", + "type": "string" + }, + "parent": { + "description": "Parent namespace to filter by. Only returns direct children of this namespace.\nFor nested namespaces, use %1F as separator (e.g., \"bronze%1Fanalytics\").\nOmit this parameter to list top-level namespaces.\n", + "type": "string" + }, + "return_details": { + "default": false, + "description": "Whether to include additional metadata (timestamps).\nWhen true, response includes created_at and updated_at arrays.\n", + "type": "boolean" + }, + "return_uuids": { + "default": false, + "description": "Whether to include namespace UUIDs in the response.\nSet to true to receive the namespace_uuids array.\n", + "type": "boolean" + } + }, + required: [ + "account_id", + "bucket_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List namespaces in catalog" + }, + method: "GET", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/namespaces", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write", + "Workers R2 Data Catalog Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/namespaces`, + query: [ + ["page_token", args["page_token"], true], + ["page_size", args["page_size"], true], + ["parent", args["parent"], true], + ["return_uuids", args["return_uuids"], true], + ["return_details", args["return_details"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/basinCatalog/tools.ts b/src/generated/forge-mcp/basinCatalog/tools.ts new file mode 100644 index 00000000..5a2656ec --- /dev/null +++ b/src/generated/forge-mcp/basinCatalog/tools.ts @@ -0,0 +1,210 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; + +/** + * The tools of `basin_catalog`. + */ +export const tools: readonly Tool[] = [ + { + name: "basin_catalog_delete", + title: "Delete Basin Catalog metadata", + description: "Removes the catalog from the control plane without deleting R2 bucket objects.\nSet force=true to remove catalog namespaces, tables, views, and maintenance\nmetadata. Force deletion is limited to a configured catalog object count.\n\nConfirm with the user before calling this tool. This removes catalog metadata. R2 bucket objects are retained.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Use this to identify the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + }, + "cascade": { + "default": false, + "description": "Remove child metadata before deleting the catalog.", + "type": "boolean" + } + }, + required: [ + "account_id", + "bucket_name" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Basin Catalog metadata" + }, + method: "POST", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/delete", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/delete`, + query: [ + ["force", args["cascade"], true], + ], + }), + }, + { + name: "basin_catalog_disable", + title: "Disable Basin Catalog", + description: "Disable an R2 bucket as a catalog. This operation deactivates the catalog\nbut preserves existing metadata and data files. The catalog can be\nre-enabled later.\n\nConfirm with the user before calling this tool. This operation turns off the data catalog for the bucket. Existing namespace or table state remains, but writes stop.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name to disable as catalog.", + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Disable Basin Catalog" + }, + method: "POST", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/disable", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/disable`, + }), + }, + { + name: "basin_catalog_enable", + title: "Enable R2 bucket as a catalog", + description: "Enable an R2 bucket as an Apache Iceberg catalog. This operation creates\nthe necessary catalog infrastructure and activates the bucket for storing\nIceberg metadata and data files.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name to enable as catalog.", + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Enable R2 bucket as a catalog" + }, + method: "POST", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}/enable", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}/enable`, + }), + }, + { + name: "basin_catalog_get", + title: "Get Basin Catalog details", + description: "Retrieve detailed information about a specific Basin Catalog by bucket name.\nReturns catalog status, maintenance configuration, and credential status.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + }, + "bucket_name": { + "description": "Specifies the R2 bucket name.", + "type": "string" + } + }, + required: [ + "account_id", + "bucket_name" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Basin Catalog details" + }, + method: "GET", + path: "/accounts/{account_id}/basin-catalog/{bucket_name}", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write", + "Workers R2 Data Catalog Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog/${pathParam(args, "bucket_name")}`, + }), + }, + { + name: "basin_catalog_list", + title: "List Basin Catalogs", + description: "Returns a list of R2 buckets that have been enabled as Apache Iceberg catalogs\nfor the specified account. Each catalog represents an R2 bucket configured\nto store Iceberg metadata and data files.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifies the account.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Basin Catalogs" + }, + method: "GET", + path: "/accounts/{account_id}/basin-catalog", + extensions: { + "x-api-token-group": [ + "Workers R2 Data Catalog Write", + "Workers R2 Data Catalog Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/basin-catalog`, + }), + }, +]; diff --git a/src/generated/forge-mcp/billing/addresses/schemas.ts b/src/generated/forge-mcp/billing/addresses/schemas.ts new file mode 100644 index 00000000..dd28743a --- /dev/null +++ b/src/generated/forge-mcp/billing/addresses/schemas.ts @@ -0,0 +1,37 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `bill-subs-api_address_validation_request`. + */ +export const bill_subs_api_address_validation_request: JsonSchema = { + "properties": { + "address": { + "description": "Address line 1.", + "type": "string" + }, + "address2": { + "description": "Address line 2.", + "type": "string" + }, + "city": { + "description": "City.", + "type": "string" + }, + "country": { + "description": "Country code.", + "type": "string" + }, + "state": { + "description": "State or province.", + "type": "string" + }, + "zipcode": { + "description": "Postal or zip code.", + "type": "string" + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/billing/addresses/tools.ts b/src/generated/forge-mcp/billing/addresses/tools.ts new file mode 100644 index 00000000..c8e2759f --- /dev/null +++ b/src/generated/forge-mcp/billing/addresses/tools.ts @@ -0,0 +1,51 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { Tool } from "../../_/index.js"; +import { bill_subs_api_address_validation_request } from "./schemas.js"; + +/** + * The tools of `billing.addresses`. + */ +export const tools: readonly Tool[] = [ + { + name: "billing_addresses_validate", + title: "Validate Billing Address", + description: "Validates a billing address and returns validated address suggestions. Authentication is not enforced to support pre-signup address validation flows, so credentials are accepted but not required.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/bill-subs-api_address_validation_request" + } + }, + required: [ + "body" + ], + $defs: { + "bill-subs-api_address_validation_request": bill_subs_api_address_validation_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Validate Billing Address" + }, + method: "POST", + path: "/billing/address-validation", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/billing/address-validation`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/billing/profiles/schemas.ts b/src/generated/forge-mcp/billing/profiles/schemas.ts new file mode 100644 index 00000000..494e02b0 --- /dev/null +++ b/src/generated/forge-mcp/billing/profiles/schemas.ts @@ -0,0 +1,90 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `bill-subs-api_billing_profile_request`. + */ +export const bill_subs_api_billing_profile_request: JsonSchema = { + "description": "Request body for creating or updating a billing profile.", + "properties": { + "address": { + "description": "Street address line 1.", + "type": "string" + }, + "address2": { + "description": "Street address line 2 (apt, suite, etc.).", + "type": "string" + }, + "billing_email": { + "description": "Primary billing email address.", + "type": "string" + }, + "buying_rate_plan": { + "description": "Rate plan being purchased right after profile setup.", + "type": "string" + }, + "captcha_challenge_jwt": { + "description": "Captcha challenge JWT issued during onboarding.", + "type": "string" + }, + "cf_turnstile_response": { + "description": "Cloudflare Turnstile response.", + "type": "string" + }, + "city": { + "description": "City on the billing profile.", + "type": "string" + }, + "company": { + "description": "Company name on the billing profile.", + "type": "string" + }, + "country": { + "description": "ISO 3166-1 alpha-2 country code.", + "type": "string" + }, + "first_name": { + "description": "First name on the billing profile.", + "type": "string" + }, + "h_captcha_response": { + "description": "hCaptcha response.", + "type": "string" + }, + "last_name": { + "description": "Last name on the billing profile.", + "type": "string" + }, + "preferred_locale": { + "description": "Preferred locale for invoice rendering (BCP 47).", + "type": "string" + }, + "secondary_billing_email": { + "description": "Secondary billing email address for CC on invoices.", + "type": "string" + }, + "state": { + "description": "State or region on the billing profile.", + "type": "string" + }, + "tax_id_type": { + "description": "Type of tax ID provided.", + "type": "string" + }, + "telephone": { + "description": "Contact phone number.", + "type": "string" + }, + "vat": { + "description": "VAT identifier.", + "type": "string" + }, + "zipcode": { + "description": "ZIP or postal code.", + "type": "string" + } + }, + "type": "object" +}; diff --git a/src/generated/forge-mcp/billing/profiles/tools.ts b/src/generated/forge-mcp/billing/profiles/tools.ts new file mode 100644 index 00000000..3b80207e --- /dev/null +++ b/src/generated/forge-mcp/billing/profiles/tools.ts @@ -0,0 +1,346 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { bill_subs_api_billing_profile_request } from "./schemas.js"; + +/** + * The tools of `billing.profiles`. + */ +export const tools: readonly Tool[] = [ + { + name: "billing_profiles_create", + title: "Create Billing Profile", + description: "Creates a billing profile for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "$ref": "#/$defs/bill-subs-api_billing_profile_request" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "bill-subs-api_billing_profile_request": bill_subs_api_billing_profile_request, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Billing Profile" + }, + method: "POST", + path: "/accounts/{account_id}/billing/profile", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read", + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + }, + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/profile`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "billing_profiles_create_payment_intent", + title: "Create Payment Intent for Billing Profile", + description: "Creates a Stripe payment intent for adding or updating a payment method on the account's billing profile. Returns a client secret for frontend payment method collection.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create Payment Intent for Billing Profile" + }, + method: "POST", + path: "/accounts/{account_id}/billing/profile/payment-method", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/profile/payment-method`, + }), + }, + { + name: "billing_profiles_delete", + title: "Delete Billing Profile", + description: "Deletes the billing profile for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete Billing Profile" + }, + method: "DELETE", + path: "/accounts/{account_id}/billing/profile", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/profile`, + }), + }, + { + name: "billing_profiles_get", + title: "Get Billing Profile", + description: "Gets the current billing profile for the account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Billing Profile" + }, + method: "GET", + path: "/accounts/{account_id}/billing/profile", + extensions: { + "x-api-token-group": [ + "Billing Write", + "Billing Read" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read" + ], + "x-fern-enum": { + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/profile`, + }), + }, + { + name: "billing_profiles_update", + title: "Update Billing Profile", + description: "Updates the billing profile for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "$ref": "#/$defs/bill-subs-api_billing_profile_request" + } + }, + required: [ + "account_id", + "body" + ], + $defs: { + "bill-subs-api_billing_profile_request": bill_subs_api_billing_profile_request, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Billing Profile" + }, + method: "PUT", + path: "/accounts/{account_id}/billing/profile", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read", + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + }, + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/profile`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "billing_profiles_update_email", + title: "Update Billing Email", + description: "Updates the billing email addresses and preferred locale for an account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier", + "type": "string" + }, + "body": { + "properties": { + "billing_email": { + "type": "string" + }, + "preferred_locale": { + "type": "string" + }, + "secondary_billing_email": { + "type": "string" + } + }, + "type": "object" + } + }, + required: [ + "account_id", + "body" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Billing Email" + }, + method: "PATCH", + path: "/accounts/{account_id}/billing/profile", + extensions: { + "x-api-token-group": [ + "Billing Write" + ], + "x-cfPermissionsRequired": { + "enum": [ + "#billing:read", + "#billing:edit" + ], + "x-fern-enum": { + "#billing:edit": { + "name": "billing_edit" + }, + "#billing:read": { + "name": "billing_read" + } + } + }, + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/profile`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/billing/ratePlans/tools.ts b/src/generated/forge-mcp/billing/ratePlans/tools.ts new file mode 100644 index 00000000..0bae6e2c --- /dev/null +++ b/src/generated/forge-mcp/billing/ratePlans/tools.ts @@ -0,0 +1,47 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `billing.rate_plans`. + */ +export const tools: readonly Tool[] = [ + { + name: "billing_rate_plans_get", + title: "Get Rate Plan by Public Key", + description: "Gets a rate plan's details by its public key (e.g., 'teams_free', 'cf_pro_20_20'). This is a public catalog endpoint, so authentication is not enforced and credentials are accepted but not required.", + inputSchema: { + type: "object", + properties: { + "public_key": { + "description": "The public key identifier for the rate plan.", + "type": "string" + } + }, + required: [ + "public_key" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Rate Plan by Public Key" + }, + method: "GET", + path: "/billing/rate_plans/{public_key}", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/billing/rate_plans/${pathParam(args, "public_key")}`, + }), + }, +]; diff --git a/src/generated/forge-mcp/billing/usage/schemas.ts b/src/generated/forge-mcp/billing/usage/schemas.ts new file mode 100644 index 00000000..39cd1649 --- /dev/null +++ b/src/generated/forge-mcp/billing/usage/schemas.ts @@ -0,0 +1,155 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `billable-usage-api_v2_filter_by`. + */ +export const billable_usage_api_v2_filter_by: JsonSchema = { + "description": "Usage filters. Filters of different kinds are combined with AND, so a record must match every filter present to be returned.", + "properties": { + "BillableMetricIds": { + "description": "Restrict results to rows whose `x_BillableMetricId` matches one of these billable metric ids (e.g. `workers_standard_requests`). Values must be unique.", + "items": { + "type": "string" + }, + "maxItems": 20, + "type": "array" + }, + "ProductFamilyIds": { + "description": "Restrict results to billable metrics belonging to these product families. Values must be unique UUIDs.", + "items": { + "format": "uuid", + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "Tags": { + "description": "Restrict results by resource tags. Filters for different keys are combined with AND, while values within one filter are combined with OR. Keys must be unique and are case-sensitive.", + "items": { + "$ref": "#/$defs/billable-usage-api_v2_tag_filter" + }, + "maxItems": 10, + "type": "array" + } + }, + "type": "object" +}; + +/** + * The schema of `billable-usage-api_v2_group_by`. + */ +export const billable_usage_api_v2_group_by: JsonSchema = { + "description": "A definition used to split result rows. TAG groups by a case-sensitive resource-tag key. DIMENSION groups by a usage dimension key — account_id, zone_id and region are the documented keys, and any other dimension key carried by the usage data is accepted and returned under that same key.", + "properties": { + "Key": { + "description": "Case-sensitive resource-tag key (for TAG) or dimension key (for DIMENSION), e.g. team, region, account_id or zone_id.", + "type": "string" + }, + "Type": { + "description": "Group category.", + "enum": [ + "TAG", + "DIMENSION" + ], + "type": "string" + } + }, + "required": [ + "Key", + "Type" + ], + "type": "object" +}; + +/** + * The schema of `billable-usage-api_v2_tag_filter`. + */ +export const billable_usage_api_v2_tag_filter: JsonSchema = { + "description": "Values accepted for one resource-tag key.", + "properties": { + "Key": { + "description": "Case-sensitive resource-tag key.", + "type": "string" + }, + "Values": { + "description": "Tag values to match. Values are combined with OR and must be unique. An empty string matches a key-only tag.", + "items": { + "type": "string" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "Key", + "Values" + ], + "type": "object" +}; + +/** + * The schema of `billable-usage-api_v2_time_period`. + */ +export const billable_usage_api_v2_time_period: JsonSchema = { + "description": "Charge period to query, i.e. when consumption happened, not when it was billed. `From` is inclusive and `To` is exclusive. `From` and `To` must be supplied together; supplying one without the other is an error. When both are omitted the range defaults to the start of the current month through today.", + "properties": { + "From": { + "description": "Start of the range (ISO 8601). Required if `To` is set.", + "format": "date-time", + "type": "string" + }, + "To": { + "description": "End of the range (ISO 8601). Required if `From` is set. Must be after `From` and no more than 31 days after it.", + "format": "date-time", + "type": "string" + } + }, + "type": "object" +}; + +/** + * The schema of `billable-usage-api_v2_usage_query`. + */ +export const billable_usage_api_v2_usage_query: JsonSchema = { + "description": "Filter criteria for a usage query. Every field is optional; an empty object is equivalent to omitting the body entirely. Unknown fields are rejected.", + "properties": { + "FilterBy": { + "$ref": "#/$defs/billable-usage-api_v2_filter_by", + "description": "Usage filters. Filters of different kinds are combined with AND, so a record must match every filter present to be returned." + }, + "GroupBy": { + "description": "Grouping definitions used to split result rows. At most two unique keys may be supplied.", + "items": { + "$ref": "#/$defs/billable-usage-api_v2_group_by" + }, + "maxItems": 2, + "type": "array" + }, + "Metric": { + "default": "usage", + "description": "Type of cost/usage records to retrieve. `usage` returns unrated usage quantities. `cost` returns rated usage with cost and pricing fields; it is available only on `POST` account usage and only when the underlying usage data source is ClickHouse (other sources return an empty result set). Requests that combine `cost` with `GroupBy` or `FilterBy.Tags` return HTTP 400. Unrelated to `FilterBy.BillableMetricIds`. Defaults to `usage` when omitted.", + "enum": [ + "usage", + "cost" + ], + "type": "string" + }, + "TimePeriod": { + "$ref": "#/$defs/billable-usage-api_v2_time_period", + "description": "Charge period to query, i.e. when consumption happened, not when it was billed. `From` is inclusive and `To` is exclusive. `From` and `To` must be supplied together; supplying one without the other is an error. When both are omitted the range defaults to the start of the current month through today." + } + }, + "type": "object" +}; + +/** + * The schema of `usage-analytics_identifier`. + */ +export const usage_analytics_identifier: JsonSchema = { + "description": "Cloudflare resource identifier.", + "type": "string" +}; diff --git a/src/generated/forge-mcp/billing/usage/tools.ts b/src/generated/forge-mcp/billing/usage/tools.ts new file mode 100644 index 00000000..ba0c8fc5 --- /dev/null +++ b/src/generated/forge-mcp/billing/usage/tools.ts @@ -0,0 +1,351 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { billable_usage_api_identifier } from "../../schemas.js"; +import { + billable_usage_api_v2_filter_by, + billable_usage_api_v2_group_by, + billable_usage_api_v2_tag_filter, + billable_usage_api_v2_time_period, + billable_usage_api_v2_usage_query, + usage_analytics_identifier, +} from "./schemas.js"; + +/** + * The tools of `billing.usage`. + */ +export const tools: readonly Tool[] = [ + { + name: "billing_usage_get", + title: "Get account billing usage", + description: "Retrieve billing usage analytics for an account. Returns time-series data for all billable product metrics including Stream, Media (Images), Rate Limiting, Load Balancing, Argo, Workers, Workers KV, Image Resizing, and Spectrum.\n\nThis method is deprecated.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/usage-analytics_identifier", + "description": "Standard Cloudflare hex account identifier. The API gateway translates this to an internal numeric ID before forwarding to the backend service.\n" + }, + "filters": { + "description": "Filter expressions to apply to the query. Format: field==value. Multiple filters can be combined.\n", + "type": "string" + }, + "limit": { + "default": 100, + "description": "Maximum number of data points to return. The actual number of results depends on the interaction between the time range (since/until) and time_delta granularity. Results are truncated to this limit without error if the time range produces more data points than the limit allows.\n", + "type": "integer" + }, + "metrics": { + "description": "Comma-separated list of metrics to include in the response. Available metrics depend on the endpoint. Billing usage supports: streamMinutesViewed, rateLimitingRequestsAllowed, loadBalancingQueries, argoAcceleratedBytes, workersRequests, workersKVReads, imageResizingRequests, spectrumBytesTransferred, mediaUniqueTransformations. Stream/media usage supports: streamMinutesViewed.\n", + "type": "string" + }, + "since": { + "description": "Start of the time range for the query (inclusive). ISO 8601 timestamp. Defaults to 6 hours before the current time.\n", + "format": "date-time", + "type": "string" + }, + "time_delta": { + "default": "hour", + "description": "Time unit to aggregate usage observations into. Data retention is approximately 18 months. The effective number of data points returned depends on the time range and granularity selected. For example, requesting hourly granularity over 18 months could produce up to ~13,000 data points; use the limit parameter to cap results and be aware that responses may be truncated.\n", + "enum": [ + "hour", + "day", + "week", + "month", + "quarter", + "year" + ], + "type": "string" + }, + "until": { + "description": "End of the time range for the query (inclusive). ISO 8601 timestamp. Defaults to the current time.\n", + "format": "date-time", + "type": "string" + } + }, + required: [ + "account_id" + ], + $defs: { + "usage-analytics_identifier": usage_analytics_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get account billing usage" + }, + method: "GET", + path: "/accounts/{account_id}/billing/usage", + extensions: { + "x-api-token-group": [ + "Billing Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billing/usage`, + query: [ + ["metrics", args["metrics"], true], + ["since", args["since"], true], + ["until", args["until"], true], + ["time_delta", args["time_delta"], true], + ["limit", args["limit"], true], + ["filters", args["filters"], true], + ], + }), + }, + { + name: "billing_usage_get_account_billable_metrics", + title: "List Account Billable Metrics (Version 2, Alpha, Restricted)", + description: "Lists billable metrics available to the account through contracts and\nsubscriptions that overlap the requested period. Results are\ndeduplicated and ordered. If no qualifying contract exists, the\nresult is an empty array.\n\nWhen `from` and `to` are omitted, the period defaults to the start of\nthe current month through today. The maximum date range is 31 days.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/billable-usage-api_identifier", + "description": "Identifies the Cloudflare account." + }, + "from": { + "description": "Start date for the usage query (ISO 8601). Required if `to` is set. When omitted along with `to`, defaults to the start of the current month. Filters by charge period (when consumption happened), not billing period. The maximum date range is 31 days.", + "format": "date", + "type": "string" + }, + "to": { + "description": "End date for the usage query (ISO 8601). Required if `from` is set. When omitted along with `from`, defaults to today. Filters by charge period (when consumption happened), not billing period. The maximum date range is 31 days.", + "format": "date", + "type": "string" + } + }, + required: [ + "account_id" + ], + $defs: { + "billable-usage-api_identifier": billable_usage_api_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List Account Billable Metrics (Version 2, Alpha, Restricted)" + }, + method: "GET", + path: "/accounts/{account_id}/billable/usage/billable-metrics", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billable/usage/billable-metrics`, + query: [ + ["from", args["from"], true], + ["to", args["to"], true], + ], + }), + }, + { + name: "billing_usage_get_account_usage_v2", + title: "Get Account Usage (Version 2, Alpha, Restricted)", + description: "Returns cost and usage data for a single Cloudflare account, aligned\nwith the [FinOps FOCUS v1.3](https://focus.finops.org/focus-specification/v1-3/)\nCost and Usage dataset specification.\n\nEach record represents one billable metric for one account on one day.\nThis includes all metered usage, including usage that falls within\nfree-tier allowances and may result in zero cost.\n\n**Note:** This endpoint serves `usage` records only; cost and pricing\nfields are absent from responses. To retrieve rated costs, use `POST`\non the same path with `Metric: cost`.\n\nWhen `from` and `to` are omitted, defaults to the start of the current\nmonth through today. The maximum date range is 31 days.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/billable-usage-api_identifier", + "description": "Identifies the Cloudflare account." + }, + "from": { + "description": "Start date for the usage query (ISO 8601). Required if `to` is set. When omitted along with `to`, defaults to the start of the current month. Filters by charge period (when consumption happened), not billing period. The maximum date range is 31 days.", + "format": "date", + "type": "string" + }, + "to": { + "description": "End date for the usage query (ISO 8601). Required if `from` is set. When omitted along with `from`, defaults to today. Filters by charge period (when consumption happened), not billing period. The maximum date range is 31 days.", + "format": "date", + "type": "string" + } + }, + required: [ + "account_id" + ], + $defs: { + "billable-usage-api_identifier": billable_usage_api_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Account Usage (Version 2, Alpha, Restricted)" + }, + method: "GET", + path: "/accounts/{account_id}/billable/usage", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billable/usage`, + query: [ + ["from", args["from"], true], + ["to", args["to"], true], + ], + }), + }, + { + name: "billing_usage_get_info_v1", + title: "Get Account Billable Usage Info (Version 1, Alpha)", + description: "Returns high-level usage information for the account, including coverage,\nand subscription metadata.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/billable-usage-api_identifier", + "description": "Identifies the Cloudflare account." + } + }, + required: [ + "account_id" + ], + $defs: { + "billable-usage-api_identifier": billable_usage_api_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Account Billable Usage Info (Version 1, Alpha)" + }, + method: "GET", + path: "/accounts/{account_id}/billable-usage/info", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": false, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billable-usage/info`, + }), + }, + { + name: "billing_usage_get_v1", + title: "Get Account Billable Usage (Version 1, Alpha)", + description: "Returns billable usage data for the account.\nWhen no query parameters are provided, returns usage for the current\nbilling period.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/billable-usage-api_identifier", + "description": "Identifies the Cloudflare account." + }, + "from": { + "description": "Start date for the usage query (ISO 8601). The provided time range must include the subscription billing cycle anchor day, otherwise no usage data is returned. Use the info endpoint to retrieve the subscription anchor day.", + "format": "date", + "type": "string" + }, + "to": { + "description": "End date for the usage query (ISO 8601).", + "format": "date", + "type": "string" + } + }, + required: [ + "account_id" + ], + $defs: { + "billable-usage-api_identifier": billable_usage_api_identifier, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Account Billable Usage (Version 1, Alpha)" + }, + method: "GET", + path: "/accounts/{account_id}/billable-usage", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": false, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billable-usage`, + query: [ + ["from", args["from"], true], + ["to", args["to"], true], + ], + }), + }, + { + name: "billing_usage_query", + title: "Query Account Usage (Version 2, Alpha, Restricted)", + description: "Returns cost and usage data for a single Cloudflare account, aligned\nwith the [FinOps FOCUS v1.3](https://focus.finops.org/focus-specification/v1-3/)\nCost and Usage dataset specification.\n\nThis is the filterable counterpart to `GET` on the same path. It is a\nread-only operation and requires only the `#billing:read` permission;\n`POST` is used so that filter criteria can be supplied in a request body\nrather than in the query string.\n\nEach record represents one billable metric for one account on one day.\nThis includes all metered usage, including usage that falls within\nfree-tier allowances and may result in zero cost.\n\n**Note:** Cost and pricing fields are populated only when `Metric`\nis `cost`; otherwise they are absent from responses.\n\nThe request body is optional. When it is omitted, or when `TimePeriod`\nis omitted, the range defaults to the start of the current month through\ntoday. The maximum date range is 31 days.\n\nFilters of different kinds are combined with AND. Values within one tag\nfilter are combined with OR. Filter values that do not match usage\nproduce an empty result set.\n\nResults can be grouped by up to two groups, in any combination of\ndimension keys and resource-tag keys. Tag groups are returned in the\n`Tags` field. Usage without a requested tag remains in an untagged\ngroup, with that key omitted from `Tags`.\n\nRequests that use tag filtering or tag grouping return HTTP 400 when the\nunderlying usage data source does not support tags.\n\nRequests that use dimension grouping return HTTP 400 when the\nunderlying usage data source does not support dimensions.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "$ref": "#/$defs/billable-usage-api_identifier", + "description": "Identifies the Cloudflare account." + }, + "body": { + "$ref": "#/$defs/billable-usage-api_v2_usage_query" + } + }, + required: [ + "account_id" + ], + $defs: { + "billable-usage-api_identifier": billable_usage_api_identifier, + "billable-usage-api_v2_filter_by": billable_usage_api_v2_filter_by, + "billable-usage-api_v2_group_by": billable_usage_api_v2_group_by, + "billable-usage-api_v2_tag_filter": billable_usage_api_v2_tag_filter, + "billable-usage-api_v2_time_period": billable_usage_api_v2_time_period, + "billable-usage-api_v2_usage_query": billable_usage_api_v2_usage_query, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Query Account Usage (Version 2, Alpha, Restricted)" + }, + method: "POST", + path: "/accounts/{account_id}/billable/usage", + extensions: { + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/billable/usage`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/botManagement/feedback/schemas.ts b/src/generated/forge-mcp/botManagement/feedback/schemas.ts new file mode 100644 index 00000000..e5169490 --- /dev/null +++ b/src/generated/forge-mcp/botManagement/feedback/schemas.ts @@ -0,0 +1,128 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `bot-management_feedback_report`. + */ +export const bot_management_feedback_report: JsonSchema = { + "properties": { + "description": { + "type": "string" + }, + "expression": { + "description": "Wirefilter expression describing the traffic being reported.", + "type": "string" + }, + "first_request_seen_at": { + "format": "date-time", + "type": "string" + }, + "last_request_seen_at": { + "format": "date-time", + "type": "string" + }, + "requests": { + "type": "integer" + }, + "requests_by_attribute": { + "$ref": "#/$defs/bot-management_requests_by_attribute", + "description": "Top attributes contributing to the feedback sample. Keys include topASNs, topCountries, topHosts, topIPs, topJA3Hashes, topJA4s, topPaths, topUserAgents." + }, + "requests_by_score": { + "$ref": "#/$defs/bot-management_requests_by_score", + "description": "Map of bot scores (1-99) to request counts. Sum must equal `requests`." + }, + "requests_by_score_src": { + "$ref": "#/$defs/bot-management_requests_by_score_src", + "description": "Map of score source to request counts. Sum must equal `requests`." + }, + "subtype": { + "type": "string" + }, + "type": { + "$ref": "#/$defs/bot-management_feedback_type", + "description": "Type of feedback report." + } + }, + "required": [ + "description", + "expression", + "first_request_seen_at", + "last_request_seen_at", + "requests", + "requests_by_attribute", + "requests_by_score", + "requests_by_score_src", + "type" + ], + "type": "object" +}; + +/** + * The schema of `bot-management_feedback_type`. + */ +export const bot_management_feedback_type: JsonSchema = { + "description": "Type of feedback report.", + "enum": [ + "false_positive", + "false_negative" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_metric_requests`. + */ +export const bot_management_metric_requests: JsonSchema = { + "properties": { + "metric": { + "type": "string" + }, + "requests": { + "type": "integer" + } + }, + "required": [ + "metric", + "requests" + ], + "type": "object" +}; + +/** + * The schema of `bot-management_requests_by_attribute`. + */ +export const bot_management_requests_by_attribute: JsonSchema = { + "additionalProperties": { + "items": { + "$ref": "#/$defs/bot-management_metric_requests" + }, + "type": "array" + }, + "description": "Top attributes contributing to the feedback sample. Keys include topASNs, topCountries, topHosts, topIPs, topJA3Hashes, topJA4s, topPaths, topUserAgents.", + "type": "object" +}; + +/** + * The schema of `bot-management_requests_by_score`. + */ +export const bot_management_requests_by_score: JsonSchema = { + "additionalProperties": { + "type": "integer" + }, + "description": "Map of bot scores (1-99) to request counts. Sum must equal `requests`.", + "type": "object" +}; + +/** + * The schema of `bot-management_requests_by_score_src`. + */ +export const bot_management_requests_by_score_src: JsonSchema = { + "additionalProperties": { + "type": "integer" + }, + "description": "Map of score source to request counts. Sum must equal `requests`.", + "type": "object" +}; diff --git a/src/generated/forge-mcp/botManagement/feedback/tools.ts b/src/generated/forge-mcp/botManagement/feedback/tools.ts new file mode 100644 index 00000000..737f6415 --- /dev/null +++ b/src/generated/forge-mcp/botManagement/feedback/tools.ts @@ -0,0 +1,117 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { + bot_management_feedback_report, + bot_management_feedback_type, + bot_management_metric_requests, + bot_management_requests_by_attribute, + bot_management_requests_by_score, + bot_management_requests_by_score_src, +} from "./schemas.js"; + +/** + * The tools of `bot_management.feedback`. + */ +export const tools: readonly Tool[] = [ + { + name: "bot_management_feedback_create", + title: "Submit a feedback report", + description: "Submit a feedback report for the specified zone. Use `type` to indicate whether the report is a false positive (good traffic flagged as bot) or a false negative (bot traffic missed). Furthermore, you can also use `expression` as a wirefilter to identify the affected traffic sample.\n\nSee more accepted API fields and expression types at https://developers.cloudflare.com/bots/concepts/feedback-loop/#api-fields and https://developers.cloudflare.com/bots/concepts/feedback-loop/#expression-fields, respectively.", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/bot-management_feedback_report" + }, + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "bot-management_feedback_report": bot_management_feedback_report, + "bot-management_feedback_type": bot_management_feedback_type, + "bot-management_metric_requests": bot_management_metric_requests, + "bot-management_requests_by_attribute": bot_management_requests_by_attribute, + "bot-management_requests_by_score": bot_management_requests_by_score, + "bot-management_requests_by_score_src": bot_management_requests_by_score_src, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Submit a feedback report" + }, + method: "POST", + path: "/zones/{zone_id}/bot_management/feedback", + extensions: { + "x-api-token-group": [ + "Bot Management Feedback Report Write", + "Bot Management Feedback Report Read", + "Bot Management Write", + "Bot Management Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": false, + "pro": false + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/bot_management/feedback`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "bot_management_feedback_list", + title: "List zone feedback reports", + description: "Returns all feedback reports previously submitted for the specified zone. Feedback reports help improve detection by sharing samples of traffic that were misclassified as bots or humans.", + inputSchema: { + type: "object", + properties: { + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List zone feedback reports" + }, + method: "GET", + path: "/zones/{zone_id}/bot_management/feedback", + extensions: { + "x-api-token-group": [ + "Bot Management Feedback Report Write", + "Bot Management Feedback Report Read", + "Bot Management Write", + "Bot Management Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": false, + "pro": false + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/bot_management/feedback`, + }), + }, +]; diff --git a/src/generated/forge-mcp/botManagement/schemas.ts b/src/generated/forge-mcp/botManagement/schemas.ts new file mode 100644 index 00000000..d346ee5d --- /dev/null +++ b/src/generated/forge-mcp/botManagement/schemas.ts @@ -0,0 +1,420 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../_/index.js"; + +/** + * The schema of `bot-management_ai_bots_migration_opt_out`. + */ +export const bot_management_ai_bots_migration_opt_out: JsonSchema = { + "description": "Temporary migration flag tracking zones opted out of AI bots managed-rule updates.", + "type": "boolean" +}; + +/** + * The schema of `bot-management_ai_bots_protection`. + */ +export const bot_management_ai_bots_protection: JsonSchema = { + "description": "Enable rule to block AI Scrapers and Crawlers.", + "enum": [ + "block", + "disabled", + "only_on_ad_pages" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_ai_search`. + */ +export const bot_management_ai_search: JsonSchema = { + "description": "Configure robots.txt policy for AI search bots.", + "enum": [ + "disabled", + "block", + "only_on_ad_pages" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_ai_training`. + */ +export const bot_management_ai_training: JsonSchema = { + "description": "Configure robots.txt policy for AI model training bots.", + "enum": [ + "disabled", + "disallow", + "block", + "only_on_ad_pages" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_ai_user`. + */ +export const bot_management_ai_user: JsonSchema = { + "description": "Configure robots.txt policy for AI assistant and agent bots.", + "enum": [ + "disabled", + "block", + "only_on_ad_pages" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_auto_update_model`. + */ +export const bot_management_auto_update_model: JsonSchema = { + "description": "Automatically update to the newest bot detection models created by Cloudflare as they are released. [Learn more.](https://developers.cloudflare.com/bots/reference/machine-learning-models#model-versions-and-release-notes)", + "type": "boolean" +}; + +/** + * The schema of `bot-management_base_config`. + */ +export const bot_management_base_config: JsonSchema = { + "description": "Shared Config", + "properties": { + "ai_bots_migration_opt_out": { + "$ref": "#/$defs/bot-management_ai_bots_migration_opt_out", + "default": false, + "description": "Temporary migration flag tracking zones opted out of AI bots managed-rule updates." + }, + "ai_bots_protection": { + "$ref": "#/$defs/bot-management_ai_bots_protection", + "description": "Enable rule to block AI Scrapers and Crawlers." + }, + "ai_search": { + "$ref": "#/$defs/bot-management_ai_search", + "description": "Configure robots.txt policy for AI search bots." + }, + "ai_training": { + "$ref": "#/$defs/bot-management_ai_training", + "description": "Configure robots.txt policy for AI model training bots." + }, + "ai_user": { + "$ref": "#/$defs/bot-management_ai_user", + "description": "Configure robots.txt policy for AI assistant and agent bots." + }, + "bot_preference_sync_enabled": { + "$ref": "#/$defs/bot-management_bot_preference_sync_enabled", + "default": false, + "description": "Enable Bot Preference Sync for this zone. When enabled, Cloudflare can serve robots.txt content derived from the zone's AI Search, AI User, and AI Training preferences." + }, + "cf_robots_variant": { + "$ref": "#/$defs/bot-management_cf_robots_variant", + "description": "Specifies the Robots Access Control License variant to use." + }, + "content_bots_protection": { + "$ref": "#/$defs/bot-management_content_bots_protection", + "description": "Enable rule to block content bots. When enabled, blocks automated traffic with low bot scores, excluding safe verified bot categories. Exceptions should be managed via skip rules." + }, + "crawler_protection": { + "$ref": "#/$defs/bot-management_crawler_protection", + "description": "Enable rule to punish AI Scrapers and Crawlers via a link maze." + }, + "enable_js": { + "$ref": "#/$defs/bot-management_enable_js", + "description": "Use lightweight, invisible JavaScript detections to improve Bot Management. [Learn more about JavaScript Detections](https://developers.cloudflare.com/bots/reference/javascript-detections/)." + }, + "is_robots_txt_managed": { + "$ref": "#/$defs/bot-management_is_robots_txt_managed", + "default": false, + "description": "Enable cloudflare managed robots.txt. If an existing robots.txt is detected, then managed robots.txt will be prepended to the existing robots.txt." + }, + "jsd_api_results_enabled": { + "$ref": "#/$defs/bot-management_jsd_api_results_enabled", + "description": "Whether to use JavaScript Detection results submitted through the API for this zone." + } + }, + "type": "object" +}; + +/** + * The schema of `bot-management_bm_cookie_enabled`. + */ +export const bot_management_bm_cookie_enabled: JsonSchema = { + "description": "Indicates that the bot management cookie can be placed on end user devices accessing the site. Defaults to true", + "type": "boolean" +}; + +/** + * The schema of `bot-management_bm_subscription_config`. + */ +export const bot_management_bm_subscription_config: JsonSchema = { + "allOf": [ + { + "$ref": "#/$defs/bot-management_base_config" + }, + { + "properties": { + "auto_update_model": { + "$ref": "#/$defs/bot-management_auto_update_model", + "description": "Automatically update to the newest bot detection models created by Cloudflare as they are released. [Learn more.](https://developers.cloudflare.com/bots/reference/machine-learning-models#model-versions-and-release-notes)" + }, + "bm_cookie_enabled": { + "$ref": "#/$defs/bot-management_bm_cookie_enabled", + "description": "Indicates that the bot management cookie can be placed on end user devices accessing the site. Defaults to true" + }, + "suppress_session_score": { + "$ref": "#/$defs/bot-management_suppress_session_score", + "description": "Whether to disable tracking the highest bot score for a session in the Bot Management cookie." + } + }, + "type": "object" + } + ], + "description": "BM Enterprise Subscription" +}; + +/** + * The schema of `bot-management_bot_fight_mode_config`. + */ +export const bot_management_bot_fight_mode_config: JsonSchema = { + "allOf": [ + { + "$ref": "#/$defs/bot-management_base_config" + }, + { + "properties": { + "fight_mode": { + "$ref": "#/$defs/bot-management_fight_mode", + "description": "Whether to enable Bot Fight Mode." + } + }, + "type": "object" + } + ], + "description": "Bot Fight Mode" +}; + +/** + * The schema of `bot-management_bot_preference_sync_enabled`. + */ +export const bot_management_bot_preference_sync_enabled: JsonSchema = { + "description": "Enable Bot Preference Sync for this zone. When enabled, Cloudflare can serve robots.txt content derived from the zone's AI Search, AI User, and AI Training preferences.", + "type": "boolean" +}; + +/** + * The schema of `bot-management_cf_robots_variant`. + */ +export const bot_management_cf_robots_variant: JsonSchema = { + "description": "Specifies the Robots Access Control License variant to use.", + "enum": [ + "off", + "policy_only" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_config_single`. + */ +export const bot_management_config_single: JsonSchema = { + "oneOf": [ + { + "$ref": "#/$defs/bot-management_bot_fight_mode_config" + }, + { + "$ref": "#/$defs/bot-management_sbfm_definitely_config" + }, + { + "$ref": "#/$defs/bot-management_sbfm_likely_config" + }, + { + "$ref": "#/$defs/bot-management_bm_subscription_config" + } + ] +}; + +/** + * The schema of `bot-management_content_bots_protection`. + */ +export const bot_management_content_bots_protection: JsonSchema = { + "description": "Enable rule to block content bots. When enabled, blocks automated traffic with low bot scores, excluding safe verified bot categories. Exceptions should be managed via skip rules.", + "enum": [ + "block", + "disabled" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_crawler_protection`. + */ +export const bot_management_crawler_protection: JsonSchema = { + "description": "Enable rule to punish AI Scrapers and Crawlers via a link maze.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_enable_js`. + */ +export const bot_management_enable_js: JsonSchema = { + "description": "Use lightweight, invisible JavaScript detections to improve Bot Management. [Learn more about JavaScript Detections](https://developers.cloudflare.com/bots/reference/javascript-detections/).", + "type": "boolean" +}; + +/** + * The schema of `bot-management_fight_mode`. + */ +export const bot_management_fight_mode: JsonSchema = { + "description": "Whether to enable Bot Fight Mode.", + "type": "boolean" +}; + +/** + * The schema of `bot-management_is_robots_txt_managed`. + */ +export const bot_management_is_robots_txt_managed: JsonSchema = { + "description": "Enable cloudflare managed robots.txt. If an existing robots.txt is detected, then managed robots.txt will be prepended to the existing robots.txt.", + "type": "boolean" +}; + +/** + * The schema of `bot-management_jsd_api_results_enabled`. + */ +export const bot_management_jsd_api_results_enabled: JsonSchema = { + "description": "Whether to use JavaScript Detection results submitted through the API for this zone.", + "type": "boolean" +}; + +/** + * The schema of `bot-management_optimize_wordpress`. + */ +export const bot_management_optimize_wordpress: JsonSchema = { + "description": "Whether to optimize Super Bot Fight Mode protections for Wordpress.", + "type": "boolean" +}; + +/** + * The schema of `bot-management_sbfm_definitely_automated`. + */ +export const bot_management_sbfm_definitely_automated: JsonSchema = { + "description": "Super Bot Fight Mode (SBFM) action to take on definitely automated requests.", + "enum": [ + "allow", + "block", + "managed_challenge" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_sbfm_definitely_config`. + */ +export const bot_management_sbfm_definitely_config: JsonSchema = { + "allOf": [ + { + "$ref": "#/$defs/bot-management_base_config" + }, + { + "properties": { + "optimize_wordpress": { + "$ref": "#/$defs/bot-management_optimize_wordpress", + "description": "Whether to optimize Super Bot Fight Mode protections for Wordpress." + }, + "sbfm_definitely_automated": { + "$ref": "#/$defs/bot-management_sbfm_definitely_automated", + "description": "Super Bot Fight Mode (SBFM) action to take on definitely automated requests." + }, + "sbfm_static_resource_protection": { + "$ref": "#/$defs/bot-management_sbfm_static_resource_protection", + "description": "Super Bot Fight Mode (SBFM) to enable static resource protection.\nEnable if static resources on your application need bot protection.\nNote: Static resource protection can also result in legitimate traffic being blocked.\n" + }, + "sbfm_verified_bots": { + "$ref": "#/$defs/bot-management_sbfm_verified_bots", + "description": "Super Bot Fight Mode (SBFM) action to take on verified bots requests." + } + }, + "type": "object" + } + ], + "description": "SBFM Pro Plan" +}; + +/** + * The schema of `bot-management_sbfm_likely_automated`. + */ +export const bot_management_sbfm_likely_automated: JsonSchema = { + "description": "Super Bot Fight Mode (SBFM) action to take on likely automated requests.", + "enum": [ + "allow", + "block", + "managed_challenge" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_sbfm_likely_config`. + */ +export const bot_management_sbfm_likely_config: JsonSchema = { + "allOf": [ + { + "$ref": "#/$defs/bot-management_base_config" + }, + { + "properties": { + "optimize_wordpress": { + "$ref": "#/$defs/bot-management_optimize_wordpress", + "description": "Whether to optimize Super Bot Fight Mode protections for Wordpress." + }, + "sbfm_definitely_automated": { + "$ref": "#/$defs/bot-management_sbfm_definitely_automated", + "description": "Super Bot Fight Mode (SBFM) action to take on definitely automated requests." + }, + "sbfm_likely_automated": { + "$ref": "#/$defs/bot-management_sbfm_likely_automated", + "description": "Super Bot Fight Mode (SBFM) action to take on likely automated requests." + }, + "sbfm_static_resource_protection": { + "$ref": "#/$defs/bot-management_sbfm_static_resource_protection", + "description": "Super Bot Fight Mode (SBFM) to enable static resource protection.\nEnable if static resources on your application need bot protection.\nNote: Static resource protection can also result in legitimate traffic being blocked.\n" + }, + "sbfm_verified_bots": { + "$ref": "#/$defs/bot-management_sbfm_verified_bots", + "description": "Super Bot Fight Mode (SBFM) action to take on verified bots requests." + } + }, + "type": "object" + } + ], + "description": "SBFM Biz Plan" +}; + +/** + * The schema of `bot-management_sbfm_static_resource_protection`. + */ +export const bot_management_sbfm_static_resource_protection: JsonSchema = { + "description": "Super Bot Fight Mode (SBFM) to enable static resource protection.\nEnable if static resources on your application need bot protection.\nNote: Static resource protection can also result in legitimate traffic being blocked.\n", + "type": "boolean" +}; + +/** + * The schema of `bot-management_sbfm_verified_bots`. + */ +export const bot_management_sbfm_verified_bots: JsonSchema = { + "description": "Super Bot Fight Mode (SBFM) action to take on verified bots requests.", + "enum": [ + "allow", + "block" + ], + "type": "string" +}; + +/** + * The schema of `bot-management_suppress_session_score`. + */ +export const bot_management_suppress_session_score: JsonSchema = { + "description": "Whether to disable tracking the highest bot score for a session in the Bot Management cookie.", + "type": "boolean" +}; diff --git a/src/generated/forge-mcp/botManagement/tools.ts b/src/generated/forge-mcp/botManagement/tools.ts new file mode 100644 index 00000000..b3375e86 --- /dev/null +++ b/src/generated/forge-mcp/botManagement/tools.ts @@ -0,0 +1,154 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; +import { + bot_management_ai_bots_migration_opt_out, + bot_management_ai_bots_protection, + bot_management_ai_search, + bot_management_ai_training, + bot_management_ai_user, + bot_management_auto_update_model, + bot_management_base_config, + bot_management_bm_cookie_enabled, + bot_management_bm_subscription_config, + bot_management_bot_fight_mode_config, + bot_management_bot_preference_sync_enabled, + bot_management_cf_robots_variant, + bot_management_config_single, + bot_management_content_bots_protection, + bot_management_crawler_protection, + bot_management_enable_js, + bot_management_fight_mode, + bot_management_is_robots_txt_managed, + bot_management_jsd_api_results_enabled, + bot_management_optimize_wordpress, + bot_management_sbfm_definitely_automated, + bot_management_sbfm_definitely_config, + bot_management_sbfm_likely_automated, + bot_management_sbfm_likely_config, + bot_management_sbfm_static_resource_protection, + bot_management_sbfm_verified_bots, + bot_management_suppress_session_score, +} from "./schemas.js"; + +/** + * The tools of `bot_management`. + */ +export const tools: readonly Tool[] = [ + { + name: "bot_management_get", + title: "Get Zone Bot Management Config", + description: "Retrieve a zone's Bot Management Config", + inputSchema: { + type: "object", + properties: { + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get Zone Bot Management Config" + }, + method: "GET", + path: "/zones/{zone_id}/bot_management", + extensions: { + "x-api-token-group": [ + "Bot Management Write", + "Bot Management Read" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/bot_management`, + }), + }, + { + name: "bot_management_update", + title: "Update Zone Bot Management Config", + description: "Updates the Bot Management configuration for a zone.\n\nThis API is used to update:\n- **Bot Fight Mode**\n- **Super Bot Fight Mode**\n- **Bot Management for Enterprise**\n\nSee [Bot Plans](https://developers.cloudflare.com/bots/plans/) for more information on the different plans\n\\\nIf you recently upgraded or downgraded your plan, refer to the following examples to clean up old configurations.\nCopy and paste the example body to remove old zone configurations based on your current plan.\n#### Clean up configuration for Bot Fight Mode plan\n```json\n{\n \"sbfm_likely_automated\": \"allow\",\n \"sbfm_definitely_automated\": \"allow\",\n \"sbfm_verified_bots\": \"allow\",\n \"sbfm_static_resource_protection\": false,\n \"optimize_wordpress\": false,\n \"suppress_session_score\": false\n}\n```\n#### Clean up configuration for SBFM Pro plan\n```json\n{\n \"sbfm_likely_automated\": \"allow\",\n \"fight_mode\": false\n}\n```\n#### Clean up configuration for SBFM Biz plan\n```json\n{\n \"fight_mode\": false\n}\n```\n#### Clean up configuration for BM Enterprise Subscription plan\nIt is strongly recommended that you ensure you have [custom rules](https://developers.cloudflare.com/waf/custom-rules/) in place to protect your zone before disabling the SBFM rules. Without these protections, your zone is vulnerable to attacks.\n```json\n{\n \"sbfm_likely_automated\": \"allow\",\n \"sbfm_definitely_automated\": \"allow\",\n \"sbfm_verified_bots\": \"allow\",\n \"sbfm_static_resource_protection\": false,\n \"optimize_wordpress\": false,\n \"fight_mode\": false\n}\n```", + inputSchema: { + type: "object", + properties: { + "body": { + "$ref": "#/$defs/bot-management_config_single" + }, + "zone_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "zone_id", + "body" + ], + $defs: { + "bot-management_ai_bots_migration_opt_out": bot_management_ai_bots_migration_opt_out, + "bot-management_ai_bots_protection": bot_management_ai_bots_protection, + "bot-management_ai_search": bot_management_ai_search, + "bot-management_ai_training": bot_management_ai_training, + "bot-management_ai_user": bot_management_ai_user, + "bot-management_auto_update_model": bot_management_auto_update_model, + "bot-management_base_config": bot_management_base_config, + "bot-management_bm_cookie_enabled": bot_management_bm_cookie_enabled, + "bot-management_bm_subscription_config": bot_management_bm_subscription_config, + "bot-management_bot_fight_mode_config": bot_management_bot_fight_mode_config, + "bot-management_bot_preference_sync_enabled": bot_management_bot_preference_sync_enabled, + "bot-management_cf_robots_variant": bot_management_cf_robots_variant, + "bot-management_config_single": bot_management_config_single, + "bot-management_content_bots_protection": bot_management_content_bots_protection, + "bot-management_crawler_protection": bot_management_crawler_protection, + "bot-management_enable_js": bot_management_enable_js, + "bot-management_fight_mode": bot_management_fight_mode, + "bot-management_is_robots_txt_managed": bot_management_is_robots_txt_managed, + "bot-management_jsd_api_results_enabled": bot_management_jsd_api_results_enabled, + "bot-management_optimize_wordpress": bot_management_optimize_wordpress, + "bot-management_sbfm_definitely_automated": bot_management_sbfm_definitely_automated, + "bot-management_sbfm_definitely_config": bot_management_sbfm_definitely_config, + "bot-management_sbfm_likely_automated": bot_management_sbfm_likely_automated, + "bot-management_sbfm_likely_config": bot_management_sbfm_likely_config, + "bot-management_sbfm_static_resource_protection": bot_management_sbfm_static_resource_protection, + "bot-management_sbfm_verified_bots": bot_management_sbfm_verified_bots, + "bot-management_suppress_session_score": bot_management_suppress_session_score, + }, + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Update Zone Bot Management Config" + }, + method: "PUT", + path: "/zones/{zone_id}/bot_management", + extensions: { + "x-api-token-group": [ + "Bot Management Write" + ], + "x-cfPlanAvailability": { + "business": true, + "enterprise": true, + "free": true, + "pro": true + } + }, + request: (args) => ({ + path: `/zones/${pathParam(args, "zone_id")}/bot_management`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/botnetFeed/asn/schemas.ts b/src/generated/forge-mcp/botnetFeed/asn/schemas.ts new file mode 100644 index 00000000..40c930f0 --- /dev/null +++ b/src/generated/forge-mcp/botnetFeed/asn/schemas.ts @@ -0,0 +1,12 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import type { JsonSchema } from "../../_/index.js"; + +/** + * The schema of `dos_timestamp`. + */ +export const dos_timestamp: JsonSchema = { + "format": "date-time", + "type": "string" +}; diff --git a/src/generated/forge-mcp/botnetFeed/asn/tools.ts b/src/generated/forge-mcp/botnetFeed/asn/tools.ts new file mode 100644 index 00000000..1392f0ce --- /dev/null +++ b/src/generated/forge-mcp/botnetFeed/asn/tools.ts @@ -0,0 +1,98 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; +import { dos_timestamp } from "./schemas.js"; + +/** + * The tools of `botnet_feed.asn`. + */ +export const tools: readonly Tool[] = [ + { + name: "botnet_feed_asn_day_report", + title: "Get daily report", + description: "Gets all the data the botnet tracking database has for a given ASN registered to user account for given date. If no date is given, it will return results for the previous day.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier.", + "type": "string" + }, + "asn_id": { + "type": "string" + }, + "date": { + "$ref": "#/$defs/dos_timestamp" + } + }, + required: [ + "account_id", + "asn_id" + ], + $defs: { + "dos_timestamp": dos_timestamp, + }, + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get daily report" + }, + method: "GET", + path: "/accounts/{account_id}/botnet_feed/asn/{asn_id}/day_report", + extensions: { + "x-api-token-group": [ + "DDoS Botnet Feed Write", + "DDoS Botnet Feed Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/botnet_feed/asn/${pathParam(args, "asn_id")}/day_report`, + query: [ + ["date", args["date"], true], + ], + }), + }, + { + name: "botnet_feed_asn_full_report", + title: "Get full report", + description: "Gets all the data the botnet threat feed tracking database has for a given ASN registered to user account.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier.", + "type": "string" + }, + "asn_id": { + "type": "string" + } + }, + required: [ + "account_id", + "asn_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get full report" + }, + method: "GET", + path: "/accounts/{account_id}/botnet_feed/asn/{asn_id}/full_report", + extensions: { + "x-api-token-group": [ + "DDoS Botnet Feed Write", + "DDoS Botnet Feed Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/botnet_feed/asn/${pathParam(args, "asn_id")}/full_report`, + }), + }, +]; diff --git a/src/generated/forge-mcp/botnetFeed/configs/asn/tools.ts b/src/generated/forge-mcp/botnetFeed/configs/asn/tools.ts new file mode 100644 index 00000000..1168b068 --- /dev/null +++ b/src/generated/forge-mcp/botnetFeed/configs/asn/tools.ts @@ -0,0 +1,83 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../../_/index.js"; + +/** + * The tools of `botnet_feed.configs.asn`. + */ +export const tools: readonly Tool[] = [ + { + name: "botnet_feed_configs_asn_delete", + title: "Delete an ASN", + description: "Delete an ASN from botnet threat feed for a given user.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier.", + "type": "string" + }, + "asn_id": { + "type": "string" + } + }, + required: [ + "account_id", + "asn_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete an ASN" + }, + method: "DELETE", + path: "/accounts/{account_id}/botnet_feed/configs/asn/{asn_id}", + extensions: { + "x-api-token-group": [ + "DDoS Botnet Feed Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/botnet_feed/configs/asn/${pathParam(args, "asn_id")}`, + }), + }, + { + name: "botnet_feed_configs_asn_get", + title: "Get list of ASNs", + description: "Gets a list of all ASNs registered for a user for the DDoS Botnet Feed API.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Identifier.", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get list of ASNs" + }, + method: "GET", + path: "/accounts/{account_id}/botnet_feed/configs/asn", + extensions: { + "x-api-token-group": [ + "DDoS Botnet Feed Write", + "DDoS Botnet Feed Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/botnet_feed/configs/asn`, + }), + }, +]; diff --git a/src/generated/forge-mcp/brandProtection/logoMatches/tools.ts b/src/generated/forge-mcp/brandProtection/logoMatches/tools.ts new file mode 100644 index 00000000..84c61f5b --- /dev/null +++ b/src/generated/forge-mcp/brandProtection/logoMatches/tools.ts @@ -0,0 +1,85 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `brand_protection.logo_matches`. + */ +export const tools: readonly Tool[] = [ + { + name: "brand_protection_logo_matches_get", + title: "List logo matches", + description: "Get paginated list of logo matches for a specific brand protection logo query", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "download": { + "type": "string" + }, + "limit": { + "default": "50", + "type": "string" + }, + "offset": { + "default": "0", + "type": "string" + }, + "order": { + "description": "Sort order. Options: 'asc' (ascending) or 'desc' (descending)", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "order_by": { + "description": "Column to sort by. Options: 'matchedAt', 'domain', 'similarityScore', or 'registrar'", + "enum": [ + "matchedAt", + "domain", + "similarityScore", + "registrar" + ], + "type": "string" + }, + "query_id": { + "type": "string" + } + }, + required: [ + "account_id", + "query_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List logo matches" + }, + method: "GET", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/logo/matches", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write", + "Cloudforce One Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/logo/matches`, + query: [ + ["offset", args["offset"], true], + ["limit", args["limit"], true], + ["query_id", args["query_id"], true], + ["download", args["download"], true], + ["orderBy", args["order_by"], true], + ["order", args["order"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/brandProtection/logos/tools.ts b/src/generated/forge-mcp/brandProtection/logos/tools.ts new file mode 100644 index 00000000..e7a8ea7b --- /dev/null +++ b/src/generated/forge-mcp/brandProtection/logos/tools.ts @@ -0,0 +1,154 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `brand_protection.logos`. + */ +export const tools: readonly Tool[] = [ + { + name: "brand_protection_logos_create", + title: "Insert logo query", + description: "Create a new saved brand protection logo query for visual similarity matching", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "image_data": { + "description": "Base64 encoded image data. Can include data URI prefix (e.g., 'data:image/png;base64,...') or just the base64 string.", + "type": "string" + }, + "search_lookback": { + "default": true, + "description": "If true, search historic scanned images for matches above the similarity threshold", + "type": "boolean" + }, + "similarity_threshold": { + "description": "Minimum similarity score (0-1) required for visual matches", + "type": "number" + }, + "tag": { + "description": "Unique identifier for the logo query", + "type": "string" + } + }, + "required": [ + "image_data", + "similarity_threshold", + "tag" + ], + "type": "object" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Insert logo query" + }, + method: "POST", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/logo/queries", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/logo/queries`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "brand_protection_logos_delete", + title: "Delete logo query", + description: "Delete a saved brand protection logo query. Returns 404 if the query ID doesn't exist.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "query_id": { + "type": "string" + } + }, + required: [ + "account_id", + "query_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete logo query" + }, + method: "DELETE", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/logo/queries/{query_id}", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/logo/queries/${pathParam(args, "query_id")}`, + }), + }, + { + name: "brand_protection_logos_get", + title: "Get logo queries", + description: "Get all saved brand protection logo queries for an account. Optionally specify id to get a single query. Set download=true to include base64-encoded image data.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "download": { + "description": "If true, include base64-encoded image data in the response", + "type": "string" + }, + "id": { + "description": "Optional query ID to retrieve a specific logo query", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get logo queries" + }, + method: "GET", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/logo/queries", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write", + "Cloudforce One Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/logo/queries`, + query: [ + ["id", args["id"], true], + ["download", args["download"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/brandProtection/matches/tools.ts b/src/generated/forge-mcp/brandProtection/matches/tools.ts new file mode 100644 index 00000000..c7a2d423 --- /dev/null +++ b/src/generated/forge-mcp/brandProtection/matches/tools.ts @@ -0,0 +1,174 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `brand_protection.matches`. + */ +export const tools: readonly Tool[] = [ + { + name: "brand_protection_matches_bulk_dismiss", + title: "Bulk dismiss or undismiss matches", + description: "Dismiss or undismiss multiple matches in a single request. Accepts either the new format (matches: [{query_id, domain_id}]) for per-query control, or the legacy format (match_ids: [number]) which dismisses for all queries sharing each match's hash. Returns per-item success/error results.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "action": { + "enum": [ + "dismiss", + "undismiss" + ], + "type": "string" + }, + "match_ids": { + "items": { + "type": "integer" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" + }, + "matches": { + "items": { + "properties": { + "domain_id": { + "type": "integer" + }, + "query_id": { + "type": "integer" + } + }, + "required": [ + "domain_id", + "query_id" + ], + "type": "object" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Bulk dismiss or undismiss matches" + }, + method: "POST", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/domain/matches/bulk-dismiss", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/domain/matches/bulk-dismiss`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "brand_protection_matches_get", + title: "List saved query matches", + description: "Get paginated list of domain matches for one or more brand protection queries. When multiple query_ids are provided (comma-separated), matches are deduplicated across queries and each match includes a match_details array with per-match query metadata and individual dismissed state.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "domain_search": { + "description": "Filter matches by domain name (substring match)", + "type": "string" + }, + "include_dismissed": { + "type": "string" + }, + "include_domain_id": { + "type": "string" + }, + "limit": { + "default": "50", + "type": "string" + }, + "offset": { + "default": "0", + "type": "string" + }, + "order": { + "description": "Sort order. Options: 'asc' (ascending) or 'desc' (descending)", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "order_by": { + "description": "Column to sort by. Options: 'domain', 'first_seen', or 'registrar'", + "enum": [ + "domain", + "first_seen", + "registrar" + ], + "type": "string" + }, + "query_id": { + "description": "Query ID or comma-separated list of Query IDs. When multiple IDs are provided, matches are deduplicated across queries and each match includes a match_details array with per-match query metadata and dismissed state.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + required: [ + "account_id", + "query_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "List saved query matches" + }, + method: "GET", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/domain/matches", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write", + "Cloudforce One Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/domain/matches`, + query: [ + ["offset", args["offset"], true], + ["limit", args["limit"], true], + ["query_id", args["query_id"], true], + ["include_domain_id", args["include_domain_id"], true], + ["include_dismissed", args["include_dismissed"], true], + ["domain_search", args["domain_search"], true], + ["orderBy", args["order_by"], true], + ["order", args["order"], true], + ], + }), + }, +]; diff --git a/src/generated/forge-mcp/brandProtection/queries/tools.ts b/src/generated/forge-mcp/brandProtection/queries/tools.ts new file mode 100644 index 00000000..ab9f913f --- /dev/null +++ b/src/generated/forge-mcp/brandProtection/queries/tools.ts @@ -0,0 +1,142 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `brand_protection.queries`. + */ +export const tools: readonly Tool[] = [ + { + name: "brand_protection_queries_dismiss", + title: "Dismiss a match", + description: "Mark a specific domain as dismissed for a given query. Dismissals are per-query — dismissing a domain in one query does not affect other queries.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "domain_id": { + "type": "string" + }, + "query_id": { + "type": "string" + } + }, + required: [ + "account_id", + "query_id", + "domain_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Dismiss a match" + }, + method: "POST", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/queries/{query_id}/matches/{domain_id}/dismiss", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/queries/${pathParam(args, "query_id")}/matches/${pathParam(args, "domain_id")}/dismiss`, + }), + }, + { + name: "brand_protection_queries_get", + title: "Get queries", + description: "Get all saved brand protection queries for an account", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "id": { + "type": "string" + }, + "page": { + "description": "Optional page number for paginated list requests. Defaults to 1 when only per_page is supplied. Omit page and per_page to preserve the legacy full-list response.", + "type": "integer" + }, + "per_page": { + "description": "Optional number of queries per page for paginated list requests. Defaults to 100 when only page is supplied. Maximum 100. Omit page and per_page to preserve the legacy full-list response.", + "type": "integer" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get queries" + }, + method: "GET", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/domain/queries", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write", + "Cloudforce One Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/domain/queries`, + query: [ + ["id", args["id"], true], + ["page", args["page"], true], + ["per_page", args["per_page"], true], + ], + }), + }, + { + name: "brand_protection_queries_undismiss", + title: "Undismiss a match", + description: "Remove the dismissed status from a specific domain for a given query. Undismissals are per-query — undismissing a domain in one query does not affect other queries.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "domain_id": { + "type": "string" + }, + "query_id": { + "type": "string" + } + }, + required: [ + "account_id", + "query_id", + "domain_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Undismiss a match" + }, + method: "POST", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/queries/{query_id}/matches/{domain_id}/undismiss", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/queries/${pathParam(args, "query_id")}/matches/${pathParam(args, "domain_id")}/undismiss`, + }), + }, +]; diff --git a/src/generated/forge-mcp/brandProtection/tools.ts b/src/generated/forge-mcp/brandProtection/tools.ts new file mode 100644 index 00000000..bfe664f5 --- /dev/null +++ b/src/generated/forge-mcp/brandProtection/tools.ts @@ -0,0 +1,112 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; + +/** + * The tools of `brand_protection`. + */ +export const tools: readonly Tool[] = [ + { + name: "brand_protection_submit", + title: "Search scanned images", + description: "Submit an image and find the n closest matches from the scanned images index without creating any match records. Returns similarity scores and metadata for each match.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "image_data": { + "description": "Base64 encoded image data. Can include data URI prefix (e.g., 'data:image/png;base64,...') or just the base64 string.", + "type": "string" + }, + "score_threshold": { + "default": 0, + "description": "Minimum similarity score threshold for matches (0-1, default: 0)", + "type": "number" + }, + "top_k": { + "default": 10, + "description": "Number of closest matches to return (1-100, default: 10)", + "type": "integer" + } + }, + "required": [ + "image_data" + ], + "type": "object" + }, + "download": { + "description": "If true, include base64-encoded image data in the response", + "type": "string" + }, + "show_historic": { + "description": "Include scanned images without domain metadata (historic data). Default: false (only show images with domain)", + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Search scanned images" + }, + method: "POST", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/logo/search", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/logo/search`, + query: [ + ["showHistoric", args["show_historic"], true], + ["download", args["download"], true], + ], + body: { value: args["body"], mediaType: "application/json" }, + }), + }, + { + name: "brand_protection_url_info", + title: "Get total queries", + description: "Get the total number of saved brand protection queries (domain + logo) for an account", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Get total queries" + }, + method: "GET", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/total-queries", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write", + "Cloudforce One Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/total-queries`, + }), + }, +]; diff --git a/src/generated/forge-mcp/brandProtection/trial/tools.ts b/src/generated/forge-mcp/brandProtection/trial/tools.ts new file mode 100644 index 00000000..0034a4f2 --- /dev/null +++ b/src/generated/forge-mcp/brandProtection/trial/tools.ts @@ -0,0 +1,55 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `brand_protection.trial`. + */ +export const tools: readonly Tool[] = [ + { + name: "brand_protection_trial_create", + title: "Analyze domains for brand impersonation", + description: "Uses AI to scan all domains in the lookback table and identify potential phishing or impersonation attempts against the given brand string.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + }, + "body": { + "properties": { + "brand": { + "type": "string" + } + }, + "required": [ + "brand" + ], + "type": "object" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Analyze domains for brand impersonation" + }, + method: "POST", + path: "/accounts/{account_id}/cloudforce-one/v2/brand-protection/domain/trial", + extensions: { + "x-api-token-group": [ + "Cloudforce One Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/cloudforce-one/v2/brand-protection/domain/trial`, + body: { value: args["body"], mediaType: "application/json" }, + }), + }, +]; diff --git a/src/generated/forge-mcp/brands/patterns/tools.ts b/src/generated/forge-mcp/brands/patterns/tools.ts new file mode 100644 index 00000000..fbe358c6 --- /dev/null +++ b/src/generated/forge-mcp/brands/patterns/tools.ts @@ -0,0 +1,110 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `brands.patterns`. + */ +export const tools: readonly Tool[] = [ + { + name: "brands_patterns_create", + title: "Create new patterns for brands by ID", + description: "Return a success message after creating new patterns for brands by ID", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create new patterns for brands by ID" + }, + method: "POST", + path: "/accounts/{account_id}/brand-protection/brands/patterns", + extensions: { + "x-api-token-group": [ + "Intel Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/brands/patterns`, + }), + }, + { + name: "brands_patterns_delete", + title: "Delete patterns for brands by ID", + description: "Return a success message after deleting patterns for brands by ID", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete patterns for brands by ID" + }, + method: "DELETE", + path: "/accounts/{account_id}/brand-protection/brands/patterns", + extensions: { + "x-api-token-group": [ + "Intel Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/brands/patterns`, + }), + }, + { + name: "brands_patterns_get", + title: "Read patterns for brands by ID", + description: "Return patterns for brands based on ID", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Read patterns for brands by ID" + }, + method: "GET", + path: "/accounts/{account_id}/brand-protection/brands/patterns", + extensions: { + "x-api-token-group": [ + "Intel Write", + "Intel Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/brands/patterns`, + }), + }, +]; diff --git a/src/generated/forge-mcp/brands/tools.ts b/src/generated/forge-mcp/brands/tools.ts new file mode 100644 index 00000000..6668ff3d --- /dev/null +++ b/src/generated/forge-mcp/brands/tools.ts @@ -0,0 +1,110 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../_/index.js"; + +/** + * The tools of `brands`. + */ +export const tools: readonly Tool[] = [ + { + name: "brands_create", + title: "Create new brands", + description: "Return new brands", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create new brands" + }, + method: "POST", + path: "/accounts/{account_id}/brand-protection/brands", + extensions: { + "x-api-token-group": [ + "Intel Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/brands`, + }), + }, + { + name: "brands_delete", + title: "Delete brands by ID", + description: "Return a success message after deleting brands by ID", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Delete brands by ID" + }, + method: "DELETE", + path: "/accounts/{account_id}/brand-protection/brands", + extensions: { + "x-api-token-group": [ + "Intel Write" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/brands`, + }), + }, + { + name: "brands_get", + title: "Read all brands", + description: "Return all brands", + inputSchema: { + type: "object", + properties: { + "account_id": { + "type": "string" + } + }, + required: [ + "account_id" + ], + }, + annotations: { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Read all brands" + }, + method: "GET", + path: "/accounts/{account_id}/brand-protection/brands", + extensions: { + "x-api-token-group": [ + "Intel Write", + "Intel Read" + ] + }, + request: (args) => ({ + path: `/accounts/${pathParam(args, "account_id")}/brand-protection/brands`, + }), + }, +]; diff --git a/src/generated/forge-mcp/browserRun/crawl/tools.ts b/src/generated/forge-mcp/browserRun/crawl/tools.ts new file mode 100644 index 00000000..cd6f934d --- /dev/null +++ b/src/generated/forge-mcp/browserRun/crawl/tools.ts @@ -0,0 +1,900 @@ +// Code generated by forge. DO NOT EDIT. +/* eslint-disable */ + +import { type Tool, pathParam } from "../../_/index.js"; + +/** + * The tools of `browser_run.crawl`. + */ +export const tools: readonly Tool[] = [ + { + name: "browser_run_crawl_create", + title: "Crawl websites.", + description: "Starts a crawl job for the provided URL and its children. Check available options like `gotoOptions` and `waitFor*` to control page load behaviour.", + inputSchema: { + type: "object", + properties: { + "account_id": { + "description": "Account ID.", + "type": "string" + }, + "body": { + "anyOf": [ + { + "properties": { + "actionTimeout": { + "description": "The maximum duration allowed for the browser action to complete after the page has loaded (such as taking screenshots, extracting content, or generating PDFs). If this time limit is exceeded, the action stops and returns a timeout error.", + "type": "number" + }, + "addScriptTag": { + "description": "Adds a script element into the page with the desired URL or content.", + "items": { + "properties": { + "content": { + "type": "string" + }, + "id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "addStyleTag": { + "description": "Adds a `` tag into the page with the desired URL or a `

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 BMnwPs literal 0 HcmV?d00001 From 50eaca5193708d98e511f44902f25778ada9953f Mon Sep 17 00:00:00 2001 From: Matt Carey Date: Tue, 20 Oct 2026 14:19:19 +0100 Subject: [PATCH 2/6] feat(mcp): serve tools whose code forge generates, regenerated by CI Replace the forge-mcp plugin catalogue in R2 with code: forge's MCP target (--target mcp, on the forge-mcp branch pinned in forge.json) writes TypeScript for @modelcontextprotocol/server into src/generated/forge-mcp, which is committed. Each tool has its schema and a generated request function; /mcp?forge=true imports the module lazily and applies the Cloudflare policy (optional account_id, account_or_zone values) once per isolate. .github/workflows/forge-tools.yml builds that forge, regenerates from the latest openapi.forge.json every six hours, runs the type check and tests, and opens or updates a bot/forge-tools pull request when the generated code changes. Merging it deploys. Drops the vendored @cloudflare/forge-mcp tarball, the @cloudflare/forge and jco dev dependencies, the WebAssembly plugin, and the R2 artifact. --- .github/workflows/forge-tools.yml | 109 + .gitignore | 1 - .oxfmtrc.json | 5 +- AGENTS.md | 18 +- README.md | 2 +- forge.json | 5 + package-lock.json | 5143 ++++------------ package.json | 9 +- scripts/forge-tools.ts | 34 - scripts/generate-tools.ts | 104 +- scripts/seed-r2.ts | 13 +- src/forge-tools/cloudflare-plugin.ts | 70 - src/forge-tools/cloudflare.ts | 60 + src/forge-tools/plugin-entry.ts | 10 - src/forge-tools/policy.ts | 9 +- src/generated/forge-mcp/README.md | 37 + src/generated/forge-mcp/_/index.ts | 19 + src/generated/forge-mcp/_/server.ts | 156 + src/generated/forge-mcp/_/tool.ts | 183 + .../forge-mcp/abuseReports/appeals/tools.ts | 50 + .../forge-mcp/abuseReports/emails/tools.ts | 114 + .../abuseReports/mitigations/schemas.ts | 165 + .../abuseReports/mitigations/tools.ts | 168 + .../forge-mcp/abuseReports/schemas.ts | 928 +++ src/generated/forge-mcp/abuseReports/tools.ts | 353 ++ .../accounts/applications/schemas.ts | 201 + .../forge-mcp/accounts/applications/tools.ts | 308 + .../accounts/billing/history/tools.ts | 80 + .../billing/paymentMethods/schemas.ts | 109 + .../accounts/billing/paymentMethods/tools.ts | 375 ++ .../forge-mcp/accounts/billing/tools.ts | 376 ++ .../forge-mcp/accounts/categories/tools.ts | 92 + .../forge-mcp/accounts/logs/audit/tools.ts | 642 ++ .../forge-mcp/accounts/members/schemas.ts | 194 + .../forge-mcp/accounts/members/tools.ts | 399 ++ .../forge-mcp/accounts/organization/tools.ts | 43 + .../forge-mcp/accounts/profile/tools.ts | 87 + src/generated/forge-mcp/accounts/schemas.ts | 118 + .../accounts/subscriptions/schemas.ts | 24 + .../forge-mcp/accounts/subscriptions/tools.ts | 497 ++ .../accounts/tokens/permissionGroups/tools.ts | 73 + .../forge-mcp/accounts/tokens/tools.ts | 469 ++ src/generated/forge-mcp/accounts/tools.ts | 366 ++ .../accounts/transformations/tools.ts | 55 + .../forge-mcp/accounts/utBilling/schemas.ts | 15 + .../forge-mcp/accounts/utBilling/tools.ts | 117 + .../forge-mcp/acm/customTrustStore/schemas.ts | 12 + .../forge-mcp/acm/customTrustStore/tools.ts | 272 + .../forge-mcp/acm/totalTls/schemas.ts | 25 + src/generated/forge-mcp/acm/totalTls/tools.ts | 141 + .../addressing/addressMaps/accounts/tools.ts | 93 + .../addressing/addressMaps/ips/tools.ts | 210 + .../addressing/addressMaps/schemas.ts | 105 + .../forge-mcp/addressing/addressMaps/tools.ts | 267 + .../addressing/addressMaps/zones/schemas.ts | 12 + .../addressing/addressMaps/zones/tools.ts | 205 + .../forge-mcp/addressing/leases/tools.ts | 42 + .../addressing/loaDocuments/tools.ts | 85 + .../prefixes/bgpPrefixes/schemas.ts | 70 + .../addressing/prefixes/bgpPrefixes/tools.ts | 250 + .../prefixes/delegations/schemas.ts | 12 + .../addressing/prefixes/delegations/tools.ts | 152 + .../forge-mcp/addressing/prefixes/schemas.ts | 36 + .../prefixes/serviceBindings/schemas.ts | 25 + .../prefixes/serviceBindings/tools.ts | 190 + .../forge-mcp/addressing/prefixes/tools.ts | 267 + .../addressing/prefixes/validate/tools.ts | 50 + .../regionalHostnames/regions/tools.ts | 49 + .../addressing/regionalHostnames/schemas.ts | 36 + .../addressing/regionalHostnames/tools.ts | 261 + src/generated/forge-mcp/addressing/schemas.ts | 27 + .../forge-mcp/addressing/services/tools.ts | 45 + src/generated/forge-mcp/agentMemory/tools.ts | 751 +++ src/generated/forge-mcp/ai/authors/tools.ts | 60 + .../forge-mcp/ai/finetunes/assets/tools.ts | 117 + .../forge-mcp/ai/finetunes/public/tools.ts | 79 + src/generated/forge-mcp/ai/finetunes/tools.ts | 182 + src/generated/forge-mcp/ai/models/tools.ts | 115 + src/generated/forge-mcp/ai/tasks/tools.ts | 60 + src/generated/forge-mcp/ai/tools.ts | 1202 ++++ .../forge-mcp/aiAudit/robots/tools.ts | 96 + .../aiGateway/customDomains/tools.ts | 293 + .../aiGateway/customProviders/tools.ts | 422 ++ .../forge-mcp/aiGateway/datasets/tools.ts | 465 ++ .../dynamicRouting/deployments/tools.ts | 137 + .../aiGateway/dynamicRouting/tools.ts | 648 ++ .../dynamicRouting/versions/tools.ts | 518 ++ .../aiGateway/evaluationTypes/tools.ts | 86 + .../forge-mcp/aiGateway/evaluations/tools.ts | 289 + .../aiGateway/gateways/providers/tools.ts | 345 ++ .../forge-mcp/aiGateway/gateways/tools.ts | 1741 ++++++ .../forge-mcp/aiGateway/logs/tools.ts | 722 +++ .../forge-mcp/aiSearch/items/tools.ts | 762 +++ .../forge-mcp/aiSearch/jobs/tools.ts | 406 ++ .../forge-mcp/aiSearch/namespace/tools.ts | 531 ++ .../forge-mcp/aiSearch/tokens/tools.ts | 364 ++ src/generated/forge-mcp/aiSearch/tools.ts | 3077 ++++++++++ .../aiSecurity/customTopics/schemas.ts | 42 + .../aiSecurity/customTopics/tools.ts | 81 + src/generated/forge-mcp/aiSecurity/schemas.ts | 18 + src/generated/forge-mcp/aiSecurity/tools.ts | 77 + .../alerting/availableAlerts/tools.ts | 48 + .../alerting/destinations/eligible/tools.ts | 39 + .../alerting/destinations/pagerduty/tools.ts | 164 + .../alerting/destinations/webhooks/schemas.ts | 28 + .../alerting/destinations/webhooks/tools.ts | 293 + .../forge-mcp/alerting/history/schemas.ts | 21 + .../forge-mcp/alerting/history/tools.ts | 78 + .../alerting/policies/email/tools.ts | 111 + .../forge-mcp/alerting/policies/schemas.ts | 502 ++ .../forge-mcp/alerting/policies/tools.ts | 397 ++ src/generated/forge-mcp/alerting/schemas.ts | 28 + .../forge-mcp/alerting/silences/schemas.ts | 54 + .../forge-mcp/alerting/silences/tools.ts | 231 + src/generated/forge-mcp/alerts/clear/tools.ts | 43 + .../forge-mcp/alerts/refute/tools.ts | 43 + src/generated/forge-mcp/alerts/tools.ts | 77 + .../forge-mcp/alerts/verify/tools.ts | 43 + .../analytics/latency/colos/tools.ts | 50 + .../forge-mcp/analytics/latency/tools.ts | 66 + .../dataSecurity/contentFindings/schemas.ts | 41 + .../dataSecurity/contentFindings/tools.ts | 56 + .../query/dataSecurity/findings/schemas.ts | 68 + .../query/dataSecurity/findings/tools.ts | 103 + .../forge-mcp/analytics/query/schemas.ts | 206 + .../forge-mcp/analytics/query/tools.ts | 163 + .../sql/accounts/introspection/tools.ts | 84 + .../forge-mcp/analytics/sql/accounts/tools.ts | 113 + .../forge-mcp/analytics/sql/tools.ts | 50 + .../schemaValidation/schemas/hosts/tools.ts | 68 + .../schemas/operations/tools.ts | 129 + .../schemaValidation/schemas/tools.ts | 331 + .../settings/operations/schemas.ts | 30 + .../settings/operations/tools.ts | 277 + .../schemaValidation/settings/schemas.ts | 36 + .../schemaValidation/settings/tools.ts | 170 + .../apiSecurity/sessionIdentifiers/schemas.ts | 88 + .../apiSecurity/sessionIdentifiers/tools.ts | 121 + .../configurations/credentials/schemas.ts | 85 + .../configurations/credentials/tools.ts | 147 + .../tokenValidation/configurations/schemas.ts | 314 + .../tokenValidation/configurations/tools.ts | 326 + .../tokenValidation/rules/schemas.ts | 260 + .../tokenValidation/rules/tools.ts | 478 ++ .../credentialSets/credentials/schemas.ts | 105 + .../credentialSets/credentials/tools.ts | 305 + .../credentialSets/schemas.ts | 51 + .../credentialSets/tools.ts | 264 + .../vulnerabilityScanner/scans/schemas.ts | 70 + .../vulnerabilityScanner/scans/tools.ts | 178 + .../vulnerabilityScanner/schemas.ts | 12 + .../targetEnvironments/schemas.ts | 129 + .../targetEnvironments/tools.ts | 272 + .../forge-mcp/argo/smartRouting/schemas.ts | 33 + .../forge-mcp/argo/smartRouting/tools.ts | 223 + .../forge-mcp/argo/tieredCaching/schemas.ts | 33 + .../forge-mcp/argo/tieredCaching/tools.ts | 94 + .../artifacts/namespaces/repos/blobs/tools.ts | 60 + .../namespaces/repos/commits/tools.ts | 60 + .../artifacts/namespaces/repos/files/tools.ts | 69 + .../artifacts/namespaces/repos/logs/tools.ts | 70 + .../artifacts/namespaces/repos/raw/tools.ts | 65 + .../namespaces/repos/tokens/tools.ts | 78 + .../artifacts/namespaces/repos/tools.ts | 367 ++ .../artifacts/namespaces/repos/trees/tools.ts | 60 + .../artifacts/namespaces/tokens/tools.ts | 118 + .../forge-mcp/artifacts/namespaces/tools.ts | 194 + src/generated/forge-mcp/auditLogs/tools.ts | 137 + .../basinCatalog/credentials/tools.ts | 98 + .../basinCatalog/maintenanceConfigs/tools.ts | 108 + .../tables/maintenanceConfigs/tools.ts | 187 + .../tables/maintenanceRuns/tools.ts | 62 + .../basinCatalog/namespaces/tables/tools.ts | 130 + .../basinCatalog/namespaces/tools.ts | 80 + src/generated/forge-mcp/basinCatalog/tools.ts | 210 + .../forge-mcp/billing/addresses/schemas.ts | 37 + .../forge-mcp/billing/addresses/tools.ts | 51 + .../forge-mcp/billing/profiles/schemas.ts | 90 + .../forge-mcp/billing/profiles/tools.ts | 346 ++ .../forge-mcp/billing/ratePlans/tools.ts | 47 + .../forge-mcp/billing/usage/schemas.ts | 155 + .../forge-mcp/billing/usage/tools.ts | 351 ++ .../botManagement/feedback/schemas.ts | 128 + .../forge-mcp/botManagement/feedback/tools.ts | 117 + .../forge-mcp/botManagement/schemas.ts | 420 ++ .../forge-mcp/botManagement/tools.ts | 154 + .../forge-mcp/botnetFeed/asn/schemas.ts | 12 + .../forge-mcp/botnetFeed/asn/tools.ts | 98 + .../forge-mcp/botnetFeed/configs/asn/tools.ts | 83 + .../brandProtection/logoMatches/tools.ts | 85 + .../forge-mcp/brandProtection/logos/tools.ts | 154 + .../brandProtection/matches/tools.ts | 174 + .../brandProtection/queries/tools.ts | 142 + .../forge-mcp/brandProtection/tools.ts | 112 + .../forge-mcp/brandProtection/trial/tools.ts | 55 + .../forge-mcp/brands/patterns/tools.ts | 110 + src/generated/forge-mcp/brands/tools.ts | 110 + .../forge-mcp/browserRun/crawl/tools.ts | 900 +++ .../devtools/browser/liveView/tools.ts | 107 + .../devtools/browser/targets/tools.ts | 331 + .../browserRun/devtools/browser/tools.ts | 289 + .../browserRun/devtools/json/tools.ts | 76 + .../browserRun/devtools/session/tools.ts | 132 + .../forge-mcp/browserRun/quickAction/tools.ts | 4337 +++++++++++++ .../browserRun/recording/network/tools.ts | 80 + .../forge-mcp/browserRun/recording/tools.ts | 67 + .../forge-mcp/builds/deployHooks/schemas.ts | 42 + .../forge-mcp/builds/deployHooks/tools.ts | 303 + .../forge-mcp/builds/limits/tools.ts | 49 + .../forge-mcp/builds/logs/schemas.ts | 12 + src/generated/forge-mcp/builds/logs/tools.ts | 64 + .../builds/repos/configAutofill/tools.ts | 83 + .../builds/repos/connections/schemas.ts | 40 + .../builds/repos/connections/tools.ts | 111 + src/generated/forge-mcp/builds/schemas.ts | 29 + .../forge-mcp/builds/tokens/schemas.ts | 34 + .../forge-mcp/builds/tokens/tools.ts | 154 + src/generated/forge-mcp/builds/tools.ts | 217 + .../forge-mcp/builds/triggers/cache/tools.ts | 54 + .../triggers/environmentVariables/tools.ts | 158 + .../forge-mcp/builds/triggers/schemas.ts | 131 + .../forge-mcp/builds/triggers/tools.ts | 230 + .../forge-mcp/builds/versions/schemas.ts | 12 + .../forge-mcp/builds/versions/tools.ts | 59 + .../forge-mcp/builds/workers/schemas.ts | 239 + .../forge-mcp/builds/workers/tools.ts | 255 + .../cache/originCloudRegions/schemas.ts | 37 + .../cache/originCloudRegions/tools.ts | 328 + src/generated/forge-mcp/cache/schemas.ts | 123 + .../settings/regionalTieredCache/schemas.ts | 16 + .../settings/regionalTieredCache/tools.ts | 133 + .../cache/settings/reserve/schemas.ts | 16 + .../forge-mcp/cache/settings/reserve/tools.ts | 237 + .../settings/smartTieredCache/schemas.ts | 25 + .../cache/settings/smartTieredCache/tools.ts | 241 + .../cache/settings/variants/schemas.ts | 91 + .../cache/settings/variants/tools.ts | 183 + src/generated/forge-mcp/cache/tools.ts | 312 + src/generated/forge-mcp/clear/tools.ts | 43 + .../clientSideSecurity/connections/tools.ts | 178 + .../clientSideSecurity/cookies/tools.ts | 197 + .../clientSideSecurity/policies/schemas.ts | 85 + .../clientSideSecurity/policies/tools.ts | 296 + .../clientSideSecurity/scripts/tools.ts | 185 + .../clientSideSecurity/settings/schemas.ts | 28 + .../clientSideSecurity/settings/tools.ts | 126 + .../forge-mcp/cloudConnector/rules/schemas.ts | 62 + .../forge-mcp/cloudConnector/rules/tools.ts | 109 + .../cloudforceOne/binaryStorage/tools.ts | 50 + .../credentialMonitor/domains/tools.ts | 145 + .../credentialMonitor/matches/tools.ts | 69 + .../cloudforceOne/events/aggregate/tools.ts | 82 + .../events/categories/catalog/tools.ts | 45 + .../cloudforceOne/events/categories/tools.ts | 78 + .../events/dataset/copy/tools.ts | 77 + .../events/dataset/events/tools.ts | 55 + .../events/dataset/groups/get/tools.ts | 84 + .../events/dataset/groups/members/tools.ts | 142 + .../events/dataset/groups/tools.ts | 153 + .../events/dataset/indicators/bulk/tools.ts | 132 + .../events/dataset/indicators/create/tools.ts | 117 + .../events/dataset/indicators/get/tools.ts | 55 + .../dataset/indicators/relationships/tools.ts | 356 ++ .../events/dataset/indicators/tags/tools.ts | 50 + .../events/dataset/indicators/tools.ts | 156 + .../events/dataset/move/tools.ts | 77 + .../events/dataset/permissions/tools.ts | 224 + .../events/dataset/tags/indicators/tools.ts | 136 + .../events/dataset/target/industries/tools.ts | 51 + .../cloudforceOne/events/dataset/tools.ts | 108 + .../events/datasets/populate/tools.ts | 45 + .../cloudforceOne/events/delete/tools.ts | 61 + .../events/graphql/create/graph/tools.ts | 79 + .../events/indicator/types/tools.ts | 55 + .../cloudforceOne/events/indicators/tools.ts | 268 + .../cloudforceOne/events/queries/get/tools.ts | 85 + .../cloudforceOne/events/queries/tools.ts | 272 + .../cloudforceOne/events/raw/tools.ts | 70 + .../events/relate/create/tools.ts | 65 + .../events/relationships/create/tools.ts | 84 + .../events/relationships/tools.ts | 111 + .../forge-mcp/cloudforceOne/events/schemas.ts | 131 + .../events/tags/categories/actors/tools.ts | 120 + .../events/tags/categories/create/tools.ts | 77 + .../events/tags/categories/tools.ts | 198 + .../events/tags/relationships/tools.ts | 361 ++ .../cloudforceOne/events/tags/tools.ts | 692 +++ .../events/target/industries/catalog/tools.ts | 45 + .../forge-mcp/cloudforceOne/events/tools.ts | 129 + .../cloudforceOne/events/update/bulk/tools.ts | 136 + .../priorityIntelligence/constants/tools.ts | 45 + .../priorityIntelligence/filters/tools.ts | 57 + .../interests/backtests/tools.ts | 133 + .../interests/evaluations/tools.ts | 129 + .../priorityIntelligence/interests/tools.ts | 222 + .../priorityIntelligence/matches/tools.ts | 155 + .../priorityIntelligence/quota/tools.ts | 44 + .../priorityIntelligence/tools.ts | 1229 ++++ .../cloudforceOne/requests/assets/tools.ts | 191 + .../cloudforceOne/requests/constants/tools.ts | 64 + .../requests/legalResponse/tools.ts | 45 + .../cloudforceOne/requests/messages/tools.ts | 298 + .../cloudforceOne/requests/metadata/tools.ts | 76 + .../cloudforceOne/requests/quota/tools.ts | 64 + .../forge-mcp/cloudforceOne/requests/tools.ts | 439 ++ .../cloudforceOne/requests/types/tools.ts | 48 + .../cloudforceOne/requests/user/tools.ts | 50 + .../cloudforceOne/rules/approvals/schemas.ts | 34 + .../cloudforceOne/rules/approvals/tools.ts | 235 + .../rules/email/approvals/tools.ts | 172 + .../cloudforceOne/rules/email/schema/tools.ts | 39 + .../cloudforceOne/rules/email/schemas.ts | 271 + .../cloudforceOne/rules/email/tools.ts | 738 +++ .../cloudforceOne/rules/exemptions/schemas.ts | 77 + .../cloudforceOne/rules/exemptions/tools.ts | 153 + .../cloudforceOne/rules/managed/tools.ts | 39 + .../forge-mcp/cloudforceOne/rules/schemas.ts | 225 + .../cloudforceOne/rules/stats/tools.ts | 39 + .../forge-mcp/cloudforceOne/rules/tools.ts | 497 ++ .../cloudforceOne/rules/tree/tools.ts | 39 + .../cloudforceOne/scans/config/schemas.ts | 34 + .../cloudforceOne/scans/config/tools.ts | 211 + .../cloudforceOne/scans/results/tools.ts | 84 + .../threatEvents/attackers/tools.ts | 55 + .../threatEvents/categories/tools.ts | 269 + .../threatEvents/countries/tools.ts | 45 + .../threatEvents/datasets/tools.ts | 249 + .../threatEvents/eventTags/tools.ts | 119 + .../threatEvents/indicatorTypes/tools.ts | 67 + .../cloudforceOne/threatEvents/raw/tools.ts | 114 + .../threatEvents/relate/tools.ts | 64 + .../cloudforceOne/threatEvents/tags/tools.ts | 490 ++ .../threatEvents/targetIndustries/tools.ts | 55 + .../cloudforceOne/threatEvents/tools.ts | 1733 ++++++ .../threatSignals/articles/skills/tools.ts | 143 + .../threatSignals/articles/tags/tools.ts | 147 + .../threatSignals/articles/tools.ts | 374 ++ .../threatSignals/categories/tools.ts | 44 + .../threatSignals/feeds/skills/tools.ts | 107 + .../threatSignals/feeds/tools.ts | 430 ++ .../threatSignals/indicators/tools.ts | 86 + .../skills/tagCategories/tools.ts | 111 + .../threatSignals/skills/tools.ts | 264 + .../cloudforceOne/threatSignals/tools.ts | 63 + .../forge-mcp/connectorInterrupts/schemas.ts | 65 + .../forge-mcp/connectorInterrupts/tools.ts | 111 + .../connectorTelemetryEvents/tools.ts | 133 + .../connectorTelemetrySnapshots/tools.ts | 124 + src/generated/forge-mcp/connectors/schemas.ts | 195 + src/generated/forge-mcp/connectors/tools.ts | 314 + .../applications/instances/tools.ts | 126 + .../applications/rollouts/schemas.ts | 104 + .../containers/applications/rollouts/tools.ts | 87 + .../containers/applications/schemas.ts | 595 ++ .../containers/applications/tools.ts | 309 + .../containers/applications/versions/tools.ts | 50 + .../forge-mcp/containers/images/schemas.ts | 21 + .../forge-mcp/containers/images/tools.ts | 50 + .../registries/credentials/schemas.ts | 38 + .../registries/credentials/tools.ts | 57 + .../containers/registries/schemas.ts | 95 + .../forge-mcp/containers/registries/tools.ts | 135 + src/generated/forge-mcp/containers/schemas.ts | 12 + .../contentScan/expressions/schemas.ts | 12 + .../contentScan/expressions/tools.ts | 202 + src/generated/forge-mcp/contentScan/tools.ts | 101 + src/generated/forge-mcp/cps/schemas.ts | 46 + src/generated/forge-mcp/cps/tools.ts | 74 + .../forge-mcp/csamScanner/schemas.ts | 62 + src/generated/forge-mcp/csamScanner/tools.ts | 96 + src/generated/forge-mcp/customCsrs/schemas.ts | 72 + src/generated/forge-mcp/customCsrs/tools.ts | 282 + .../certificatePack/certificates/tools.ts | 129 + .../customHostnames/fallbackOrigin/schemas.ts | 12 + .../customHostnames/fallbackOrigin/tools.ts | 179 + .../forge-mcp/customHostnames/quota/tools.ts | 51 + .../forge-mcp/customHostnames/schemas.ts | 206 + .../forge-mcp/customHostnames/tools.ts | 501 ++ .../forge-mcp/customNameservers/tools.ts | 176 + .../customPages/accountAssets/schemas.ts | 28 + .../customPages/accountAssets/tools.ts | 306 + .../previewTokens/schemas.ts | 30 + .../accountCustomPages/previewTokens/tools.ts | 77 + .../customPages/accountCustomPages/schemas.ts | 24 + .../customPages/accountCustomPages/tools.ts | 196 + src/generated/forge-mcp/d1/schemas.ts | 155 + .../forge-mcp/d1/timeTravel/schemas.ts | 21 + .../forge-mcp/d1/timeTravel/tools.ts | 118 + src/generated/forge-mcp/d1/tools.ts | 496 ++ .../endpointHealthchecks/schemas.ts | 41 + .../diagnostics/endpointHealthchecks/tools.ts | 241 + .../diagnostics/traceroutes/schemas.ts | 107 + .../diagnostics/traceroutes/tools.ts | 90 + .../prefixBindings/schemas.ts | 46 + .../regionalServices/prefixBindings/tools.ts | 202 + src/generated/forge-mcp/dls/regions/tools.ts | 94 + .../forge-mcp/dns/dnssec/list/tools.ts | 51 + src/generated/forge-mcp/dns/dnssec/schemas.ts | 28 + src/generated/forge-mcp/dns/dnssec/tools.ts | 198 + .../forge-mcp/dns/records/schemas.ts | 1830 ++++++ src/generated/forge-mcp/dns/records/tools.ts | 1162 ++++ .../account/nameserverSets/schemas.ts | 80 + .../settings/account/nameserverSets/tools.ts | 233 + .../forge-mcp/dns/settings/account/schemas.ts | 217 + .../forge-mcp/dns/settings/account/tools.ts | 152 + .../dns/settings/account/views/schemas.ts | 106 + .../dns/settings/account/views/tools.ts | 382 ++ .../forge-mcp/dns/usage/account/tools.ts | 65 + .../dns/zoneTransfers/acls/schemas.ts | 41 + .../forge-mcp/dns/zoneTransfers/acls/tools.ts | 257 + .../dns/zoneTransfers/forceAxfr/tools.ts | 51 + .../dns/zoneTransfers/incoming/schemas.ts | 39 + .../dns/zoneTransfers/incoming/tools.ts | 209 + .../dns/zoneTransfers/outgoing/schemas.ts | 25 + .../zoneTransfers/outgoing/status/tools.ts | 53 + .../dns/zoneTransfers/outgoing/tools.ts | 327 + .../dns/zoneTransfers/peers/schemas.ts | 76 + .../dns/zoneTransfers/peers/tools.ts | 257 + .../forge-mcp/dns/zoneTransfers/schemas.ts | 30 + .../dns/zoneTransfers/tsigs/schemas.ts | 54 + .../dns/zoneTransfers/tsigs/tools.ts | 247 + .../dnsFirewall/reverseDns/schemas.ts | 20 + .../forge-mcp/dnsFirewall/reverseDns/tools.ts | 130 + .../forge-mcp/dnsFirewall/schemas.ts | 237 + src/generated/forge-mcp/dnsFirewall/tools.ts | 343 ++ src/generated/forge-mcp/domainInfo/tools.ts | 44 + .../namespaces/objects/tools.ts | 71 + .../durableObjects/namespaces/schemas.ts | 96 + .../durableObjects/namespaces/tools.ts | 133 + .../emailAuth/dmarcReports/schemas.ts | 36 + .../forge-mcp/emailAuth/dmarcReports/tools.ts | 82 + src/generated/forge-mcp/emailAuth/schemas.ts | 12 + .../forge-mcp/emailAuth/spf/tools.ts | 51 + .../emailRouting/addresses/schemas.ts | 48 + .../forge-mcp/emailRouting/addresses/tools.ts | 333 + .../forge-mcp/emailRouting/dns/tools.ts | 134 + .../emailRouting/rules/catchAll/schemas.ts | 43 + .../emailRouting/rules/catchAll/tools.ts | 138 + .../forge-mcp/emailRouting/rules/schemas.ts | 402 ++ .../forge-mcp/emailRouting/rules/tools.ts | 405 ++ .../forge-mcp/emailRouting/schemas.ts | 32 + .../emailRouting/settings/schemas.ts | 37 + .../forge-mcp/emailRouting/settings/tools.ts | 178 + src/generated/forge-mcp/emailRouting/tools.ts | 120 + .../emailSecurity/allowPolicies/schemas.ts | 170 + .../emailSecurity/allowPolicies/tools.ts | 492 ++ .../analytics/monthlyReport/tools.ts | 47 + .../emailSecurity/blockSenders/schemas.ts | 106 + .../emailSecurity/blockSenders/tools.ts | 472 ++ .../bulkActions/messages/schemas.ts | 20 + .../bulkActions/messages/tools.ts | 78 + .../emailSecurity/bulkActions/schemas.ts | 263 + .../emailSecurity/bulkActions/tools.ts | 268 + .../emailSecurity/contentPolicies/schemas.ts | 137 + .../emailSecurity/contentPolicies/tools.ts | 421 ++ .../emailSecurity/domains/schemas.ts | 374 ++ .../forge-mcp/emailSecurity/domains/tools.ts | 505 ++ .../domains/verification/tools.ts | 57 + .../impersonationRegistry/schemas.ts | 187 + .../impersonationRegistry/tools.ts | 284 + .../investigate/actionLog/tools.ts | 73 + .../investigate/detections/tools.ts | 59 + .../investigate/preview/tools.ts | 112 + .../emailSecurity/investigate/raw/tools.ts | 59 + .../emailSecurity/investigate/tools.ts | 372 ++ .../emailSecurity/investigate/trace/tools.ts | 59 + .../emailSecurity/phishguard/reports/tools.ts | 90 + .../forge-mcp/emailSecurity/schemas.ts | 95 + .../sendingDomainRestrictions/schemas.ts | 79 + .../sendingDomainRestrictions/tools.ts | 275 + .../emailSecurity/submissions/schemas.ts | 88 + .../emailSecurity/submissions/tools.ts | 243 + .../emailSecurity/trustedDomains/schemas.ts | 91 + .../emailSecurity/trustedDomains/tools.ts | 463 ++ .../urlIgnorePatterns/schemas.ts | 66 + .../emailSecurity/urlIgnorePatterns/tools.ts | 379 ++ .../forge-mcp/emailSending/limits/tools.ts | 57 + .../emailSending/reputation/tools.ts | 57 + .../forge-mcp/emailSending/schemas.ts | 327 + .../emailSending/subdomains/dns/tools.ts | 166 + .../subdomains/reputation/tools.ts | 76 + .../emailSending/subdomains/schemas.ts | 38 + .../emailSending/subdomains/tools.ts | 335 + .../emailSending/suppressions/tools.ts | 428 ++ src/generated/forge-mcp/emailSending/tools.ts | 192 + .../forge-mcp/fieldExtractors/tools.ts | 161 + .../forge-mcp/firewall/accessRules/schemas.ts | 28 + .../forge-mcp/firewall/accessRules/tools.ts | 426 ++ .../forge-mcp/firewall/lockdowns/schemas.ts | 124 + .../forge-mcp/firewall/lockdowns/tools.ts | 373 ++ src/generated/forge-mcp/firewall/schemas.ts | 20 + .../forge-mcp/firewall/uaRules/schemas.ts | 33 + .../forge-mcp/firewall/uaRules/tools.ts | 341 ++ .../flagship/apps/definitions/tools.ts | 73 + .../forge-mcp/flagship/apps/evaluate/tools.ts | 80 + .../flagship/apps/flags/changelog/tools.ts | 83 + .../forge-mcp/flagship/apps/flags/tools.ts | 1299 ++++ .../forge-mcp/flagship/apps/schemas.ts | 36 + .../forge-mcp/flagship/apps/tools.ts | 302 + src/generated/forge-mcp/fraud/schemas.ts | 95 + src/generated/forge-mcp/fraud/tools.ts | 98 + .../googleTagGateway/config/schemas.ts | 47 + .../googleTagGateway/config/tools.ts | 122 + .../forge-mcp/healthchecks/previews/tools.ts | 178 + .../forge-mcp/healthchecks/schemas.ts | 305 + src/generated/forge-mcp/healthchecks/tools.ts | 365 ++ .../integration/planetscale/tools.ts | 39 + src/generated/forge-mcp/hyperdrive/schemas.ts | 633 ++ src/generated/forge-mcp/hyperdrive/tools.ts | 463 ++ .../forge-mcp/iam/permissionGroups/tools.ts | 200 + .../forge-mcp/iam/resourceGroups/schemas.ts | 100 + .../forge-mcp/iam/resourceGroups/tools.ts | 332 + src/generated/forge-mcp/iam/schemas.ts | 12 + src/generated/forge-mcp/iam/sso/schemas.ts | 12 + src/generated/forge-mcp/iam/sso/tools.ts | 315 + .../iam/userGroups/members/schemas.ts | 12 + .../forge-mcp/iam/userGroups/members/tools.ts | 365 ++ .../forge-mcp/iam/userGroups/schemas.ts | 147 + .../forge-mcp/iam/userGroups/tools.ts | 369 ++ src/generated/forge-mcp/images/flows/tools.ts | 295 + .../forge-mcp/images/import/schemas.ts | 70 + .../images/import/sources/schemas.ts | 108 + .../forge-mcp/images/import/sources/tools.ts | 322 + .../forge-mcp/images/import/tools.ts | 359 ++ src/generated/forge-mcp/images/keys/tools.ts | 111 + src/generated/forge-mcp/images/schemas.ts | 40 + src/generated/forge-mcp/images/tools.ts | 293 + .../forge-mcp/images/variants/schemas.ts | 141 + .../forge-mcp/images/variants/tools.ts | 234 + src/generated/forge-mcp/index.ts | 2169 +++++++ .../forge-mcp/intel/asn/subnets/tools.ts | 49 + src/generated/forge-mcp/intel/asn/tools.ts | 49 + .../attackSurfaceReport/issueTypes/tools.ts | 45 + src/generated/forge-mcp/intel/dns/schemas.ts | 23 + src/generated/forge-mcp/intel/dns/tools.ts | 69 + .../forge-mcp/intel/domainHistory/tools.ts | 51 + .../forge-mcp/intel/domains/bulks/tools.ts | 67 + .../forge-mcp/intel/domains/tools.ts | 62 + .../intel/indicatorFeeds/downloads/tools.ts | 50 + .../indicatorFeeds/permissions/schemas.ts | 21 + .../intel/indicatorFeeds/permissions/tools.ts | 120 + .../intel/indicatorFeeds/providers/schemas.ts | 25 + .../intel/indicatorFeeds/providers/tools.ts | 48 + .../forge-mcp/intel/indicatorFeeds/schemas.ts | 66 + .../forge-mcp/intel/indicatorFeeds/tools.ts | 212 + .../forge-mcp/intel/ipLists/tools.ts | 45 + src/generated/forge-mcp/intel/ips/tools.ts | 55 + .../intel/miscategorizations/schemas.ts | 65 + .../intel/miscategorizations/tools.ts | 48 + .../intel/sinkholes/ingresses/schemas.ts | 20 + .../intel/sinkholes/ingresses/tools.ts | 252 + .../forge-mcp/intel/sinkholes/schemas.ts | 40 + .../forge-mcp/intel/sinkholes/tools.ts | 228 + src/generated/forge-mcp/intel/urls/tools.ts | 53 + src/generated/forge-mcp/intel/whois/tools.ts | 51 + .../forge-mcp/internal/submit/tools.ts | 31 + src/generated/forge-mcp/ips/tools.ts | 39 + src/generated/forge-mcp/k2/streams/schemas.ts | 136 + .../k2/streams/subscriptions/tools.ts | 52 + src/generated/forge-mcp/k2/streams/tools.ts | 256 + src/generated/forge-mcp/kv/bulk/schemas.ts | 65 + src/generated/forge-mcp/kv/bulk/tools.ts | 196 + src/generated/forge-mcp/kv/keys/tools.ts | 162 + src/generated/forge-mcp/kv/metadata/tools.ts | 55 + .../forge-mcp/kv/namespaces/schemas.ts | 68 + .../forge-mcp/kv/namespaces/tools.ts | 254 + src/generated/forge-mcp/kv/schemas.ts | 60 + .../detections/schemas.ts | 34 + .../detections/tools.ts | 229 + .../leakedCredentialChecks/schemas.ts | 18 + .../forge-mcp/leakedCredentialChecks/tools.ts | 91 + src/generated/forge-mcp/live/tools.ts | 31 + .../loadBalancers/account/schemas.ts | 535 ++ .../forge-mcp/loadBalancers/account/tools.ts | 551 ++ .../loadBalancers/account/usage/tools.ts | 45 + .../monitorGroups/references/tools.ts | 43 + .../loadBalancers/monitorGroups/schemas.ts | 59 + .../loadBalancers/monitorGroups/tools.ts | 235 + .../loadBalancers/monitors/previews/tools.ts | 86 + .../monitors/references/tools.ts | 49 + .../forge-mcp/loadBalancers/monitors/tools.ts | 323 + .../loadBalancers/pools/health/tools.ts | 125 + .../loadBalancers/pools/references/tools.ts | 49 + .../forge-mcp/loadBalancers/pools/tools.ts | 611 ++ .../forge-mcp/loadBalancers/previews/tools.ts | 49 + .../forge-mcp/loadBalancers/regions/tools.ts | 106 + .../forge-mcp/loadBalancers/searches/tools.ts | 74 + .../forge-mcp/logoMatches/download/tools.ts | 61 + src/generated/forge-mcp/logoMatches/tools.ts | 61 + src/generated/forge-mcp/logos/tools.ts | 119 + .../logpush/accountDatasets/fields/tools.ts | 69 + .../logpush/accountDatasets/jobs/tools.ts | 69 + .../forge-mcp/logpush/accountJobs/schemas.ts | 19 + .../forge-mcp/logpush/accountJobs/tools.ts | 476 ++ .../logpush/accountOwnership/tools.ts | 82 + .../accountOwnership/validate/tools.ts | 91 + .../accountValidate/destination/tools.ts | 82 + .../logpush/accountValidate/origin/tools.ts | 82 + .../logpush/accountValidate/tools.ts | 82 + .../forge-mcp/logpush/edge/schemas.ts | 28 + src/generated/forge-mcp/logpush/edge/tools.ts | 135 + src/generated/forge-mcp/logpush/schemas.ts | 369 ++ .../logpush/transformers/content/tools.ts | 72 + .../forge-mcp/logpush/transformers/schemas.ts | 98 + .../forge-mcp/logpush/transformers/tools.ts | 364 ++ .../logpush/transformers/versions/tools.ts | 73 + .../logs/control/cmb/config/schemas.ts | 44 + .../logs/control/cmb/config/tools.ts | 162 + .../logs/control/retention/schemas.ts | 32 + .../forge-mcp/logs/control/retention/tools.ts | 125 + .../forge-mcp/logs/datasets/schemas.ts | 98 + .../forge-mcp/logs/datasets/tools.ts | 280 + src/generated/forge-mcp/logs/list/schemas.ts | 11 + src/generated/forge-mcp/logs/list/tools.ts | 105 + src/generated/forge-mcp/logs/rayid/tools.ts | 74 + .../forge-mcp/logs/received/fields/tools.ts | 51 + .../forge-mcp/logs/received/schemas.ts | 50 + .../forge-mcp/logs/received/tools.ts | 110 + .../forge-mcp/logs/retrieve/tools.ts | 98 + src/generated/forge-mcp/logs/schemas.ts | 68 + .../catalogSyncs/prebuiltPolicies/tools.ts | 55 + .../catalogSyncs/schemas.ts | 76 + .../catalogSyncs/tools.ts | 309 + .../cloudIntegrations/schemas.ts | 56 + .../cloudIntegrations/tools.ts | 396 ++ .../onRamps/addressSpaces/schemas.ts | 30 + .../onRamps/addressSpaces/tools.ts | 132 + .../magicCloudNetworking/onRamps/schemas.ts | 142 + .../magicCloudNetworking/onRamps/tools.ts | 427 ++ .../magicCloudNetworking/resources/schemas.ts | 19 + .../magicCloudNetworking/resources/tools.ts | 280 + .../forge-mcp/magicCloudNetworking/schemas.ts | 99 + .../configs/full/tools.ts | 45 + .../magicNetworkMonitoring/configs/schemas.ts | 75 + .../magicNetworkMonitoring/configs/tools.ts | 285 + .../rules/advertisements/tools.ts | 49 + .../rules/bulk/tools.ts | 139 + .../magicNetworkMonitoring/rules/schemas.ts | 213 + .../magicNetworkMonitoring/rules/tools.ts | 300 + .../vpcFlows/tokens/tools.ts | 43 + .../configs/dns/protection/rules/schemas.ts | 78 + .../configs/dns/protection/rules/tools.ts | 286 + .../configs/allowlist/prefix/schemas.ts | 21 + .../configs/allowlist/prefix/tools.ts | 139 + .../configs/allowlist/schemas.ts | 30 + .../configs/allowlist/tools.ts | 145 + .../configs/prefixes/bulk/tools.ts | 57 + .../configs/prefixes/schemas.ts | 47 + .../configs/prefixes/tools.ts | 272 + .../advancedTcpProtection/configs/schemas.ts | 42 + .../configs/syn/protection/filters/tools.ts | 291 + .../configs/syn/protection/rules/schemas.ts | 69 + .../configs/syn/protection/rules/tools.ts | 286 + .../tcp/flow/protection/filters/tools.ts | 291 + .../tcp/flow/protection/rules/schemas.ts | 61 + .../tcp/flow/protection/rules/tools.ts | 286 + .../configs/tcp/protection/status/schemas.ts | 20 + .../configs/tcp/protection/status/tools.ts | 90 + .../forge-mcp/magicTransit/apps/schemas.ts | 129 + .../forge-mcp/magicTransit/apps/tools.ts | 224 + .../magicTransit/bgpFilterProfiles/schemas.ts | 81 + .../magicTransit/bgpFilterProfiles/tools.ts | 238 + .../magicTransit/bgpSettings/schemas.ts | 35 + .../magicTransit/bgpSettings/tools.ts | 99 + .../magicTransit/cf1Sites/ramps/schemas.ts | 40 + .../magicTransit/cf1Sites/ramps/tools.ts | 223 + .../magicTransit/cf1Sites/schemas.ts | 69 + .../forge-mcp/magicTransit/cf1Sites/tools.ts | 311 + .../magicTransit/cfInterconnects/schemas.ts | 191 + .../magicTransit/cfInterconnects/tools.ts | 256 + .../magicTransit/greTunnels/schemas.ts | 169 + .../magicTransit/greTunnels/tools.ts | 382 ++ .../magicTransit/ipsecTunnels/schemas.ts | 168 + .../magicTransit/ipsecTunnels/tools.ts | 493 ++ .../magicTransit/pcaps/download/tools.ts | 56 + .../magicTransit/pcaps/ownership/schemas.ts | 49 + .../magicTransit/pcaps/ownership/tools.ts | 201 + .../forge-mcp/magicTransit/pcaps/schemas.ts | 215 + .../forge-mcp/magicTransit/pcaps/tools.ts | 217 + .../magicTransit/redundancyGroups/schemas.ts | 59 + .../magicTransit/redundancyGroups/tools.ts | 232 + .../forge-mcp/magicTransit/routes/schemas.ts | 233 + .../forge-mcp/magicTransit/routes/tools.ts | 459 ++ .../forge-mcp/magicTransit/schemas.ts | 170 + .../magicTransit/sites/acls/schemas.ts | 173 + .../magicTransit/sites/acls/tools.ts | 409 ++ .../sites/appConfiguration/schemas.ts | 114 + .../sites/appConfiguration/tools.ts | 246 + .../magicTransit/sites/lans/schemas.ts | 265 + .../magicTransit/sites/lans/tools.ts | 420 ++ .../sites/netflowConfig/schemas.ts | 33 + .../magicTransit/sites/netflowConfig/tools.ts | 263 + .../forge-mcp/magicTransit/sites/schemas.ts | 136 + .../forge-mcp/magicTransit/sites/tools.ts | 382 ++ .../magicTransit/sites/wans/schemas.ts | 185 + .../magicTransit/sites/wans/tools.ts | 397 ++ .../vulnerabilityDiscovery/reports/tools.ts | 48 + .../repositories/schemas.ts | 23 + .../repositories/tools.ts | 137 + .../vulnerabilityDiscovery/scans/schemas.ts | 41 + .../vulnerabilityDiscovery/scans/tools.ts | 199 + .../vulnerabilityDiscovery/schemas.ts | 26 + .../forge-mcp/managedTransforms/schemas.ts | 82 + .../forge-mcp/managedTransforms/tools.ts | 226 + .../forge-mcp/matches/download/tools.ts | 66 + src/generated/forge-mcp/matches/tools.ts | 66 + src/generated/forge-mcp/mcp/portals/tools.ts | 730 +++ src/generated/forge-mcp/mcp/servers/tools.ts | 659 ++ src/generated/forge-mcp/media/usage/tools.ts | 92 + .../mesh/nodes/configurations/schemas.ts | 112 + .../mesh/nodes/configurations/tools.ts | 111 + .../forge-mcp/mesh/nodes/connections/tools.ts | 52 + .../forge-mcp/mesh/nodes/connectors/tools.ts | 57 + src/generated/forge-mcp/mesh/nodes/schemas.ts | 13 + .../forge-mcp/mesh/nodes/token/tools.ts | 51 + src/generated/forge-mcp/mesh/nodes/tools.ts | 374 ++ .../accountEligibility/schemas.ts | 23 + .../monetization/accountEligibility/tools.ts | 91 + .../forge-mcp/monetization/rules/schemas.ts | 193 + .../forge-mcp/monetization/rules/tools.ts | 268 + .../forge-mcp/network/routes/cidr/tools.ts | 335 + .../network/routes/hostname/schemas.ts | 46 + .../network/routes/hostname/tools.ts | 317 + .../forge-mcp/network/routes/schemas.ts | 37 + .../forge-mcp/network/routes/tools.ts | 68 + src/generated/forge-mcp/network/schemas.ts | 21 + .../network/subnets/cloudflareSource/tools.ts | 113 + .../subnets/initialResolvedIp/tools.ts | 114 + .../forge-mcp/network/subnets/schemas.ts | 72 + .../forge-mcp/network/subnets/tools.ts | 132 + .../forge-mcp/network/subnets/warp/tools.ts | 234 + .../network/virtualNetworks/schemas.ts | 28 + .../network/virtualNetworks/tools.ts | 322 + .../networkInterconnects/cnis/schemas.ts | 148 + .../networkInterconnects/cnis/tools.ts | 286 + .../interconnects/schemas.ts | 127 + .../interconnects/tools.ts | 369 ++ .../forge-mcp/networkInterconnects/schemas.ts | 12 + .../networkInterconnects/settings/schemas.ts | 23 + .../networkInterconnects/settings/tools.ts | 91 + .../networkInterconnects/slots/tools.ts | 161 + .../forge-mcp/o11y/agents/sessions/tools.ts | 145 + .../forge-mcp/o11y/destinations/tools.ts | 256 + .../o11y/issues/automations/tools.ts | 229 + src/generated/forge-mcp/o11y/issues/tools.ts | 475 ++ .../forge-mcp/o11y/metricsExport/tools.ts | 128 + src/generated/forge-mcp/o11y/queries/tools.ts | 756 +++ src/generated/forge-mcp/o11y/schemas.ts | 141 + .../forge-mcp/o11y/sharedQueries/tools.ts | 507 ++ .../forge-mcp/o11y/telemetry/tools.ts | 978 +++ src/generated/forge-mcp/o11y/tools.ts | 58 + .../forge-mcp/o11y/tracing/rules/tools.ts | 153 + .../forge-mcp/o11y/tracing/settings/tools.ts | 138 + .../forge-mcp/oauthClients/schemas.ts | 217 + src/generated/forge-mcp/oauthClients/tools.ts | 414 ++ src/generated/forge-mcp/oauthScopes/tools.ts | 39 + .../forge-mcp/organization/account/tools.ts | 123 + .../forge-mcp/organization/invite/schemas.ts | 23 + .../forge-mcp/organization/invite/tools.ts | 54 + .../organization/member/batch/schemas.ts | 23 + .../organization/member/batch/tools.ts | 53 + .../forge-mcp/organization/member/schemas.ts | 56 + .../forge-mcp/organization/member/tools.ts | 193 + .../forge-mcp/organization/profile/schemas.ts | 35 + .../forge-mcp/organization/profile/tools.ts | 76 + .../forge-mcp/organization/share/tools.ts | 116 + src/generated/forge-mcp/organization/tools.ts | 256 + .../organizations/billing/usage/tools.ts | 65 + .../organizations/logs/audit/tools.ts | 511 ++ src/generated/forge-mcp/pageRules/schemas.ts | 1222 ++++ src/generated/forge-mcp/pageRules/tools.ts | 608 ++ .../forge-mcp/pages/buildCache/tools.ts | 49 + .../pages/deployments/history/logs/tools.ts | 55 + .../forge-mcp/pages/deployments/tools.ts | 255 + .../forge-mcp/pages/domains/schemas.ts | 12 + .../forge-mcp/pages/domains/tools.ts | 196 + .../pages/domains/validation/tools.ts | 54 + src/generated/forge-mcp/pages/schemas.ts | 574 ++ .../forge-mcp/pages/source/schemas.ts | 25 + src/generated/forge-mcp/pages/source/tools.ts | 100 + src/generated/forge-mcp/pages/tools.ts | 566 ++ .../forge-mcp/payPerCrawl/config/schemas.ts | 64 + .../forge-mcp/payPerCrawl/config/tools.ts | 138 + .../payPerCrawl/crawler/stripe/tools.ts | 140 + .../forge-mcp/payPerCrawl/crawlers/tools.ts | 39 + .../payPerCrawl/publisher/stripe/tools.ts | 140 + .../forge-mcp/payPerCrawl/terms/tools.ts | 255 + .../forge-mcp/payPerCrawl/zones/schemas.ts | 57 + .../forge-mcp/payPerCrawl/zones/tools.ts | 165 + .../payPerUse/enabledDomains/tools.ts | 52 + .../forge-mcp/payPerUse/operator/schemas.ts | 47 + .../forge-mcp/payPerUse/operator/tools.ts | 119 + .../forge-mcp/payPerUse/pricing/schemas.ts | 101 + .../forge-mcp/payPerUse/pricing/tools.ts | 141 + .../forge-mcp/payPerUse/proposals/schemas.ts | 28 + .../forge-mcp/payPerUse/proposals/tools.ts | 92 + .../forge-mcp/payPerUse/usageStats/tools.ts | 71 + .../forge-mcp/payPerUse/zones/schemas.ts | 54 + .../forge-mcp/payPerUse/zones/tools.ts | 150 + src/generated/forge-mcp/pipelines/schemas.ts | 647 ++ .../forge-mcp/pipelines/sinks/schemas.ts | 290 + .../forge-mcp/pipelines/sinks/tools.ts | 287 + .../forge-mcp/pipelines/streams/schemas.ts | 103 + .../forge-mcp/pipelines/streams/tools.ts | 394 ++ src/generated/forge-mcp/pipelines/tools.ts | 266 + src/generated/forge-mcp/precursor/schemas.ts | 91 + src/generated/forge-mcp/precursor/tools.ts | 151 + src/generated/forge-mcp/previews/tools.ts | 61 + .../forge-mcp/queries/bulk/schemas.ts | 19 + src/generated/forge-mcp/queries/bulk/tools.ts | 52 + .../forge-mcp/queries/matches/tools.ts | 92 + src/generated/forge-mcp/queries/schemas.ts | 42 + src/generated/forge-mcp/queries/tools.ts | 211 + .../forge-mcp/queues/consumers/schemas.ts | 126 + .../forge-mcp/queues/consumers/tools.ts | 335 + .../forge-mcp/queues/messages/schemas.ts | 102 + .../forge-mcp/queues/messages/tools.ts | 522 ++ .../forge-mcp/queues/metrics/tools.ts | 52 + src/generated/forge-mcp/queues/purge/tools.ts | 122 + src/generated/forge-mcp/queues/schemas.ts | 118 + .../forge-mcp/queues/subscriptions/schemas.ts | 232 + .../forge-mcp/queues/subscriptions/tools.ts | 333 + src/generated/forge-mcp/queues/tools.ts | 289 + .../forge-mcp/r2/buckets/cors/schemas.ts | 77 + .../forge-mcp/r2/buckets/cors/tools.ts | 172 + .../r2/buckets/domains/custom/schemas.ts | 77 + .../r2/buckets/domains/custom/tools.ts | 332 + .../r2/buckets/domains/managed/schemas.ts | 20 + .../r2/buckets/domains/managed/tools.ts | 139 + .../r2/buckets/eventNotifications/schemas.ts | 49 + .../r2/buckets/eventNotifications/tools.ts | 275 + .../forge-mcp/r2/buckets/jobs/schemas.ts | 61 + .../forge-mcp/r2/buckets/jobs/tools.ts | 243 + .../forge-mcp/r2/buckets/lifecycle/schemas.ts | 186 + .../forge-mcp/r2/buckets/lifecycle/tools.ts | 141 + .../r2/buckets/localUploads/tools.ts | 116 + .../forge-mcp/r2/buckets/locks/schemas.ts | 116 + .../forge-mcp/r2/buckets/locks/tools.ts | 181 + .../forge-mcp/r2/buckets/metrics/tools.ts | 42 + src/generated/forge-mcp/r2/buckets/schemas.ts | 28 + .../forge-mcp/r2/buckets/sippy/schemas.ts | 288 + .../forge-mcp/r2/buckets/sippy/tools.ts | 229 + src/generated/forge-mcp/r2/buckets/tools.ts | 418 ++ src/generated/forge-mcp/r2/objects/tools.ts | 307 + src/generated/forge-mcp/r2/schemas.ts | 31 + .../connectivityPrecheck/tools.ts | 100 + .../r2/superSlurper/jobs/logs/tools.ts | 52 + .../forge-mcp/r2/superSlurper/jobs/schemas.ts | 23 + .../forge-mcp/r2/superSlurper/jobs/tools.ts | 323 + .../forge-mcp/r2/superSlurper/schemas.ts | 275 + .../r2/temporaryCredentials/schemas.ts | 56 + .../r2/temporaryCredentials/tools.ts | 48 + .../forge-mcp/radar/agentReadiness/tools.ts | 87 + .../forge-mcp/radar/ai/bots/tools.ts | 437 ++ .../forge-mcp/radar/ai/inference/tools.ts | 269 + .../radar/ai/markdownForAgents/tools.ts | 179 + .../radar/ai/timeseriesGroups/tools.ts | 215 + .../radar/annotations/outages/tools.ts | 369 ++ .../forge-mcp/radar/annotations/tools.ts | 366 ++ src/generated/forge-mcp/radar/as112/tools.ts | 801 +++ .../forge-mcp/radar/as112/top/tools.ts | 447 ++ .../forge-mcp/radar/attacks/layer3/tools.ts | 504 ++ .../attacks/layer3/top/locations/tools.ts | 264 + .../radar/attacks/layer3/top/tools.ts | 172 + .../forge-mcp/radar/attacks/layer7/tools.ts | 696 +++ .../radar/attacks/layer7/top/ases/tools.ts | 209 + .../attacks/layer7/top/locations/tools.ts | 319 + .../radar/attacks/layer7/top/tools.ts | 162 + .../radar/bgp/hijacks/events/tools.ts | 142 + .../forge-mcp/radar/bgp/ips/tools.ts | 122 + .../forge-mcp/radar/bgp/ips/top/tools.ts | 81 + .../forge-mcp/radar/bgp/leaks/events/tools.ts | 126 + .../forge-mcp/radar/bgp/routes/paths/tools.ts | 77 + .../forge-mcp/radar/bgp/routes/tools.ts | 321 + .../radar/bgp/routes/upstreams/tools.ts | 89 + .../forge-mcp/radar/bgp/rpki/aspa/tools.ts | 231 + .../forge-mcp/radar/bgp/rpki/roas/tools.ts | 105 + src/generated/forge-mcp/radar/bgp/tools.ts | 128 + .../forge-mcp/radar/bgp/top/ases/tools.ts | 178 + .../forge-mcp/radar/bgp/top/tools.ts | 115 + src/generated/forge-mcp/radar/bots/tools.ts | 729 +++ .../forge-mcp/radar/bots/webCrawlers/tools.ts | 356 ++ .../forge-mcp/radar/ct/authorities/tools.ts | 118 + .../forge-mcp/radar/ct/logs/tools.ts | 118 + src/generated/forge-mcp/radar/ct/tools.ts | 861 +++ .../forge-mcp/radar/datasets/tools.ts | 180 + src/generated/forge-mcp/radar/dns/tools.ts | 1146 ++++ .../forge-mcp/radar/dns/top/tools.ts | 728 +++ .../forge-mcp/radar/email/routing/tools.ts | 371 ++ .../forge-mcp/radar/email/security/tools.ts | 357 ++ .../security/top/tlds/malicious/tools.ts | 181 + .../email/security/top/tlds/spam/tools.ts | 181 + .../email/security/top/tlds/spoof/tools.ts | 181 + .../radar/email/security/top/tlds/tools.ts | 170 + .../forge-mcp/radar/entities/asns/tools.ts | 399 ++ .../radar/entities/locations/tools.ts | 146 + .../forge-mcp/radar/entities/tools.ts | 63 + .../forge-mcp/radar/geolocations/tools.ts | 128 + .../radar/http/ases/botClass/tools.ts | 234 + .../radar/http/ases/browserFamily/tools.ts | 234 + .../radar/http/ases/deviceType/tools.ts | 234 + .../radar/http/ases/httpMethod/tools.ts | 234 + .../radar/http/ases/httpProtocol/tools.ts | 234 + .../radar/http/ases/ipVersion/tools.ts | 234 + .../forge-mcp/radar/http/ases/os/tools.ts | 234 + .../radar/http/ases/tlsVersion/tools.ts | 234 + .../forge-mcp/radar/http/ases/tools.ts | 235 + .../radar/http/locations/botClass/tools.ts | 234 + .../http/locations/browserFamily/tools.ts | 234 + .../radar/http/locations/deviceType/tools.ts | 234 + .../radar/http/locations/httpMethod/tools.ts | 234 + .../http/locations/httpProtocol/tools.ts | 234 + .../radar/http/locations/ipVersion/tools.ts | 234 + .../radar/http/locations/os/tools.ts | 234 + .../radar/http/locations/tlsVersion/tools.ts | 234 + .../forge-mcp/radar/http/locations/tools.ts | 235 + src/generated/forge-mcp/radar/http/tools.ts | 852 +++ .../radar/leakedCredentials/tools.ts | 331 + .../forge-mcp/radar/netflows/tools.ts | 457 ++ .../forge-mcp/radar/netflows/top/tools.ts | 244 + .../forge-mcp/radar/origins/tools.ts | 540 ++ .../radar/postQuantum/origin/tools.ts | 188 + .../forge-mcp/radar/postQuantum/tls/tools.ts | 54 + .../forge-mcp/radar/quality/iqi/tools.ts | 258 + .../forge-mcp/radar/quality/speed/tools.ts | 198 + .../radar/quality/speed/top/tools.ts | 232 + .../forge-mcp/radar/ranking/domain/tools.ts | 101 + .../radar/ranking/internetServices/tools.ts | 245 + .../forge-mcp/radar/ranking/tools.ts | 224 + .../forge-mcp/radar/robotsTxt/top/tools.ts | 87 + .../radar/robotsTxt/top/userAgents/tools.ts | 104 + src/generated/forge-mcp/radar/search/tools.ts | 118 + .../radar/tcpResetsTimeouts/tools.ts | 227 + .../forge-mcp/radar/tlds/performance/tools.ts | 271 + src/generated/forge-mcp/radar/tlds/tools.ts | 140 + .../radar/trafficAnomalies/locations/tools.ts | 86 + .../forge-mcp/radar/trafficAnomalies/tools.ts | 203 + src/generated/forge-mcp/ready/tools.ts | 31 + .../kit/analytics/livestreams/daily/tools.ts | 67 + .../kit/analytics/livestreams/tools.ts | 67 + .../realtime/kit/analytics/usage/tools.ts | 62 + .../forge-mcp/realtime/kit/apps/tools.ts | 169 + .../kit/livestreams/sessions/tools.ts | 98 + .../realtime/kit/livestreams/tools.ts | 294 + .../kit/meetings/active/polls/tools.ts | 86 + .../realtime/kit/meetings/active/tools.ts | 301 + .../realtime/kit/meetings/livestream/tools.ts | 126 + .../kit/meetings/participants/tokens/tools.ts | 61 + .../kit/meetings/participants/tools.ts | 461 ++ .../realtime/kit/meetings/schemas.ts | 100 + .../forge-mcp/realtime/kit/meetings/tools.ts | 538 ++ .../forge-mcp/realtime/kit/presets/schemas.ts | 1426 +++++ .../forge-mcp/realtime/kit/presets/tools.ts | 433 ++ .../realtime/kit/recordings/active/tools.ts | 55 + .../realtime/kit/recordings/schemas.ts | 21 + .../realtime/kit/recordings/tools.ts | 350 ++ .../realtime/kit/recordings/tracks/schemas.ts | 26 + .../realtime/kit/recordings/tracks/tools.ts | 86 + .../forge-mcp/realtime/kit/schemas.ts | 385 ++ .../realtime/kit/sessions/chat/tools.ts | 56 + .../kit/sessions/livestreams/tools.ts | 67 + .../kit/sessions/participants/tools.ts | 166 + .../realtime/kit/sessions/peers/tools.ts | 76 + .../realtime/kit/sessions/summaries/tools.ts | 100 + .../forge-mcp/realtime/kit/sessions/tools.ts | 167 + .../kit/sessions/transcripts/tools.ts | 70 + .../realtime/kit/webhooks/events/tools.ts | 50 + .../realtime/kit/webhooks/schemas.ts | 88 + .../forge-mcp/realtime/kit/webhooks/tools.ts | 306 + .../forge-mcp/realtime/moq/relays/schemas.ts | 65 + .../realtime/moq/relays/tokens/tools.ts | 167 + .../forge-mcp/realtime/moq/relays/tools.ts | 262 + src/generated/forge-mcp/realtime/schemas.ts | 12 + .../forge-mcp/realtime/sfu/apps/schemas.ts | 18 + .../forge-mcp/realtime/sfu/apps/tools.ts | 217 + .../forge-mcp/realtime/turn/keys/schemas.ts | 26 + .../forge-mcp/realtime/turn/keys/tools.ts | 219 + .../forge-mcp/recentSubmissions/tools.ts | 44 + src/generated/forge-mcp/refute/tools.ts | 43 + .../forge-mcp/registrar/extensions/tools.ts | 112 + .../registrar/registrations/schemas.ts | 292 + .../registrar/registrations/tools.ts | 512 ++ .../registrarSandbox/extensions/tools.ts | 112 + .../registrarSandbox/registrations/schemas.ts | 214 + .../registrarSandbox/registrations/tools.ts | 383 ++ .../forge-mcp/reporting/industry/schemas.ts | 114 + .../forge-mcp/reporting/industry/tools.ts | 90 + .../forge-mcp/reporting/policies/tools.ts | 84 + .../forge-mcp/reporting/reports/tools.ts | 84 + .../forge-mcp/requestTracers/traces/tools.ts | 162 + .../excludedRecipients/schemas.ts | 30 + .../excludedRecipients/tools.ts | 272 + .../resourceSharing/recipients/schemas.ts | 14 + .../resourceSharing/recipients/tools.ts | 287 + .../resourceSharing/resources/schemas.ts | 20 + .../resourceSharing/resources/tools.ts | 297 + .../forge-mcp/resourceSharing/schemas.ts | 105 + .../forge-mcp/resourceSharing/tools.ts | 378 ++ .../rules/lists/bulkOperations/tools.ts | 56 + .../forge-mcp/rules/lists/items/schemas.ts | 250 + .../forge-mcp/rules/lists/items/tools.ts | 344 ++ .../forge-mcp/rules/lists/schemas.ts | 34 + src/generated/forge-mcp/rules/lists/tools.ts | 269 + .../forge-mcp/rulesets/entrypoint/tools.ts | 401 ++ .../rulesets/entrypoint/versions/tools.ts | 143 + .../forge-mcp/rulesets/rules/schemas.ts | 12 + .../forge-mcp/rulesets/rules/tools.ts | 707 +++ src/generated/forge-mcp/rulesets/schemas.ts | 3904 ++++++++++++ src/generated/forge-mcp/rulesets/tools.ts | 761 +++ .../rulesets/versions/byTag/tools.ts | 84 + .../forge-mcp/rulesets/versions/tools.ts | 212 + src/generated/forge-mcp/rum/rules/schemas.ts | 81 + src/generated/forge-mcp/rum/rules/tools.ts | 265 + src/generated/forge-mcp/rum/schemas.ts | 20 + .../forge-mcp/rum/siteInfo/schemas.ts | 114 + src/generated/forge-mcp/rum/siteInfo/tools.ts | 415 ++ src/generated/forge-mcp/scanLogo/tools.ts | 43 + src/generated/forge-mcp/scanPage/tools.ts | 43 + src/generated/forge-mcp/schemas.ts | 5450 +++++++++++++++++ .../forge-mcp/scim/groups/schemas.ts | 150 + src/generated/forge-mcp/scim/groups/tools.ts | 392 ++ .../forge-mcp/scim/resourceTypes/tools.ts | 123 + src/generated/forge-mcp/scim/schemas/tools.ts | 119 + .../scim/serviceProviderConfig/tools.ts | 62 + src/generated/forge-mcp/scim/users/schemas.ts | 202 + src/generated/forge-mcp/scim/users/tools.ts | 393 ++ src/generated/forge-mcp/search/tools.ts | 43 + .../forge-mcp/secretsStore/quota/tools.ts | 52 + .../forge-mcp/secretsStore/secrets/schemas.ts | 151 + .../forge-mcp/secretsStore/secrets/tools.ts | 467 ++ .../forge-mcp/secretsStore/stores/tools.ts | 132 + .../securityInsights/auditLogs/tools.ts | 178 + .../securityInsights/context/tools.ts | 43 + .../forge-mcp/securityInsights/count/tools.ts | 354 ++ .../securityInsights/partners/schemas.ts | 12 + .../partners/settings/schemas.ts | 20 + .../partners/settings/tools.ts | 98 + .../partners/shadowHosts/tools.ts | 71 + .../partners/shadowZoneHosts/tools.ts | 70 + .../partners/shadowZones/tools.ts | 65 + .../securityInsights/scans/schemas.ts | 38 + .../forge-mcp/securityInsights/scans/tools.ts | 91 + .../forge-mcp/securityInsights/schemas.ts | 21 + .../securityInsights/state/schemas.ts | 20 + .../forge-mcp/securityInsights/state/tools.ts | 77 + .../forge-mcp/securityInsights/tools.ts | 236 + .../forge-mcp/securityTxt/schemas.ts | 59 + src/generated/forge-mcp/securityTxt/tools.ts | 122 + src/generated/forge-mcp/signedUrl/tools.ts | 31 + .../smartShield/cacheReserveClear/tools.ts | 114 + .../smartShield/healthChecks/schemas.ts | 403 ++ .../smartShield/healthChecks/tools.ts | 370 ++ .../forge-mcp/smartShield/schemas.ts | 118 + src/generated/forge-mcp/smartShield/tools.ts | 137 + .../forge-mcp/snippets/content/tools.ts | 56 + .../forge-mcp/snippets/rules/schemas.ts | 39 + .../forge-mcp/snippets/rules/tools.ts | 151 + src/generated/forge-mcp/snippets/schemas.ts | 28 + src/generated/forge-mcp/snippets/tools.ts | 161 + .../analytics/aggregates/currents/schemas.ts | 12 + .../analytics/aggregates/currents/tools.ts | 60 + .../analytics/events/bytimes/tools.ts | 110 + .../spectrum/analytics/events/schemas.ts | 60 + .../analytics/events/summaries/tools.ts | 94 + .../forge-mcp/spectrum/analytics/schemas.ts | 40 + .../spectrum/analytics/zones/report/tools.ts | 64 + .../forge-mcp/spectrum/apps/schemas.ts | 366 ++ .../forge-mcp/spectrum/apps/tools.ts | 312 + .../forge-mcp/spectrum/protocols/tools.ts | 45 + .../forge-mcp/speed/availabilities/tools.ts | 51 + .../forge-mcp/speed/pages/tests/tools.ts | 258 + src/generated/forge-mcp/speed/pages/tools.ts | 142 + .../forge-mcp/speed/schedule/tools.ts | 204 + src/generated/forge-mcp/speed/schemas.ts | 67 + src/generated/forge-mcp/sql/tools.ts | 137 + src/generated/forge-mcp/ssl/analyze/tools.ts | 87 + .../forge-mcp/ssl/autoOriginTlsKex/schemas.ts | 29 + .../forge-mcp/ssl/autoOriginTlsKex/tools.ts | 95 + .../ssl/automaticUpgrader/schemas.ts | 33 + .../forge-mcp/ssl/automaticUpgrader/tools.ts | 126 + .../hostnameAssociations/schemas.ts | 30 + .../hostnameAssociations/tools.ts | 111 + .../ssl/certificatePacks/quota/tools.ts | 61 + .../forge-mcp/ssl/certificatePacks/schemas.ts | 74 + .../forge-mcp/ssl/certificatePacks/tools.ts | 388 ++ .../ssl/clientCertificates/schemas.ts | 20 + .../forge-mcp/ssl/clientCertificates/tools.ts | 350 ++ .../forge-mcp/ssl/ctAlerting/schemas.ts | 46 + .../forge-mcp/ssl/ctAlerting/tools.ts | 106 + .../customCertificates/prioritize/tools.ts | 88 + .../ssl/customCertificates/schemas.ts | 78 + .../forge-mcp/ssl/customCertificates/tools.ts | 433 ++ .../forge-mcp/ssl/dcvDelegation/tools.ts | 51 + .../ssl/keylessCertificates/schemas.ts | 29 + .../ssl/keylessCertificates/tools.ts | 412 ++ .../mtlsCertificates/associations/tools.ts | 66 + .../forge-mcp/ssl/mtlsCertificates/schemas.ts | 36 + .../forge-mcp/ssl/mtlsCertificates/tools.ts | 276 + .../ssl/originCaCertificates/schemas.ts | 55 + .../ssl/originCaCertificates/tools.ts | 223 + .../hostnameAssociations/tools.ts | 79 + .../hostnameCertificates/tools.ts | 209 + .../originTlsClientAuth/hostnames/schemas.ts | 35 + .../originTlsClientAuth/hostnames/tools.ts | 125 + .../ssl/originTlsClientAuth/schemas.ts | 59 + .../ssl/originTlsClientAuth/settings/tools.ts | 109 + .../zoneCertificates/schemas.ts | 20 + .../zoneCertificates/tools.ts | 229 + src/generated/forge-mcp/ssl/schemas.ts | 87 + .../ssl/universal/settings/schemas.ts | 25 + .../forge-mcp/ssl/universal/settings/tools.ts | 128 + .../forge-mcp/ssl/verification/schemas.ts | 34 + .../forge-mcp/ssl/verification/tools.ts | 148 + src/generated/forge-mcp/stream/keys/tools.ts | 118 + .../stream/liveInputs/outputs/schemas.ts | 71 + .../stream/liveInputs/outputs/tools.ts | 199 + .../forge-mcp/stream/liveInputs/schemas.ts | 195 + .../forge-mcp/stream/liveInputs/tools.ts | 371 ++ src/generated/forge-mcp/stream/schemas.ts | 60 + src/generated/forge-mcp/stream/tools.ts | 56 + src/generated/forge-mcp/stream/usage/tools.ts | 92 + .../stream/videos/audioTracks/schemas.ts | 58 + .../stream/videos/audioTracks/tools.ts | 197 + .../stream/videos/captions/language/tools.ts | 138 + .../videos/captions/language/vtt/tools.ts | 55 + .../forge-mcp/stream/videos/captions/tools.ts | 50 + .../stream/videos/directUpload/schemas.ts | 55 + .../stream/videos/directUpload/tools.ts | 78 + .../stream/videos/downloads/tools.ts | 93 + .../stream/videos/downloadsDefault/tools.ts | 123 + .../forge-mcp/stream/videos/schemas.ts | 436 ++ .../forge-mcp/stream/videos/token/schemas.ts | 101 + .../forge-mcp/stream/videos/token/tools.ts | 59 + .../forge-mcp/stream/videos/tools.ts | 518 ++ .../forge-mcp/stream/watermarks/tools.ts | 208 + .../forge-mcp/stream/webhooks/schemas.ts | 17 + .../forge-mcp/stream/webhooks/tools.ts | 122 + .../forge-mcp/submissionInfo/tools.ts | 44 + src/generated/forge-mcp/submit/tools.ts | 43 + .../tags/accountResources/schemas.ts | 238 + .../forge-mcp/tags/accountResources/tools.ts | 216 + src/generated/forge-mcp/tags/keys/tools.ts | 54 + .../forge-mcp/tags/resources/tools.ts | 104 + src/generated/forge-mcp/tags/schemas.ts | 85 + src/generated/forge-mcp/tags/summary/tools.ts | 54 + src/generated/forge-mcp/tags/values/tools.ts | 68 + .../forge-mcp/tenant/account/tools.ts | 39 + .../forge-mcp/tenant/accountType/tools.ts | 39 + .../forge-mcp/tenant/entitlement/tools.ts | 39 + src/generated/forge-mcp/tenant/tools.ts | 39 + .../tenantCustomNameservers/tools.ts | 141 + src/generated/forge-mcp/totalQueries/tools.ts | 44 + .../forge-mcp/trackedDomains/tools.ts | 44 + src/generated/forge-mcp/tunnel/tools.ts | 124 + .../forge-mcp/tunnels/config/schemas.ts | 154 + .../forge-mcp/tunnels/config/tools.ts | 117 + .../forge-mcp/tunnels/connections/tools.ts | 106 + .../forge-mcp/tunnels/connectors/tools.ts | 59 + .../tunnels/managementToken/schemas.ts | 15 + .../tunnels/managementToken/tools.ts | 71 + .../forge-mcp/tunnels/token/tools.ts | 51 + src/generated/forge-mcp/tunnels/tools.ts | 338 + .../forge-mcp/turnstile/widgets/schemas.ts | 109 + .../forge-mcp/turnstile/widgets/tools.ts | 484 ++ src/generated/forge-mcp/urlInfo/tools.ts | 44 + .../forge-mcp/urlNormalization/schemas.ts | 35 + .../forge-mcp/urlNormalization/tools.ts | 220 + .../forge-mcp/urlScanner/responses/tools.ts | 56 + .../forge-mcp/urlScanner/scans/tools.ts | 656 ++ .../forge-mcp/user/auditLogs/tools.ts | 130 + .../user/firewall/accessRules/tools.ts | 330 + src/generated/forge-mcp/user/invites/tools.ts | 142 + .../loadBalancers/monitors/preview/tools.ts | 81 + .../monitors/references/tools.ts | 44 + .../user/loadBalancers/monitors/tools.ts | 290 + .../loadBalancers/pools/edit/pools/tools.ts | 214 + .../user/loadBalancers/pools/health/tools.ts | 44 + .../user/loadBalancers/pools/preview/tools.ts | 81 + .../loadBalancers/pools/references/tools.ts | 44 + .../user/loadBalancers/pools/tools.ts | 419 ++ .../user/loadBalancers/preview/tools.ts | 44 + .../user/loadBalancers/regions/tools.ts | 54 + .../loadBalancingAnalytics/events/schemas.ts | 29 + .../loadBalancingAnalytics/events/tools.ts | 89 + .../forge-mcp/user/memberships/schemas.ts | 12 + .../forge-mcp/user/memberships/tools.ts | 267 + src/generated/forge-mcp/user/schemas.ts | 49 + .../forge-mcp/user/subscriptions/tools.ts | 170 + src/generated/forge-mcp/user/tenant/tools.ts | 37 + .../user/tokens/permissionGroups/tools.ts | 66 + src/generated/forge-mcp/user/tokens/tools.ts | 425 ++ src/generated/forge-mcp/user/tools.ts | 134 + .../vectorize/metadataIndex/schemas.ts | 46 + .../vectorize/metadataIndex/tools.ts | 165 + src/generated/forge-mcp/vectorize/schemas.ts | 213 + src/generated/forge-mcp/vectorize/tools.ts | 490 ++ src/generated/forge-mcp/verify/tools.ts | 43 + .../waitingRooms/accountWaitingRooms/tools.ts | 68 + .../waitingRooms/events/details/tools.ts | 59 + .../forge-mcp/waitingRooms/events/schemas.ts | 274 + .../forge-mcp/waitingRooms/events/tools.ts | 390 ++ .../forge-mcp/waitingRooms/page/schemas.ts | 21 + .../forge-mcp/waitingRooms/page/tools.ts | 61 + .../forge-mcp/waitingRooms/rules/schemas.ts | 151 + .../forge-mcp/waitingRooms/rules/tools.ts | 286 + .../forge-mcp/waitingRooms/schemas.ts | 391 ++ .../waitingRooms/settings/schemas.ts | 26 + .../forge-mcp/waitingRooms/settings/tools.ts | 153 + .../forge-mcp/waitingRooms/statuses/tools.ts | 55 + src/generated/forge-mcp/waitingRooms/tools.ts | 338 + .../contentLists/entries/schemas.ts | 29 + .../contentLists/entries/tools.ts | 277 + .../contentLists/schemas.ts | 97 + .../ipfsUniversalPaths/contentLists/tools.ts | 124 + .../forge-mcp/web3/hostnames/schemas.ts | 87 + .../forge-mcp/web3/hostnames/tools.ts | 257 + .../webAssets/discovery/operations/schemas.ts | 66 + .../webAssets/discovery/operations/tools.ts | 286 + .../forge-mcp/webAssets/discovery/tools.ts | 54 + .../labels/managed/operations/tools.ts | 76 + .../webAssets/labels/managed/tools.ts | 69 + .../forge-mcp/webAssets/labels/schemas.ts | 20 + .../forge-mcp/webAssets/labels/tools.ts | 107 + .../webAssets/labels/user/operations/tools.ts | 76 + .../webAssets/labels/user/schemas.ts | 62 + .../forge-mcp/webAssets/labels/user/tools.ts | 323 + .../webAssets/operations/labels/schemas.ts | 251 + .../webAssets/operations/labels/tools.ts | 341 ++ .../forge-mcp/webAssets/operations/schemas.ts | 26 + .../forge-mcp/webAssets/operations/tools.ts | 388 ++ src/generated/forge-mcp/webAssets/schemas.ts | 75 + .../forge-mcp/webAssets/schemas/tools.ts | 89 + .../workers/accountSettings/schemas.ts | 19 + .../workers/accountSettings/tools.ts | 121 + .../forge-mcp/workers/assets/upload/tools.ts | 65 + .../forge-mcp/workers/deployments/schemas.ts | 68 + .../forge-mcp/workers/deployments/tools.ts | 251 + .../forge-mcp/workers/domains/tools.ts | 249 + .../workers/legacy/scripts/content/tools.ts | 60 + .../scripts/scriptAndVersionSettings/tools.ts | 62 + .../legacy/scripts/settings/schemas.ts | 55 + .../workers/legacy/scripts/settings/tools.ts | 135 + .../workers/legacy/scripts/subdomain/tools.ts | 172 + .../forge-mcp/workers/legacy/scripts/tools.ts | 165 + .../legacy/scripts/usageModel/schemas.ts | 32 + .../legacy/scripts/usageModel/tools.ts | 130 + .../workers/legacy/scripts/versions/tools.ts | 135 + .../workers/placement/regions/tools.ts | 49 + .../workers/previews/deployments/schemas.ts | 265 + .../workers/previews/deployments/tools.ts | 555 ++ .../forge-mcp/workers/previews/schemas.ts | 196 + .../forge-mcp/workers/previews/tools.ts | 430 ++ .../forge-mcp/workers/routes/tools.ts | 229 + src/generated/forge-mcp/workers/schemas.ts | 516 ++ .../workers/scripts/schedules/schemas.ts | 19 + .../workers/scripts/schedules/tools.ts | 119 + .../forge-mcp/workers/scripts/tools.ts | 89 + .../forge-mcp/workers/secrets/tools.ts | 298 + .../forge-mcp/workers/subdomains/schemas.ts | 19 + .../forge-mcp/workers/subdomains/tools.ts | 131 + src/generated/forge-mcp/workers/tail/tools.ts | 160 + src/generated/forge-mcp/workers/tools.ts | 514 ++ .../workers/versions/latest/tools.ts | 247 + .../forge-mcp/workers/versions/schemas.ts | 277 + .../forge-mcp/workers/versions/tools.ts | 489 ++ .../workersBuilds/workers/previews/schemas.ts | 46 + .../workersBuilds/workers/previews/tools.ts | 326 + .../workersBuilds/workers/schemas.ts | 18 + .../forge-mcp/workersBuilds/workers/tools.ts | 61 + .../dispatchNamespaces/schemas.ts | 12 + .../scripts/assets/upload/tools.ts | 68 + .../scripts/bindings/tools.ts | 56 + .../scripts/content/tools.ts | 59 + .../scripts/secrets/tools.ts | 290 + .../scripts/settings/tools.ts | 56 + .../scripts/tags/schemas.ts | 20 + .../dispatchNamespaces/scripts/tags/tools.ts | 281 + .../dispatchNamespaces/scripts/tools.ts | 210 + .../dispatchNamespaces/tools.ts | 294 + .../forge-mcp/workersVpc/services/schemas.ts | 301 + .../forge-mcp/workersVpc/services/tools.ts | 247 + .../forge-mcp/workflows/concurrency/tools.ts | 342 ++ .../workflows/instances/batch/tools.ts | 130 + .../workflows/instances/events/tools.ts | 76 + .../workflows/instances/step/tools.ts | 97 + .../forge-mcp/workflows/instances/tools.ts | 945 +++ .../forge-mcp/workflows/settings/tools.ts | 153 + src/generated/forge-mcp/workflows/tools.ts | 198 + .../forge-mcp/workflows/versions/tools.ts | 209 + .../forge-mcp/zaraz/config/schemas.ts | 168 + src/generated/forge-mcp/zaraz/config/tools.ts | 146 + .../forge-mcp/zaraz/default/tools.ts | 46 + src/generated/forge-mcp/zaraz/export/tools.ts | 46 + .../forge-mcp/zaraz/history/configs/tools.ts | 57 + .../forge-mcp/zaraz/history/tools.ts | 119 + .../forge-mcp/zaraz/publish/tools.ts | 58 + src/generated/forge-mcp/zaraz/schemas.ts | 1035 ++++ .../forge-mcp/zaraz/workflow/schemas.ts | 16 + .../forge-mcp/zaraz/workflow/tools.ts | 90 + .../access/applications/policies/tools.ts | 161 + .../applications/policyTests/schemas.ts | 26 + .../access/applications/policyTests/tools.ts | 237 + .../applications/policyTests/users/tools.ts | 73 + .../zeroTrust/access/applications/schemas.ts | 3417 +++++++++++ .../access/applications/settings/schemas.ts | 21 + .../access/applications/settings/tools.ts | 64 + .../shortLivedCertificates/tools.ts | 193 + .../zeroTrust/access/applications/tools.ts | 830 +++ .../applications/userPolicyChecks/tools.ts | 53 + .../zeroTrust/access/customPages/schemas.ts | 112 + .../zeroTrust/access/customPages/tools.ts | 297 + .../auditSshSettings/schemas.ts | 12 + .../infrastructure/auditSshSettings/tools.ts | 115 + .../access/infrastructure/sshCa/tools.ts | 118 + .../access/logs/accessRequests/schemas.ts | 21 + .../access/logs/accessRequests/tools.ts | 205 + .../access/logs/jitRequests/schemas.ts | 19 + .../access/logs/jitRequests/tools.ts | 113 + .../access/logs/scim/updates/schemas.ts | 144 + .../access/logs/scim/updates/tools.ts | 149 + .../access/mfa/authenticatorCatalog/tools.ts | 39 + .../access/mtlsCertificates/schemas.ts | 23 + .../mtlsCertificates/settings/schemas.ts | 31 + .../access/mtlsCertificates/settings/tools.ts | 107 + .../access/mtlsCertificates/tools.ts | 281 + .../zeroTrust/access/policies/tools.ts | 440 ++ .../zeroTrust/access/ruleGroups/schemas.ts | 53 + .../zeroTrust/access/ruleGroups/tools.ts | 479 ++ .../samlEncryptionCertificates/tools.ts | 160 + .../forge-mcp/zeroTrust/access/schemas.ts | 1293 ++++ .../zeroTrust/access/serviceTokens/schemas.ts | 45 + .../zeroTrust/access/serviceTokens/tools.ts | 407 ++ .../zeroTrust/access/signingKeys/schemas.ts | 12 + .../zeroTrust/access/signingKeys/tools.ts | 131 + .../zeroTrust/access/tags/schemas.ts | 35 + .../forge-mcp/zeroTrust/access/tags/tools.ts | 214 + .../zeroTrust/access/targets/bulk/schemas.ts | 27 + .../zeroTrust/access/targets/bulk/tools.ts | 195 + .../zeroTrust/access/targets/schemas.ts | 80 + .../zeroTrust/access/targets/tools.ts | 481 ++ .../access/userPopulations/schemas.ts | 28 + .../zeroTrust/access/userPopulations/tools.ts | 221 + .../access/userPopulations/users/schemas.ts | 164 + .../access/userPopulations/users/tools.ts | 332 + .../access/users/activeSessions/tools.ts | 92 + .../access/users/failedLogins/tools.ts | 49 + .../access/users/lastSeenIdentity/tools.ts | 49 + .../forge-mcp/zeroTrust/access/users/tools.ts | 330 + .../casb/applications/authMethods/tools.ts | 77 + .../zeroTrust/casb/applications/tools.ts | 114 + .../zeroTrust/casb/assetSchemas/tools.ts | 111 + .../zeroTrust/casb/content/schemas.ts | 156 + .../forge-mcp/zeroTrust/casb/content/tools.ts | 171 + .../forge-mcp/zeroTrust/casb/exports/tools.ts | 106 + .../findingTypes/remediationTypes/tools.ts | 74 + .../zeroTrust/casb/findingTypes/schemas.ts | 138 + .../zeroTrust/casb/findingTypes/tools.ts | 370 ++ .../casb/findings/instances/schemas.ts | 87 + .../casb/findings/instances/tools.ts | 339 + .../zeroTrust/casb/findings/schemas.ts | 178 + .../zeroTrust/casb/findings/tools.ts | 440 ++ .../zeroTrust/casb/integrations/schemas.ts | 135 + .../zeroTrust/casb/integrations/tools.ts | 341 ++ .../zeroTrust/casb/policies/schemas.ts | 159 + .../zeroTrust/casb/policies/tools.ts | 236 + .../casb/remediations/jobs/schemas.ts | 120 + .../zeroTrust/casb/remediations/jobs/tools.ts | 221 + .../forge-mcp/zeroTrust/casb/schemas.ts | 137 + .../zeroTrust/casb/webhooks/jobs/schemas.ts | 35 + .../zeroTrust/casb/webhooks/jobs/tools.ts | 53 + .../zeroTrust/casb/webhooks/schemas.ts | 180 + .../zeroTrust/casb/webhooks/tools.ts | 307 + .../zeroTrust/connectivitySettings/schemas.ts | 20 + .../zeroTrust/connectivitySettings/tools.ts | 103 + .../cws/basicAuthCredentials/schemas.ts | 20 + .../basicAuthCredentials/secrets/schemas.ts | 32 + .../cws/basicAuthCredentials/secrets/tools.ts | 215 + .../cws/basicAuthCredentials/tools.ts | 204 + .../zeroTrust/cws/deployments/schemas.ts | 192 + .../zeroTrust/cws/deployments/tools.ts | 247 + .../zeroTrust/cws/domainAcls/schemas.ts | 109 + .../zeroTrust/cws/domainAcls/tools.ts | 256 + .../zeroTrust/cws/policies/schemas.ts | 88 + .../forge-mcp/zeroTrust/cws/policies/tools.ts | 258 + .../zeroTrust/cws/policySets/schemas.ts | 174 + .../zeroTrust/cws/policySets/tools.ts | 256 + .../zeroTrust/cws/regoMetadata/schemas.ts | 91 + .../zeroTrust/cws/regoMetadata/tools.ts | 257 + .../zeroTrust/cws/regoModules/schemas.ts | 46 + .../zeroTrust/cws/regoModules/tools.ts | 252 + .../cws/tenantStructures/nodes/schemas.ts | 110 + .../cws/tenantStructures/nodes/tools.ts | 343 ++ .../zeroTrust/cws/tenantStructures/schemas.ts | 62 + .../zeroTrust/cws/tenantStructures/tools.ts | 252 + .../zeroTrust/cws/workloads/schemas.ts | 68 + .../zeroTrust/cws/workloads/tools.ts | 253 + .../targetEnvironments/tools.ts | 38 + .../zeroTrust/devices/clientVersions/tools.ts | 68 + .../devices/deploymentGroups/schemas.ts | 99 + .../devices/deploymentGroups/tools.ts | 211 + .../devices/emergencyDisconnect/schemas.ts | 41 + .../devices/emergencyDisconnect/tools.ts | 94 + .../zeroTrust/devices/ipProfiles/schemas.ts | 124 + .../zeroTrust/devices/ipProfiles/tools.ts | 237 + .../zeroTrust/devices/networks/schemas.ts | 52 + .../zeroTrust/devices/networks/tools.ts | 239 + .../devices/overrideCodes/schemas.ts | 42 + .../zeroTrust/devices/overrideCodes/tools.ts | 50 + .../devices/posture/integrations/schemas.ts | 295 + .../devices/posture/integrations/tools.ts | 272 + .../devices/posture/rules/schemas.ts | 975 +++ .../zeroTrust/devices/posture/rules/tools.ts | 372 ++ .../devices/profiles/custom/schemas.ts | 69 + .../devices/profiles/custom/tools.ts | 609 ++ .../devices/profiles/default/tools.ts | 254 + .../zeroTrust/devices/profiles/schemas.ts | 461 ++ .../registrations/overrideCodes/tools.ts | 48 + .../zeroTrust/devices/registrations/tools.ts | 257 + .../forge-mcp/zeroTrust/devices/schemas.ts | 32 + .../zeroTrust/devices/settings/schemas.ts | 49 + .../zeroTrust/devices/settings/tools.ts | 113 + .../forge-mcp/zeroTrust/devices/tools.ts | 262 + .../forge-mcp/zeroTrust/dex/colos/tools.ts | 70 + .../dex/commands/eligibleDevices/tools.ts | 67 + .../zeroTrust/dex/commands/quota/tools.ts | 47 + .../zeroTrust/dex/commands/results/tools.ts | 57 + .../forge-mcp/zeroTrust/dex/commands/tools.ts | 236 + .../dex/devices/aggregates/live/tools.ts | 60 + .../dex/devices/aggregates/overTime/tools.ts | 81 + .../zeroTrust/dex/devices/overTime/tools.ts | 89 + .../zeroTrust/dex/devices/schemas.ts | 82 + .../forge-mcp/zeroTrust/dex/devices/tools.ts | 213 + .../forge-mcp/zeroTrust/dex/isps/tools.ts | 102 + .../zeroTrust/dex/overview/tests/tools.ts | 93 + .../dex/overview/tests/uniqueDevices/tools.ts | 62 + .../forge-mcp/zeroTrust/dex/rules/schemas.ts | 48 + .../forge-mcp/zeroTrust/dex/rules/tools.ts | 262 + .../forge-mcp/zeroTrust/dex/schemas.ts | 84 + .../dex/testResults/http/percentiles/tools.ts | 79 + .../zeroTrust/dex/testResults/http/tools.ts | 89 + .../traceroute/networkPath/tools.ts | 52 + .../traceroute/percentiles/tools.ts | 79 + .../dex/testResults/traceroute/tools.ts | 89 + .../zeroTrust/dex/tests/networkPath/tools.ts | 82 + .../forge-mcp/zeroTrust/dex/tests/schemas.ts | 116 + .../forge-mcp/zeroTrust/dex/tests/tools.ts | 274 + .../zeroTrust/dex/warpChangeEvents/tools.ts | 112 + .../dlp/customPromptTopics/schemas.ts | 74 + .../zeroTrust/dlp/customPromptTopics/tools.ts | 223 + .../zeroTrust/dlp/dataClasses/schemas.ts | 114 + .../zeroTrust/dlp/dataClasses/tools.ts | 214 + .../dlp/dataTagCategories/schemas.ts | 131 + .../zeroTrust/dlp/dataTagCategories/tools.ts | 218 + .../dlp/dataTagCategoryTemplates/tools.ts | 89 + .../zeroTrust/dlp/dataTags/schemas.ts | 33 + .../forge-mcp/zeroTrust/dlp/dataTags/tools.ts | 237 + .../zeroTrust/dlp/datasets/schemas.ts | 77 + .../forge-mcp/zeroTrust/dlp/datasets/tools.ts | 249 + .../dlp/documentFingerprints/schemas.ts | 66 + .../dlp/documentFingerprints/tools.ts | 214 + .../dlp/email/accountMapping/schemas.ts | 62 + .../dlp/email/accountMapping/tools.ts | 88 + .../zeroTrust/dlp/email/rules/schemas.ts | 157 + .../zeroTrust/dlp/email/rules/tools.ts | 271 + .../zeroTrust/dlp/entries/schemas.ts | 184 + .../forge-mcp/zeroTrust/dlp/entries/tools.ts | 221 + .../forge-mcp/zeroTrust/dlp/limits/tools.ts | 44 + .../zeroTrust/dlp/patterns/schemas.ts | 30 + .../forge-mcp/zeroTrust/dlp/patterns/tools.ts | 54 + .../zeroTrust/dlp/profiles/custom/schemas.ts | 384 ++ .../zeroTrust/dlp/profiles/custom/tools.ts | 172 + .../dlp/profiles/predefined/schemas.ts | 74 + .../dlp/profiles/predefined/tools.ts | 65 + .../zeroTrust/dlp/profiles/schemas.ts | 44 + .../forge-mcp/zeroTrust/dlp/profiles/tools.ts | 90 + .../forge-mcp/zeroTrust/dlp/schemas.ts | 105 + .../dlp/sensitivityGroupTemplates/tools.ts | 89 + .../dlp/sensitivityGroups/schemas.ts | 151 + .../zeroTrust/dlp/sensitivityGroups/tools.ts | 305 + .../dlp/sensitivityLevels/schemas.ts | 33 + .../zeroTrust/dlp/sensitivityLevels/tools.ts | 237 + .../zeroTrust/dlp/settings/schemas.ts | 80 + .../forge-mcp/zeroTrust/dlp/settings/tools.ts | 170 + .../dlp/validators/proximityWords/schemas.ts | 29 + .../dlp/validators/proximityWords/tools.ts | 216 + .../zeroTrust/dlp/validators/schemas.ts | 68 + .../zeroTrust/dlp/validators/tools.ts | 101 + .../dlp/validators/worker/schemas.ts | 29 + .../dlp/validators/worker/status/tools.ts | 49 + .../zeroTrust/dlp/validators/worker/tools.ts | 214 + .../zeroTrust/gateway/appTypes/tools.ts | 45 + .../zeroTrust/gateway/categories/tools.ts | 45 + .../zeroTrust/gateway/certificates/schemas.ts | 17 + .../zeroTrust/gateway/certificates/tools.ts | 212 + .../gateway/configurations/schemas.ts | 617 ++ .../zeroTrust/gateway/configurations/tools.ts | 176 + .../gateway/dnsDestinationIps/tools.ts | 46 + .../zeroTrust/gateway/lists/items/tools.ts | 58 + .../zeroTrust/gateway/lists/schemas.ts | 76 + .../zeroTrust/gateway/lists/tools.ts | 343 ++ .../zeroTrust/gateway/locations/schemas.ts | 289 + .../zeroTrust/gateway/locations/tools.ts | 386 ++ .../zeroTrust/gateway/logging/schemas.ts | 64 + .../zeroTrust/gateway/logging/tools.ts | 83 + .../zeroTrust/gateway/pacfiles/schemas.ts | 28 + .../zeroTrust/gateway/pacfiles/tools.ts | 274 + .../gateway/proxyEndpoints/schemas.ts | 70 + .../zeroTrust/gateway/proxyEndpoints/tools.ts | 261 + .../zeroTrust/gateway/rules/schemas.ts | 869 +++ .../zeroTrust/gateway/rules/tools.ts | 484 ++ .../forge-mcp/zeroTrust/gateway/schemas.ts | 12 + .../forge-mcp/zeroTrust/gateway/tools.ts | 79 + .../federationGrants/schemas.ts | 21 + .../federationGrants/tools.ts | 154 + .../samlCertificate/tools.ts | 44 + .../zeroTrust/identityProviders/schemas.ts | 1371 +++++ .../identityProviders/scim/groups/schemas.ts | 36 + .../identityProviders/scim/groups/tools.ts | 178 + .../identityProviders/scim/users/schemas.ts | 52 + .../identityProviders/scim/users/tools.ts | 192 + .../zeroTrust/identityProviders/tools.ts | 339 + .../zeroTrust/organization/doh/schemas.ts | 12 + .../zeroTrust/organization/doh/tools.ts | 98 + .../zeroTrust/organization/schemas.ts | 300 + .../forge-mcp/zeroTrust/organization/tools.ts | 370 ++ .../riskScoring/behaviours/schemas.ts | 41 + .../zeroTrust/riskScoring/behaviours/tools.ts | 91 + .../integrations/references/tools.ts | 48 + .../riskScoring/integrations/schemas.ts | 77 + .../riskScoring/integrations/tools.ts | 214 + .../zeroTrust/riskScoring/schemas.ts | 16 + .../zeroTrust/riskScoring/summary/tools.ts | 43 + .../forge-mcp/zeroTrust/riskScoring/tools.ts | 86 + src/generated/forge-mcp/zeroTrust/schemas.ts | 56 + .../forge-mcp/zeroTrust/seats/schemas.ts | 64 + .../forge-mcp/zeroTrust/seats/tools.ts | 62 + .../users/mfa/authenticators/tools.ts | 52 + .../zeroTrust/users/passkeys/tools.ts | 52 + src/generated/forge-mcp/zone/tools.ts | 44 + .../forge-mcp/zones/aegis/schemas.ts | 22 + src/generated/forge-mcp/zones/aegis/tools.ts | 132 + .../automaticPlatformOptimization/schemas.ts | 61 + .../automaticPlatformOptimization/tools.ts | 129 + .../forge-mcp/zones/binaryAst/schemas.ts | 17 + .../forge-mcp/zones/binaryAst/tools.ts | 129 + .../forge-mcp/zones/fonts/schemas.ts | 16 + src/generated/forge-mcp/zones/fonts/tools.ts | 130 + .../zones/h2Prioritization/schemas.ts | 17 + .../forge-mcp/zones/h2Prioritization/tools.ts | 129 + src/generated/forge-mcp/zones/holds/tools.ts | 230 + .../zones/hostnames/settings/schemas.ts | 30 + .../zones/hostnames/settings/tls/tools.ts | 204 + .../hostnames/settings/tlsSingle/tools.ts | 57 + .../forge-mcp/zones/imageResizing/schemas.ts | 18 + .../forge-mcp/zones/imageResizing/tools.ts | 129 + .../zones/originH2MaxStreams/schemas.ts | 12 + .../zones/originH2MaxStreams/tools.ts | 132 + .../zones/originMaxHttpVersion/schemas.ts | 16 + .../zones/originMaxHttpVersion/tools.ts | 132 + .../zones/originTlsComplianceModes/schemas.ts | 16 + .../zones/originTlsComplianceModes/tools.ts | 193 + src/generated/forge-mcp/zones/plans/tools.ts | 117 + .../forge-mcp/zones/ratePlans/tools.ts | 61 + src/generated/forge-mcp/zones/rum/schemas.ts | 17 + src/generated/forge-mcp/zones/rum/tools.ts | 100 + src/generated/forge-mcp/zones/schemas.ts | 53 + .../forge-mcp/zones/settings/schemas.ts | 1133 ++++ .../forge-mcp/zones/settings/tools.ts | 266 + .../forge-mcp/zones/speedBrain/tools.ts | 129 + .../forge-mcp/zones/subscriptions/tools.ts | 259 + src/generated/forge-mcp/zones/tools.ts | 413 ++ .../transformationsAllowedOrigins/schemas.ts | 12 + .../transformationsAllowedOrigins/tools.ts | 109 + .../zones/transformationsC2pa/schemas.ts | 16 + .../zones/transformationsC2pa/tools.ts | 109 + .../zones/transformationsConfig/schemas.ts | 36 + .../zones/transformationsConfig/tools.ts | 109 + src/isolate-cache.ts | 16 - src/tools/forge-tools.ts | 100 +- tests/forge-tools-cloudflare.test.ts | 81 + tests/forge-tools-plugin.test.ts | 52 - tests/forge-tools-worker.test.ts | 87 +- tests/helpers/forge-tools.ts | 68 - vendor/cloudflare-forge-mcp-0.1.0.tgz | Bin 711994 -> 0 bytes 1584 files changed, 291658 insertions(+), 4308 deletions(-) create mode 100644 .github/workflows/forge-tools.yml create mode 100644 forge.json delete mode 100644 scripts/forge-tools.ts delete mode 100644 src/forge-tools/cloudflare-plugin.ts create mode 100644 src/forge-tools/cloudflare.ts delete mode 100644 src/forge-tools/plugin-entry.ts create mode 100644 src/generated/forge-mcp/README.md create mode 100644 src/generated/forge-mcp/_/index.ts create mode 100644 src/generated/forge-mcp/_/server.ts create mode 100644 src/generated/forge-mcp/_/tool.ts create mode 100644 src/generated/forge-mcp/abuseReports/appeals/tools.ts create mode 100644 src/generated/forge-mcp/abuseReports/emails/tools.ts create mode 100644 src/generated/forge-mcp/abuseReports/mitigations/schemas.ts create mode 100644 src/generated/forge-mcp/abuseReports/mitigations/tools.ts create mode 100644 src/generated/forge-mcp/abuseReports/schemas.ts create mode 100644 src/generated/forge-mcp/abuseReports/tools.ts create mode 100644 src/generated/forge-mcp/accounts/applications/schemas.ts create mode 100644 src/generated/forge-mcp/accounts/applications/tools.ts create mode 100644 src/generated/forge-mcp/accounts/billing/history/tools.ts create mode 100644 src/generated/forge-mcp/accounts/billing/paymentMethods/schemas.ts create mode 100644 src/generated/forge-mcp/accounts/billing/paymentMethods/tools.ts create mode 100644 src/generated/forge-mcp/accounts/billing/tools.ts create mode 100644 src/generated/forge-mcp/accounts/categories/tools.ts create mode 100644 src/generated/forge-mcp/accounts/logs/audit/tools.ts create mode 100644 src/generated/forge-mcp/accounts/members/schemas.ts create mode 100644 src/generated/forge-mcp/accounts/members/tools.ts create mode 100644 src/generated/forge-mcp/accounts/organization/tools.ts create mode 100644 src/generated/forge-mcp/accounts/profile/tools.ts create mode 100644 src/generated/forge-mcp/accounts/schemas.ts create mode 100644 src/generated/forge-mcp/accounts/subscriptions/schemas.ts create mode 100644 src/generated/forge-mcp/accounts/subscriptions/tools.ts create mode 100644 src/generated/forge-mcp/accounts/tokens/permissionGroups/tools.ts create mode 100644 src/generated/forge-mcp/accounts/tokens/tools.ts create mode 100644 src/generated/forge-mcp/accounts/tools.ts create mode 100644 src/generated/forge-mcp/accounts/transformations/tools.ts create mode 100644 src/generated/forge-mcp/accounts/utBilling/schemas.ts create mode 100644 src/generated/forge-mcp/accounts/utBilling/tools.ts create mode 100644 src/generated/forge-mcp/acm/customTrustStore/schemas.ts create mode 100644 src/generated/forge-mcp/acm/customTrustStore/tools.ts create mode 100644 src/generated/forge-mcp/acm/totalTls/schemas.ts create mode 100644 src/generated/forge-mcp/acm/totalTls/tools.ts create mode 100644 src/generated/forge-mcp/addressing/addressMaps/accounts/tools.ts create mode 100644 src/generated/forge-mcp/addressing/addressMaps/ips/tools.ts create mode 100644 src/generated/forge-mcp/addressing/addressMaps/schemas.ts create mode 100644 src/generated/forge-mcp/addressing/addressMaps/tools.ts create mode 100644 src/generated/forge-mcp/addressing/addressMaps/zones/schemas.ts create mode 100644 src/generated/forge-mcp/addressing/addressMaps/zones/tools.ts create mode 100644 src/generated/forge-mcp/addressing/leases/tools.ts create mode 100644 src/generated/forge-mcp/addressing/loaDocuments/tools.ts create mode 100644 src/generated/forge-mcp/addressing/prefixes/bgpPrefixes/schemas.ts create mode 100644 src/generated/forge-mcp/addressing/prefixes/bgpPrefixes/tools.ts create mode 100644 src/generated/forge-mcp/addressing/prefixes/delegations/schemas.ts create mode 100644 src/generated/forge-mcp/addressing/prefixes/delegations/tools.ts create mode 100644 src/generated/forge-mcp/addressing/prefixes/schemas.ts create mode 100644 src/generated/forge-mcp/addressing/prefixes/serviceBindings/schemas.ts create mode 100644 src/generated/forge-mcp/addressing/prefixes/serviceBindings/tools.ts create mode 100644 src/generated/forge-mcp/addressing/prefixes/tools.ts create mode 100644 src/generated/forge-mcp/addressing/prefixes/validate/tools.ts create mode 100644 src/generated/forge-mcp/addressing/regionalHostnames/regions/tools.ts create mode 100644 src/generated/forge-mcp/addressing/regionalHostnames/schemas.ts create mode 100644 src/generated/forge-mcp/addressing/regionalHostnames/tools.ts create mode 100644 src/generated/forge-mcp/addressing/schemas.ts create mode 100644 src/generated/forge-mcp/addressing/services/tools.ts create mode 100644 src/generated/forge-mcp/agentMemory/tools.ts create mode 100644 src/generated/forge-mcp/ai/authors/tools.ts create mode 100644 src/generated/forge-mcp/ai/finetunes/assets/tools.ts create mode 100644 src/generated/forge-mcp/ai/finetunes/public/tools.ts create mode 100644 src/generated/forge-mcp/ai/finetunes/tools.ts create mode 100644 src/generated/forge-mcp/ai/models/tools.ts create mode 100644 src/generated/forge-mcp/ai/tasks/tools.ts create mode 100644 src/generated/forge-mcp/ai/tools.ts create mode 100644 src/generated/forge-mcp/aiAudit/robots/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/customDomains/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/customProviders/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/datasets/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/dynamicRouting/deployments/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/dynamicRouting/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/dynamicRouting/versions/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/evaluationTypes/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/evaluations/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/gateways/providers/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/gateways/tools.ts create mode 100644 src/generated/forge-mcp/aiGateway/logs/tools.ts create mode 100644 src/generated/forge-mcp/aiSearch/items/tools.ts create mode 100644 src/generated/forge-mcp/aiSearch/jobs/tools.ts create mode 100644 src/generated/forge-mcp/aiSearch/namespace/tools.ts create mode 100644 src/generated/forge-mcp/aiSearch/tokens/tools.ts create mode 100644 src/generated/forge-mcp/aiSearch/tools.ts create mode 100644 src/generated/forge-mcp/aiSecurity/customTopics/schemas.ts create mode 100644 src/generated/forge-mcp/aiSecurity/customTopics/tools.ts create mode 100644 src/generated/forge-mcp/aiSecurity/schemas.ts create mode 100644 src/generated/forge-mcp/aiSecurity/tools.ts create mode 100644 src/generated/forge-mcp/alerting/availableAlerts/tools.ts create mode 100644 src/generated/forge-mcp/alerting/destinations/eligible/tools.ts create mode 100644 src/generated/forge-mcp/alerting/destinations/pagerduty/tools.ts create mode 100644 src/generated/forge-mcp/alerting/destinations/webhooks/schemas.ts create mode 100644 src/generated/forge-mcp/alerting/destinations/webhooks/tools.ts create mode 100644 src/generated/forge-mcp/alerting/history/schemas.ts create mode 100644 src/generated/forge-mcp/alerting/history/tools.ts create mode 100644 src/generated/forge-mcp/alerting/policies/email/tools.ts create mode 100644 src/generated/forge-mcp/alerting/policies/schemas.ts create mode 100644 src/generated/forge-mcp/alerting/policies/tools.ts create mode 100644 src/generated/forge-mcp/alerting/schemas.ts create mode 100644 src/generated/forge-mcp/alerting/silences/schemas.ts create mode 100644 src/generated/forge-mcp/alerting/silences/tools.ts create mode 100644 src/generated/forge-mcp/alerts/clear/tools.ts create mode 100644 src/generated/forge-mcp/alerts/refute/tools.ts create mode 100644 src/generated/forge-mcp/alerts/tools.ts create mode 100644 src/generated/forge-mcp/alerts/verify/tools.ts create mode 100644 src/generated/forge-mcp/analytics/latency/colos/tools.ts create mode 100644 src/generated/forge-mcp/analytics/latency/tools.ts create mode 100644 src/generated/forge-mcp/analytics/query/dataSecurity/contentFindings/schemas.ts create mode 100644 src/generated/forge-mcp/analytics/query/dataSecurity/contentFindings/tools.ts create mode 100644 src/generated/forge-mcp/analytics/query/dataSecurity/findings/schemas.ts create mode 100644 src/generated/forge-mcp/analytics/query/dataSecurity/findings/tools.ts create mode 100644 src/generated/forge-mcp/analytics/query/schemas.ts create mode 100644 src/generated/forge-mcp/analytics/query/tools.ts create mode 100644 src/generated/forge-mcp/analytics/sql/accounts/introspection/tools.ts create mode 100644 src/generated/forge-mcp/analytics/sql/accounts/tools.ts create mode 100644 src/generated/forge-mcp/analytics/sql/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/hosts/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/operations/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/schemaValidation/schemas/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/schemaValidation/settings/operations/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/schemaValidation/settings/operations/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/schemaValidation/settings/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/schemaValidation/settings/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/sessionIdentifiers/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/sessionIdentifiers/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/credentials/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/credentials/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/tokenValidation/configurations/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/tokenValidation/rules/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/tokenValidation/rules/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/credentials/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/credentials/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/credentialSets/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/scans/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/scans/tools.ts create mode 100644 src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/targetEnvironments/schemas.ts create mode 100644 src/generated/forge-mcp/apiSecurity/vulnerabilityScanner/targetEnvironments/tools.ts create mode 100644 src/generated/forge-mcp/argo/smartRouting/schemas.ts create mode 100644 src/generated/forge-mcp/argo/smartRouting/tools.ts create mode 100644 src/generated/forge-mcp/argo/tieredCaching/schemas.ts create mode 100644 src/generated/forge-mcp/argo/tieredCaching/tools.ts create mode 100644 src/generated/forge-mcp/artifacts/namespaces/repos/blobs/tools.ts create mode 100644 src/generated/forge-mcp/artifacts/namespaces/repos/commits/tools.ts create mode 100644 src/generated/forge-mcp/artifacts/namespaces/repos/files/tools.ts create mode 100644 src/generated/forge-mcp/artifacts/namespaces/repos/logs/tools.ts create mode 100644 src/generated/forge-mcp/artifacts/namespaces/repos/raw/tools.ts create mode 100644 src/generated/forge-mcp/artifacts/namespaces/repos/tokens/tools.ts create mode 100644 src/generated/forge-mcp/artifacts/namespaces/repos/tools.ts create mode 100644 src/generated/forge-mcp/artifacts/namespaces/repos/trees/tools.ts create mode 100644 src/generated/forge-mcp/artifacts/namespaces/tokens/tools.ts create mode 100644 src/generated/forge-mcp/artifacts/namespaces/tools.ts create mode 100644 src/generated/forge-mcp/auditLogs/tools.ts create mode 100644 src/generated/forge-mcp/basinCatalog/credentials/tools.ts create mode 100644 src/generated/forge-mcp/basinCatalog/maintenanceConfigs/tools.ts create mode 100644 src/generated/forge-mcp/basinCatalog/namespaces/tables/maintenanceConfigs/tools.ts create mode 100644 src/generated/forge-mcp/basinCatalog/namespaces/tables/maintenanceRuns/tools.ts create mode 100644 src/generated/forge-mcp/basinCatalog/namespaces/tables/tools.ts create mode 100644 src/generated/forge-mcp/basinCatalog/namespaces/tools.ts create mode 100644 src/generated/forge-mcp/basinCatalog/tools.ts create mode 100644 src/generated/forge-mcp/billing/addresses/schemas.ts create mode 100644 src/generated/forge-mcp/billing/addresses/tools.ts create mode 100644 src/generated/forge-mcp/billing/profiles/schemas.ts create mode 100644 src/generated/forge-mcp/billing/profiles/tools.ts create mode 100644 src/generated/forge-mcp/billing/ratePlans/tools.ts create mode 100644 src/generated/forge-mcp/billing/usage/schemas.ts create mode 100644 src/generated/forge-mcp/billing/usage/tools.ts create mode 100644 src/generated/forge-mcp/botManagement/feedback/schemas.ts create mode 100644 src/generated/forge-mcp/botManagement/feedback/tools.ts create mode 100644 src/generated/forge-mcp/botManagement/schemas.ts create mode 100644 src/generated/forge-mcp/botManagement/tools.ts create mode 100644 src/generated/forge-mcp/botnetFeed/asn/schemas.ts create mode 100644 src/generated/forge-mcp/botnetFeed/asn/tools.ts create mode 100644 src/generated/forge-mcp/botnetFeed/configs/asn/tools.ts create mode 100644 src/generated/forge-mcp/brandProtection/logoMatches/tools.ts create mode 100644 src/generated/forge-mcp/brandProtection/logos/tools.ts create mode 100644 src/generated/forge-mcp/brandProtection/matches/tools.ts create mode 100644 src/generated/forge-mcp/brandProtection/queries/tools.ts create mode 100644 src/generated/forge-mcp/brandProtection/tools.ts create mode 100644 src/generated/forge-mcp/brandProtection/trial/tools.ts create mode 100644 src/generated/forge-mcp/brands/patterns/tools.ts create mode 100644 src/generated/forge-mcp/brands/tools.ts create mode 100644 src/generated/forge-mcp/browserRun/crawl/tools.ts create mode 100644 src/generated/forge-mcp/browserRun/devtools/browser/liveView/tools.ts create mode 100644 src/generated/forge-mcp/browserRun/devtools/browser/targets/tools.ts create mode 100644 src/generated/forge-mcp/browserRun/devtools/browser/tools.ts create mode 100644 src/generated/forge-mcp/browserRun/devtools/json/tools.ts create mode 100644 src/generated/forge-mcp/browserRun/devtools/session/tools.ts create mode 100644 src/generated/forge-mcp/browserRun/quickAction/tools.ts create mode 100644 src/generated/forge-mcp/browserRun/recording/network/tools.ts create mode 100644 src/generated/forge-mcp/browserRun/recording/tools.ts create mode 100644 src/generated/forge-mcp/builds/deployHooks/schemas.ts create mode 100644 src/generated/forge-mcp/builds/deployHooks/tools.ts create mode 100644 src/generated/forge-mcp/builds/limits/tools.ts create mode 100644 src/generated/forge-mcp/builds/logs/schemas.ts create mode 100644 src/generated/forge-mcp/builds/logs/tools.ts create mode 100644 src/generated/forge-mcp/builds/repos/configAutofill/tools.ts create mode 100644 src/generated/forge-mcp/builds/repos/connections/schemas.ts create mode 100644 src/generated/forge-mcp/builds/repos/connections/tools.ts create mode 100644 src/generated/forge-mcp/builds/schemas.ts create mode 100644 src/generated/forge-mcp/builds/tokens/schemas.ts create mode 100644 src/generated/forge-mcp/builds/tokens/tools.ts create mode 100644 src/generated/forge-mcp/builds/tools.ts create mode 100644 src/generated/forge-mcp/builds/triggers/cache/tools.ts create mode 100644 src/generated/forge-mcp/builds/triggers/environmentVariables/tools.ts create mode 100644 src/generated/forge-mcp/builds/triggers/schemas.ts create mode 100644 src/generated/forge-mcp/builds/triggers/tools.ts create mode 100644 src/generated/forge-mcp/builds/versions/schemas.ts create mode 100644 src/generated/forge-mcp/builds/versions/tools.ts create mode 100644 src/generated/forge-mcp/builds/workers/schemas.ts create mode 100644 src/generated/forge-mcp/builds/workers/tools.ts create mode 100644 src/generated/forge-mcp/cache/originCloudRegions/schemas.ts create mode 100644 src/generated/forge-mcp/cache/originCloudRegions/tools.ts create mode 100644 src/generated/forge-mcp/cache/schemas.ts create mode 100644 src/generated/forge-mcp/cache/settings/regionalTieredCache/schemas.ts create mode 100644 src/generated/forge-mcp/cache/settings/regionalTieredCache/tools.ts create mode 100644 src/generated/forge-mcp/cache/settings/reserve/schemas.ts create mode 100644 src/generated/forge-mcp/cache/settings/reserve/tools.ts create mode 100644 src/generated/forge-mcp/cache/settings/smartTieredCache/schemas.ts create mode 100644 src/generated/forge-mcp/cache/settings/smartTieredCache/tools.ts create mode 100644 src/generated/forge-mcp/cache/settings/variants/schemas.ts create mode 100644 src/generated/forge-mcp/cache/settings/variants/tools.ts create mode 100644 src/generated/forge-mcp/cache/tools.ts create mode 100644 src/generated/forge-mcp/clear/tools.ts create mode 100644 src/generated/forge-mcp/clientSideSecurity/connections/tools.ts create mode 100644 src/generated/forge-mcp/clientSideSecurity/cookies/tools.ts create mode 100644 src/generated/forge-mcp/clientSideSecurity/policies/schemas.ts create mode 100644 src/generated/forge-mcp/clientSideSecurity/policies/tools.ts create mode 100644 src/generated/forge-mcp/clientSideSecurity/scripts/tools.ts create mode 100644 src/generated/forge-mcp/clientSideSecurity/settings/schemas.ts create mode 100644 src/generated/forge-mcp/clientSideSecurity/settings/tools.ts create mode 100644 src/generated/forge-mcp/cloudConnector/rules/schemas.ts create mode 100644 src/generated/forge-mcp/cloudConnector/rules/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/binaryStorage/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/credentialMonitor/domains/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/credentialMonitor/matches/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/aggregate/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/categories/catalog/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/categories/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/copy/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/events/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/groups/get/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/groups/members/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/groups/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/indicators/bulk/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/indicators/create/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/indicators/get/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/indicators/relationships/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/indicators/tags/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/indicators/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/move/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/permissions/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/tags/indicators/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/target/industries/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/dataset/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/datasets/populate/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/delete/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/graphql/create/graph/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/indicator/types/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/indicators/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/queries/get/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/queries/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/raw/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/relate/create/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/relationships/create/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/relationships/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/schemas.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/tags/categories/actors/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/tags/categories/create/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/tags/categories/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/tags/relationships/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/tags/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/target/industries/catalog/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/events/update/bulk/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/priorityIntelligence/constants/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/priorityIntelligence/filters/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/priorityIntelligence/interests/backtests/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/priorityIntelligence/interests/evaluations/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/priorityIntelligence/interests/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/priorityIntelligence/matches/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/priorityIntelligence/quota/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/priorityIntelligence/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/requests/assets/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/requests/constants/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/requests/legalResponse/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/requests/messages/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/requests/metadata/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/requests/quota/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/requests/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/requests/types/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/requests/user/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/approvals/schemas.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/approvals/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/email/approvals/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/email/schema/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/email/schemas.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/email/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/exemptions/schemas.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/exemptions/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/managed/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/schemas.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/stats/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/rules/tree/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/scans/config/schemas.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/scans/config/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/scans/results/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/attackers/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/categories/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/countries/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/datasets/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/eventTags/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/indicatorTypes/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/raw/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/relate/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/tags/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/targetIndustries/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatEvents/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatSignals/articles/skills/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatSignals/articles/tags/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatSignals/articles/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatSignals/categories/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatSignals/feeds/skills/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatSignals/feeds/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatSignals/indicators/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatSignals/skills/tagCategories/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatSignals/skills/tools.ts create mode 100644 src/generated/forge-mcp/cloudforceOne/threatSignals/tools.ts create mode 100644 src/generated/forge-mcp/connectorInterrupts/schemas.ts create mode 100644 src/generated/forge-mcp/connectorInterrupts/tools.ts create mode 100644 src/generated/forge-mcp/connectorTelemetryEvents/tools.ts create mode 100644 src/generated/forge-mcp/connectorTelemetrySnapshots/tools.ts create mode 100644 src/generated/forge-mcp/connectors/schemas.ts create mode 100644 src/generated/forge-mcp/connectors/tools.ts create mode 100644 src/generated/forge-mcp/containers/applications/instances/tools.ts create mode 100644 src/generated/forge-mcp/containers/applications/rollouts/schemas.ts create mode 100644 src/generated/forge-mcp/containers/applications/rollouts/tools.ts create mode 100644 src/generated/forge-mcp/containers/applications/schemas.ts create mode 100644 src/generated/forge-mcp/containers/applications/tools.ts create mode 100644 src/generated/forge-mcp/containers/applications/versions/tools.ts create mode 100644 src/generated/forge-mcp/containers/images/schemas.ts create mode 100644 src/generated/forge-mcp/containers/images/tools.ts create mode 100644 src/generated/forge-mcp/containers/registries/credentials/schemas.ts create mode 100644 src/generated/forge-mcp/containers/registries/credentials/tools.ts create mode 100644 src/generated/forge-mcp/containers/registries/schemas.ts create mode 100644 src/generated/forge-mcp/containers/registries/tools.ts create mode 100644 src/generated/forge-mcp/containers/schemas.ts create mode 100644 src/generated/forge-mcp/contentScan/expressions/schemas.ts create mode 100644 src/generated/forge-mcp/contentScan/expressions/tools.ts create mode 100644 src/generated/forge-mcp/contentScan/tools.ts create mode 100644 src/generated/forge-mcp/cps/schemas.ts create mode 100644 src/generated/forge-mcp/cps/tools.ts create mode 100644 src/generated/forge-mcp/csamScanner/schemas.ts create mode 100644 src/generated/forge-mcp/csamScanner/tools.ts create mode 100644 src/generated/forge-mcp/customCsrs/schemas.ts create mode 100644 src/generated/forge-mcp/customCsrs/tools.ts create mode 100644 src/generated/forge-mcp/customHostnames/certificatePack/certificates/tools.ts create mode 100644 src/generated/forge-mcp/customHostnames/fallbackOrigin/schemas.ts create mode 100644 src/generated/forge-mcp/customHostnames/fallbackOrigin/tools.ts create mode 100644 src/generated/forge-mcp/customHostnames/quota/tools.ts create mode 100644 src/generated/forge-mcp/customHostnames/schemas.ts create mode 100644 src/generated/forge-mcp/customHostnames/tools.ts create mode 100644 src/generated/forge-mcp/customNameservers/tools.ts create mode 100644 src/generated/forge-mcp/customPages/accountAssets/schemas.ts create mode 100644 src/generated/forge-mcp/customPages/accountAssets/tools.ts create mode 100644 src/generated/forge-mcp/customPages/accountCustomPages/previewTokens/schemas.ts create mode 100644 src/generated/forge-mcp/customPages/accountCustomPages/previewTokens/tools.ts create mode 100644 src/generated/forge-mcp/customPages/accountCustomPages/schemas.ts create mode 100644 src/generated/forge-mcp/customPages/accountCustomPages/tools.ts create mode 100644 src/generated/forge-mcp/d1/schemas.ts create mode 100644 src/generated/forge-mcp/d1/timeTravel/schemas.ts create mode 100644 src/generated/forge-mcp/d1/timeTravel/tools.ts create mode 100644 src/generated/forge-mcp/d1/tools.ts create mode 100644 src/generated/forge-mcp/diagnostics/endpointHealthchecks/schemas.ts create mode 100644 src/generated/forge-mcp/diagnostics/endpointHealthchecks/tools.ts create mode 100644 src/generated/forge-mcp/diagnostics/traceroutes/schemas.ts create mode 100644 src/generated/forge-mcp/diagnostics/traceroutes/tools.ts create mode 100644 src/generated/forge-mcp/dls/regionalServices/prefixBindings/schemas.ts create mode 100644 src/generated/forge-mcp/dls/regionalServices/prefixBindings/tools.ts create mode 100644 src/generated/forge-mcp/dls/regions/tools.ts create mode 100644 src/generated/forge-mcp/dns/dnssec/list/tools.ts create mode 100644 src/generated/forge-mcp/dns/dnssec/schemas.ts create mode 100644 src/generated/forge-mcp/dns/dnssec/tools.ts create mode 100644 src/generated/forge-mcp/dns/records/schemas.ts create mode 100644 src/generated/forge-mcp/dns/records/tools.ts create mode 100644 src/generated/forge-mcp/dns/settings/account/nameserverSets/schemas.ts create mode 100644 src/generated/forge-mcp/dns/settings/account/nameserverSets/tools.ts create mode 100644 src/generated/forge-mcp/dns/settings/account/schemas.ts create mode 100644 src/generated/forge-mcp/dns/settings/account/tools.ts create mode 100644 src/generated/forge-mcp/dns/settings/account/views/schemas.ts create mode 100644 src/generated/forge-mcp/dns/settings/account/views/tools.ts create mode 100644 src/generated/forge-mcp/dns/usage/account/tools.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/acls/schemas.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/acls/tools.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/forceAxfr/tools.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/incoming/schemas.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/incoming/tools.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/outgoing/schemas.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/outgoing/status/tools.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/outgoing/tools.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/peers/schemas.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/peers/tools.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/schemas.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/tsigs/schemas.ts create mode 100644 src/generated/forge-mcp/dns/zoneTransfers/tsigs/tools.ts create mode 100644 src/generated/forge-mcp/dnsFirewall/reverseDns/schemas.ts create mode 100644 src/generated/forge-mcp/dnsFirewall/reverseDns/tools.ts create mode 100644 src/generated/forge-mcp/dnsFirewall/schemas.ts create mode 100644 src/generated/forge-mcp/dnsFirewall/tools.ts create mode 100644 src/generated/forge-mcp/domainInfo/tools.ts create mode 100644 src/generated/forge-mcp/durableObjects/namespaces/objects/tools.ts create mode 100644 src/generated/forge-mcp/durableObjects/namespaces/schemas.ts create mode 100644 src/generated/forge-mcp/durableObjects/namespaces/tools.ts create mode 100644 src/generated/forge-mcp/emailAuth/dmarcReports/schemas.ts create mode 100644 src/generated/forge-mcp/emailAuth/dmarcReports/tools.ts create mode 100644 src/generated/forge-mcp/emailAuth/schemas.ts create mode 100644 src/generated/forge-mcp/emailAuth/spf/tools.ts create mode 100644 src/generated/forge-mcp/emailRouting/addresses/schemas.ts create mode 100644 src/generated/forge-mcp/emailRouting/addresses/tools.ts create mode 100644 src/generated/forge-mcp/emailRouting/dns/tools.ts create mode 100644 src/generated/forge-mcp/emailRouting/rules/catchAll/schemas.ts create mode 100644 src/generated/forge-mcp/emailRouting/rules/catchAll/tools.ts create mode 100644 src/generated/forge-mcp/emailRouting/rules/schemas.ts create mode 100644 src/generated/forge-mcp/emailRouting/rules/tools.ts create mode 100644 src/generated/forge-mcp/emailRouting/schemas.ts create mode 100644 src/generated/forge-mcp/emailRouting/settings/schemas.ts create mode 100644 src/generated/forge-mcp/emailRouting/settings/tools.ts create mode 100644 src/generated/forge-mcp/emailRouting/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/allowPolicies/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/allowPolicies/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/analytics/monthlyReport/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/blockSenders/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/blockSenders/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/bulkActions/messages/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/bulkActions/messages/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/bulkActions/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/bulkActions/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/contentPolicies/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/contentPolicies/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/domains/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/domains/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/domains/verification/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/impersonationRegistry/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/impersonationRegistry/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/investigate/actionLog/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/investigate/detections/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/investigate/preview/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/investigate/raw/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/investigate/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/investigate/trace/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/phishguard/reports/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/sendingDomainRestrictions/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/sendingDomainRestrictions/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/submissions/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/submissions/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/trustedDomains/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/trustedDomains/tools.ts create mode 100644 src/generated/forge-mcp/emailSecurity/urlIgnorePatterns/schemas.ts create mode 100644 src/generated/forge-mcp/emailSecurity/urlIgnorePatterns/tools.ts create mode 100644 src/generated/forge-mcp/emailSending/limits/tools.ts create mode 100644 src/generated/forge-mcp/emailSending/reputation/tools.ts create mode 100644 src/generated/forge-mcp/emailSending/schemas.ts create mode 100644 src/generated/forge-mcp/emailSending/subdomains/dns/tools.ts create mode 100644 src/generated/forge-mcp/emailSending/subdomains/reputation/tools.ts create mode 100644 src/generated/forge-mcp/emailSending/subdomains/schemas.ts create mode 100644 src/generated/forge-mcp/emailSending/subdomains/tools.ts create mode 100644 src/generated/forge-mcp/emailSending/suppressions/tools.ts create mode 100644 src/generated/forge-mcp/emailSending/tools.ts create mode 100644 src/generated/forge-mcp/fieldExtractors/tools.ts create mode 100644 src/generated/forge-mcp/firewall/accessRules/schemas.ts create mode 100644 src/generated/forge-mcp/firewall/accessRules/tools.ts create mode 100644 src/generated/forge-mcp/firewall/lockdowns/schemas.ts create mode 100644 src/generated/forge-mcp/firewall/lockdowns/tools.ts create mode 100644 src/generated/forge-mcp/firewall/schemas.ts create mode 100644 src/generated/forge-mcp/firewall/uaRules/schemas.ts create mode 100644 src/generated/forge-mcp/firewall/uaRules/tools.ts create mode 100644 src/generated/forge-mcp/flagship/apps/definitions/tools.ts create mode 100644 src/generated/forge-mcp/flagship/apps/evaluate/tools.ts create mode 100644 src/generated/forge-mcp/flagship/apps/flags/changelog/tools.ts create mode 100644 src/generated/forge-mcp/flagship/apps/flags/tools.ts create mode 100644 src/generated/forge-mcp/flagship/apps/schemas.ts create mode 100644 src/generated/forge-mcp/flagship/apps/tools.ts create mode 100644 src/generated/forge-mcp/fraud/schemas.ts create mode 100644 src/generated/forge-mcp/fraud/tools.ts create mode 100644 src/generated/forge-mcp/googleTagGateway/config/schemas.ts create mode 100644 src/generated/forge-mcp/googleTagGateway/config/tools.ts create mode 100644 src/generated/forge-mcp/healthchecks/previews/tools.ts create mode 100644 src/generated/forge-mcp/healthchecks/schemas.ts create mode 100644 src/generated/forge-mcp/healthchecks/tools.ts create mode 100644 src/generated/forge-mcp/hyperdrive/integration/planetscale/tools.ts create mode 100644 src/generated/forge-mcp/hyperdrive/schemas.ts create mode 100644 src/generated/forge-mcp/hyperdrive/tools.ts create mode 100644 src/generated/forge-mcp/iam/permissionGroups/tools.ts create mode 100644 src/generated/forge-mcp/iam/resourceGroups/schemas.ts create mode 100644 src/generated/forge-mcp/iam/resourceGroups/tools.ts create mode 100644 src/generated/forge-mcp/iam/schemas.ts create mode 100644 src/generated/forge-mcp/iam/sso/schemas.ts create mode 100644 src/generated/forge-mcp/iam/sso/tools.ts create mode 100644 src/generated/forge-mcp/iam/userGroups/members/schemas.ts create mode 100644 src/generated/forge-mcp/iam/userGroups/members/tools.ts create mode 100644 src/generated/forge-mcp/iam/userGroups/schemas.ts create mode 100644 src/generated/forge-mcp/iam/userGroups/tools.ts create mode 100644 src/generated/forge-mcp/images/flows/tools.ts create mode 100644 src/generated/forge-mcp/images/import/schemas.ts create mode 100644 src/generated/forge-mcp/images/import/sources/schemas.ts create mode 100644 src/generated/forge-mcp/images/import/sources/tools.ts create mode 100644 src/generated/forge-mcp/images/import/tools.ts create mode 100644 src/generated/forge-mcp/images/keys/tools.ts create mode 100644 src/generated/forge-mcp/images/schemas.ts create mode 100644 src/generated/forge-mcp/images/tools.ts create mode 100644 src/generated/forge-mcp/images/variants/schemas.ts create mode 100644 src/generated/forge-mcp/images/variants/tools.ts create mode 100644 src/generated/forge-mcp/index.ts create mode 100644 src/generated/forge-mcp/intel/asn/subnets/tools.ts create mode 100644 src/generated/forge-mcp/intel/asn/tools.ts create mode 100644 src/generated/forge-mcp/intel/attackSurfaceReport/issueTypes/tools.ts create mode 100644 src/generated/forge-mcp/intel/dns/schemas.ts create mode 100644 src/generated/forge-mcp/intel/dns/tools.ts create mode 100644 src/generated/forge-mcp/intel/domainHistory/tools.ts create mode 100644 src/generated/forge-mcp/intel/domains/bulks/tools.ts create mode 100644 src/generated/forge-mcp/intel/domains/tools.ts create mode 100644 src/generated/forge-mcp/intel/indicatorFeeds/downloads/tools.ts create mode 100644 src/generated/forge-mcp/intel/indicatorFeeds/permissions/schemas.ts create mode 100644 src/generated/forge-mcp/intel/indicatorFeeds/permissions/tools.ts create mode 100644 src/generated/forge-mcp/intel/indicatorFeeds/providers/schemas.ts create mode 100644 src/generated/forge-mcp/intel/indicatorFeeds/providers/tools.ts create mode 100644 src/generated/forge-mcp/intel/indicatorFeeds/schemas.ts create mode 100644 src/generated/forge-mcp/intel/indicatorFeeds/tools.ts create mode 100644 src/generated/forge-mcp/intel/ipLists/tools.ts create mode 100644 src/generated/forge-mcp/intel/ips/tools.ts create mode 100644 src/generated/forge-mcp/intel/miscategorizations/schemas.ts create mode 100644 src/generated/forge-mcp/intel/miscategorizations/tools.ts create mode 100644 src/generated/forge-mcp/intel/sinkholes/ingresses/schemas.ts create mode 100644 src/generated/forge-mcp/intel/sinkholes/ingresses/tools.ts create mode 100644 src/generated/forge-mcp/intel/sinkholes/schemas.ts create mode 100644 src/generated/forge-mcp/intel/sinkholes/tools.ts create mode 100644 src/generated/forge-mcp/intel/urls/tools.ts create mode 100644 src/generated/forge-mcp/intel/whois/tools.ts create mode 100644 src/generated/forge-mcp/internal/submit/tools.ts create mode 100644 src/generated/forge-mcp/ips/tools.ts create mode 100644 src/generated/forge-mcp/k2/streams/schemas.ts create mode 100644 src/generated/forge-mcp/k2/streams/subscriptions/tools.ts create mode 100644 src/generated/forge-mcp/k2/streams/tools.ts create mode 100644 src/generated/forge-mcp/kv/bulk/schemas.ts create mode 100644 src/generated/forge-mcp/kv/bulk/tools.ts create mode 100644 src/generated/forge-mcp/kv/keys/tools.ts create mode 100644 src/generated/forge-mcp/kv/metadata/tools.ts create mode 100644 src/generated/forge-mcp/kv/namespaces/schemas.ts create mode 100644 src/generated/forge-mcp/kv/namespaces/tools.ts create mode 100644 src/generated/forge-mcp/kv/schemas.ts create mode 100644 src/generated/forge-mcp/leakedCredentialChecks/detections/schemas.ts create mode 100644 src/generated/forge-mcp/leakedCredentialChecks/detections/tools.ts create mode 100644 src/generated/forge-mcp/leakedCredentialChecks/schemas.ts create mode 100644 src/generated/forge-mcp/leakedCredentialChecks/tools.ts create mode 100644 src/generated/forge-mcp/live/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/account/schemas.ts create mode 100644 src/generated/forge-mcp/loadBalancers/account/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/account/usage/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/monitorGroups/references/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/monitorGroups/schemas.ts create mode 100644 src/generated/forge-mcp/loadBalancers/monitorGroups/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/monitors/previews/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/monitors/references/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/monitors/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/pools/health/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/pools/references/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/pools/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/previews/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/regions/tools.ts create mode 100644 src/generated/forge-mcp/loadBalancers/searches/tools.ts create mode 100644 src/generated/forge-mcp/logoMatches/download/tools.ts create mode 100644 src/generated/forge-mcp/logoMatches/tools.ts create mode 100644 src/generated/forge-mcp/logos/tools.ts create mode 100644 src/generated/forge-mcp/logpush/accountDatasets/fields/tools.ts create mode 100644 src/generated/forge-mcp/logpush/accountDatasets/jobs/tools.ts create mode 100644 src/generated/forge-mcp/logpush/accountJobs/schemas.ts create mode 100644 src/generated/forge-mcp/logpush/accountJobs/tools.ts create mode 100644 src/generated/forge-mcp/logpush/accountOwnership/tools.ts create mode 100644 src/generated/forge-mcp/logpush/accountOwnership/validate/tools.ts create mode 100644 src/generated/forge-mcp/logpush/accountValidate/destination/tools.ts create mode 100644 src/generated/forge-mcp/logpush/accountValidate/origin/tools.ts create mode 100644 src/generated/forge-mcp/logpush/accountValidate/tools.ts create mode 100644 src/generated/forge-mcp/logpush/edge/schemas.ts create mode 100644 src/generated/forge-mcp/logpush/edge/tools.ts create mode 100644 src/generated/forge-mcp/logpush/schemas.ts create mode 100644 src/generated/forge-mcp/logpush/transformers/content/tools.ts create mode 100644 src/generated/forge-mcp/logpush/transformers/schemas.ts create mode 100644 src/generated/forge-mcp/logpush/transformers/tools.ts create mode 100644 src/generated/forge-mcp/logpush/transformers/versions/tools.ts create mode 100644 src/generated/forge-mcp/logs/control/cmb/config/schemas.ts create mode 100644 src/generated/forge-mcp/logs/control/cmb/config/tools.ts create mode 100644 src/generated/forge-mcp/logs/control/retention/schemas.ts create mode 100644 src/generated/forge-mcp/logs/control/retention/tools.ts create mode 100644 src/generated/forge-mcp/logs/datasets/schemas.ts create mode 100644 src/generated/forge-mcp/logs/datasets/tools.ts create mode 100644 src/generated/forge-mcp/logs/list/schemas.ts create mode 100644 src/generated/forge-mcp/logs/list/tools.ts create mode 100644 src/generated/forge-mcp/logs/rayid/tools.ts create mode 100644 src/generated/forge-mcp/logs/received/fields/tools.ts create mode 100644 src/generated/forge-mcp/logs/received/schemas.ts create mode 100644 src/generated/forge-mcp/logs/received/tools.ts create mode 100644 src/generated/forge-mcp/logs/retrieve/tools.ts create mode 100644 src/generated/forge-mcp/logs/schemas.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/catalogSyncs/prebuiltPolicies/tools.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/catalogSyncs/schemas.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/catalogSyncs/tools.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/cloudIntegrations/schemas.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/cloudIntegrations/tools.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/onRamps/addressSpaces/schemas.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/onRamps/addressSpaces/tools.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/onRamps/schemas.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/onRamps/tools.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/resources/schemas.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/resources/tools.ts create mode 100644 src/generated/forge-mcp/magicCloudNetworking/schemas.ts create mode 100644 src/generated/forge-mcp/magicNetworkMonitoring/configs/full/tools.ts create mode 100644 src/generated/forge-mcp/magicNetworkMonitoring/configs/schemas.ts create mode 100644 src/generated/forge-mcp/magicNetworkMonitoring/configs/tools.ts create mode 100644 src/generated/forge-mcp/magicNetworkMonitoring/rules/advertisements/tools.ts create mode 100644 src/generated/forge-mcp/magicNetworkMonitoring/rules/bulk/tools.ts create mode 100644 src/generated/forge-mcp/magicNetworkMonitoring/rules/schemas.ts create mode 100644 src/generated/forge-mcp/magicNetworkMonitoring/rules/tools.ts create mode 100644 src/generated/forge-mcp/magicNetworkMonitoring/vpcFlows/tokens/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedDnsProtection/configs/dns/protection/rules/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedDnsProtection/configs/dns/protection/rules/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/allowlist/prefix/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/allowlist/prefix/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/allowlist/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/allowlist/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/prefixes/bulk/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/prefixes/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/prefixes/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/syn/protection/filters/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/syn/protection/rules/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/syn/protection/rules/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/tcp/flow/protection/filters/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/tcp/flow/protection/rules/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/tcp/flow/protection/rules/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/tcp/protection/status/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/advancedTcpProtection/configs/tcp/protection/status/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/apps/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/apps/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/bgpFilterProfiles/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/bgpFilterProfiles/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/bgpSettings/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/bgpSettings/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/cf1Sites/ramps/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/cf1Sites/ramps/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/cf1Sites/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/cf1Sites/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/cfInterconnects/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/cfInterconnects/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/greTunnels/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/greTunnels/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/ipsecTunnels/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/ipsecTunnels/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/pcaps/download/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/pcaps/ownership/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/pcaps/ownership/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/pcaps/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/pcaps/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/redundancyGroups/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/redundancyGroups/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/routes/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/routes/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/acls/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/acls/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/appConfiguration/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/appConfiguration/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/lans/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/lans/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/netflowConfig/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/netflowConfig/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/tools.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/wans/schemas.ts create mode 100644 src/generated/forge-mcp/magicTransit/sites/wans/tools.ts create mode 100644 src/generated/forge-mcp/managedDefense/vulnerabilityDiscovery/reports/tools.ts create mode 100644 src/generated/forge-mcp/managedDefense/vulnerabilityDiscovery/repositories/schemas.ts create mode 100644 src/generated/forge-mcp/managedDefense/vulnerabilityDiscovery/repositories/tools.ts create mode 100644 src/generated/forge-mcp/managedDefense/vulnerabilityDiscovery/scans/schemas.ts create mode 100644 src/generated/forge-mcp/managedDefense/vulnerabilityDiscovery/scans/tools.ts create mode 100644 src/generated/forge-mcp/managedDefense/vulnerabilityDiscovery/schemas.ts create mode 100644 src/generated/forge-mcp/managedTransforms/schemas.ts create mode 100644 src/generated/forge-mcp/managedTransforms/tools.ts create mode 100644 src/generated/forge-mcp/matches/download/tools.ts create mode 100644 src/generated/forge-mcp/matches/tools.ts create mode 100644 src/generated/forge-mcp/mcp/portals/tools.ts create mode 100644 src/generated/forge-mcp/mcp/servers/tools.ts create mode 100644 src/generated/forge-mcp/media/usage/tools.ts create mode 100644 src/generated/forge-mcp/mesh/nodes/configurations/schemas.ts create mode 100644 src/generated/forge-mcp/mesh/nodes/configurations/tools.ts create mode 100644 src/generated/forge-mcp/mesh/nodes/connections/tools.ts create mode 100644 src/generated/forge-mcp/mesh/nodes/connectors/tools.ts create mode 100644 src/generated/forge-mcp/mesh/nodes/schemas.ts create mode 100644 src/generated/forge-mcp/mesh/nodes/token/tools.ts create mode 100644 src/generated/forge-mcp/mesh/nodes/tools.ts create mode 100644 src/generated/forge-mcp/monetization/accountEligibility/schemas.ts create mode 100644 src/generated/forge-mcp/monetization/accountEligibility/tools.ts create mode 100644 src/generated/forge-mcp/monetization/rules/schemas.ts create mode 100644 src/generated/forge-mcp/monetization/rules/tools.ts create mode 100644 src/generated/forge-mcp/network/routes/cidr/tools.ts create mode 100644 src/generated/forge-mcp/network/routes/hostname/schemas.ts create mode 100644 src/generated/forge-mcp/network/routes/hostname/tools.ts create mode 100644 src/generated/forge-mcp/network/routes/schemas.ts create mode 100644 src/generated/forge-mcp/network/routes/tools.ts create mode 100644 src/generated/forge-mcp/network/schemas.ts create mode 100644 src/generated/forge-mcp/network/subnets/cloudflareSource/tools.ts create mode 100644 src/generated/forge-mcp/network/subnets/initialResolvedIp/tools.ts create mode 100644 src/generated/forge-mcp/network/subnets/schemas.ts create mode 100644 src/generated/forge-mcp/network/subnets/tools.ts create mode 100644 src/generated/forge-mcp/network/subnets/warp/tools.ts create mode 100644 src/generated/forge-mcp/network/virtualNetworks/schemas.ts create mode 100644 src/generated/forge-mcp/network/virtualNetworks/tools.ts create mode 100644 src/generated/forge-mcp/networkInterconnects/cnis/schemas.ts create mode 100644 src/generated/forge-mcp/networkInterconnects/cnis/tools.ts create mode 100644 src/generated/forge-mcp/networkInterconnects/interconnects/schemas.ts create mode 100644 src/generated/forge-mcp/networkInterconnects/interconnects/tools.ts create mode 100644 src/generated/forge-mcp/networkInterconnects/schemas.ts create mode 100644 src/generated/forge-mcp/networkInterconnects/settings/schemas.ts create mode 100644 src/generated/forge-mcp/networkInterconnects/settings/tools.ts create mode 100644 src/generated/forge-mcp/networkInterconnects/slots/tools.ts create mode 100644 src/generated/forge-mcp/o11y/agents/sessions/tools.ts create mode 100644 src/generated/forge-mcp/o11y/destinations/tools.ts create mode 100644 src/generated/forge-mcp/o11y/issues/automations/tools.ts create mode 100644 src/generated/forge-mcp/o11y/issues/tools.ts create mode 100644 src/generated/forge-mcp/o11y/metricsExport/tools.ts create mode 100644 src/generated/forge-mcp/o11y/queries/tools.ts create mode 100644 src/generated/forge-mcp/o11y/schemas.ts create mode 100644 src/generated/forge-mcp/o11y/sharedQueries/tools.ts create mode 100644 src/generated/forge-mcp/o11y/telemetry/tools.ts create mode 100644 src/generated/forge-mcp/o11y/tools.ts create mode 100644 src/generated/forge-mcp/o11y/tracing/rules/tools.ts create mode 100644 src/generated/forge-mcp/o11y/tracing/settings/tools.ts create mode 100644 src/generated/forge-mcp/oauthClients/schemas.ts create mode 100644 src/generated/forge-mcp/oauthClients/tools.ts create mode 100644 src/generated/forge-mcp/oauthScopes/tools.ts create mode 100644 src/generated/forge-mcp/organization/account/tools.ts create mode 100644 src/generated/forge-mcp/organization/invite/schemas.ts create mode 100644 src/generated/forge-mcp/organization/invite/tools.ts create mode 100644 src/generated/forge-mcp/organization/member/batch/schemas.ts create mode 100644 src/generated/forge-mcp/organization/member/batch/tools.ts create mode 100644 src/generated/forge-mcp/organization/member/schemas.ts create mode 100644 src/generated/forge-mcp/organization/member/tools.ts create mode 100644 src/generated/forge-mcp/organization/profile/schemas.ts create mode 100644 src/generated/forge-mcp/organization/profile/tools.ts create mode 100644 src/generated/forge-mcp/organization/share/tools.ts create mode 100644 src/generated/forge-mcp/organization/tools.ts create mode 100644 src/generated/forge-mcp/organizations/billing/usage/tools.ts create mode 100644 src/generated/forge-mcp/organizations/logs/audit/tools.ts create mode 100644 src/generated/forge-mcp/pageRules/schemas.ts create mode 100644 src/generated/forge-mcp/pageRules/tools.ts create mode 100644 src/generated/forge-mcp/pages/buildCache/tools.ts create mode 100644 src/generated/forge-mcp/pages/deployments/history/logs/tools.ts create mode 100644 src/generated/forge-mcp/pages/deployments/tools.ts create mode 100644 src/generated/forge-mcp/pages/domains/schemas.ts create mode 100644 src/generated/forge-mcp/pages/domains/tools.ts create mode 100644 src/generated/forge-mcp/pages/domains/validation/tools.ts create mode 100644 src/generated/forge-mcp/pages/schemas.ts create mode 100644 src/generated/forge-mcp/pages/source/schemas.ts create mode 100644 src/generated/forge-mcp/pages/source/tools.ts create mode 100644 src/generated/forge-mcp/pages/tools.ts create mode 100644 src/generated/forge-mcp/payPerCrawl/config/schemas.ts create mode 100644 src/generated/forge-mcp/payPerCrawl/config/tools.ts create mode 100644 src/generated/forge-mcp/payPerCrawl/crawler/stripe/tools.ts create mode 100644 src/generated/forge-mcp/payPerCrawl/crawlers/tools.ts create mode 100644 src/generated/forge-mcp/payPerCrawl/publisher/stripe/tools.ts create mode 100644 src/generated/forge-mcp/payPerCrawl/terms/tools.ts create mode 100644 src/generated/forge-mcp/payPerCrawl/zones/schemas.ts create mode 100644 src/generated/forge-mcp/payPerCrawl/zones/tools.ts create mode 100644 src/generated/forge-mcp/payPerUse/enabledDomains/tools.ts create mode 100644 src/generated/forge-mcp/payPerUse/operator/schemas.ts create mode 100644 src/generated/forge-mcp/payPerUse/operator/tools.ts create mode 100644 src/generated/forge-mcp/payPerUse/pricing/schemas.ts create mode 100644 src/generated/forge-mcp/payPerUse/pricing/tools.ts create mode 100644 src/generated/forge-mcp/payPerUse/proposals/schemas.ts create mode 100644 src/generated/forge-mcp/payPerUse/proposals/tools.ts create mode 100644 src/generated/forge-mcp/payPerUse/usageStats/tools.ts create mode 100644 src/generated/forge-mcp/payPerUse/zones/schemas.ts create mode 100644 src/generated/forge-mcp/payPerUse/zones/tools.ts create mode 100644 src/generated/forge-mcp/pipelines/schemas.ts create mode 100644 src/generated/forge-mcp/pipelines/sinks/schemas.ts create mode 100644 src/generated/forge-mcp/pipelines/sinks/tools.ts create mode 100644 src/generated/forge-mcp/pipelines/streams/schemas.ts create mode 100644 src/generated/forge-mcp/pipelines/streams/tools.ts create mode 100644 src/generated/forge-mcp/pipelines/tools.ts create mode 100644 src/generated/forge-mcp/precursor/schemas.ts create mode 100644 src/generated/forge-mcp/precursor/tools.ts create mode 100644 src/generated/forge-mcp/previews/tools.ts create mode 100644 src/generated/forge-mcp/queries/bulk/schemas.ts create mode 100644 src/generated/forge-mcp/queries/bulk/tools.ts create mode 100644 src/generated/forge-mcp/queries/matches/tools.ts create mode 100644 src/generated/forge-mcp/queries/schemas.ts create mode 100644 src/generated/forge-mcp/queries/tools.ts create mode 100644 src/generated/forge-mcp/queues/consumers/schemas.ts create mode 100644 src/generated/forge-mcp/queues/consumers/tools.ts create mode 100644 src/generated/forge-mcp/queues/messages/schemas.ts create mode 100644 src/generated/forge-mcp/queues/messages/tools.ts create mode 100644 src/generated/forge-mcp/queues/metrics/tools.ts create mode 100644 src/generated/forge-mcp/queues/purge/tools.ts create mode 100644 src/generated/forge-mcp/queues/schemas.ts create mode 100644 src/generated/forge-mcp/queues/subscriptions/schemas.ts create mode 100644 src/generated/forge-mcp/queues/subscriptions/tools.ts create mode 100644 src/generated/forge-mcp/queues/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/cors/schemas.ts create mode 100644 src/generated/forge-mcp/r2/buckets/cors/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/domains/custom/schemas.ts create mode 100644 src/generated/forge-mcp/r2/buckets/domains/custom/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/domains/managed/schemas.ts create mode 100644 src/generated/forge-mcp/r2/buckets/domains/managed/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/eventNotifications/schemas.ts create mode 100644 src/generated/forge-mcp/r2/buckets/eventNotifications/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/jobs/schemas.ts create mode 100644 src/generated/forge-mcp/r2/buckets/jobs/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/lifecycle/schemas.ts create mode 100644 src/generated/forge-mcp/r2/buckets/lifecycle/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/localUploads/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/locks/schemas.ts create mode 100644 src/generated/forge-mcp/r2/buckets/locks/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/metrics/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/schemas.ts create mode 100644 src/generated/forge-mcp/r2/buckets/sippy/schemas.ts create mode 100644 src/generated/forge-mcp/r2/buckets/sippy/tools.ts create mode 100644 src/generated/forge-mcp/r2/buckets/tools.ts create mode 100644 src/generated/forge-mcp/r2/objects/tools.ts create mode 100644 src/generated/forge-mcp/r2/schemas.ts create mode 100644 src/generated/forge-mcp/r2/superSlurper/connectivityPrecheck/tools.ts create mode 100644 src/generated/forge-mcp/r2/superSlurper/jobs/logs/tools.ts create mode 100644 src/generated/forge-mcp/r2/superSlurper/jobs/schemas.ts create mode 100644 src/generated/forge-mcp/r2/superSlurper/jobs/tools.ts create mode 100644 src/generated/forge-mcp/r2/superSlurper/schemas.ts create mode 100644 src/generated/forge-mcp/r2/temporaryCredentials/schemas.ts create mode 100644 src/generated/forge-mcp/r2/temporaryCredentials/tools.ts create mode 100644 src/generated/forge-mcp/radar/agentReadiness/tools.ts create mode 100644 src/generated/forge-mcp/radar/ai/bots/tools.ts create mode 100644 src/generated/forge-mcp/radar/ai/inference/tools.ts create mode 100644 src/generated/forge-mcp/radar/ai/markdownForAgents/tools.ts create mode 100644 src/generated/forge-mcp/radar/ai/timeseriesGroups/tools.ts create mode 100644 src/generated/forge-mcp/radar/annotations/outages/tools.ts create mode 100644 src/generated/forge-mcp/radar/annotations/tools.ts create mode 100644 src/generated/forge-mcp/radar/as112/tools.ts create mode 100644 src/generated/forge-mcp/radar/as112/top/tools.ts create mode 100644 src/generated/forge-mcp/radar/attacks/layer3/tools.ts create mode 100644 src/generated/forge-mcp/radar/attacks/layer3/top/locations/tools.ts create mode 100644 src/generated/forge-mcp/radar/attacks/layer3/top/tools.ts create mode 100644 src/generated/forge-mcp/radar/attacks/layer7/tools.ts create mode 100644 src/generated/forge-mcp/radar/attacks/layer7/top/ases/tools.ts create mode 100644 src/generated/forge-mcp/radar/attacks/layer7/top/locations/tools.ts create mode 100644 src/generated/forge-mcp/radar/attacks/layer7/top/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/hijacks/events/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/ips/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/ips/top/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/leaks/events/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/routes/paths/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/routes/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/routes/upstreams/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/rpki/aspa/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/rpki/roas/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/top/ases/tools.ts create mode 100644 src/generated/forge-mcp/radar/bgp/top/tools.ts create mode 100644 src/generated/forge-mcp/radar/bots/tools.ts create mode 100644 src/generated/forge-mcp/radar/bots/webCrawlers/tools.ts create mode 100644 src/generated/forge-mcp/radar/ct/authorities/tools.ts create mode 100644 src/generated/forge-mcp/radar/ct/logs/tools.ts create mode 100644 src/generated/forge-mcp/radar/ct/tools.ts create mode 100644 src/generated/forge-mcp/radar/datasets/tools.ts create mode 100644 src/generated/forge-mcp/radar/dns/tools.ts create mode 100644 src/generated/forge-mcp/radar/dns/top/tools.ts create mode 100644 src/generated/forge-mcp/radar/email/routing/tools.ts create mode 100644 src/generated/forge-mcp/radar/email/security/tools.ts create mode 100644 src/generated/forge-mcp/radar/email/security/top/tlds/malicious/tools.ts create mode 100644 src/generated/forge-mcp/radar/email/security/top/tlds/spam/tools.ts create mode 100644 src/generated/forge-mcp/radar/email/security/top/tlds/spoof/tools.ts create mode 100644 src/generated/forge-mcp/radar/email/security/top/tlds/tools.ts create mode 100644 src/generated/forge-mcp/radar/entities/asns/tools.ts create mode 100644 src/generated/forge-mcp/radar/entities/locations/tools.ts create mode 100644 src/generated/forge-mcp/radar/entities/tools.ts create mode 100644 src/generated/forge-mcp/radar/geolocations/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/ases/botClass/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/ases/browserFamily/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/ases/deviceType/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/ases/httpMethod/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/ases/httpProtocol/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/ases/ipVersion/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/ases/os/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/ases/tlsVersion/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/ases/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/locations/botClass/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/locations/browserFamily/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/locations/deviceType/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/locations/httpMethod/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/locations/httpProtocol/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/locations/ipVersion/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/locations/os/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/locations/tlsVersion/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/locations/tools.ts create mode 100644 src/generated/forge-mcp/radar/http/tools.ts create mode 100644 src/generated/forge-mcp/radar/leakedCredentials/tools.ts create mode 100644 src/generated/forge-mcp/radar/netflows/tools.ts create mode 100644 src/generated/forge-mcp/radar/netflows/top/tools.ts create mode 100644 src/generated/forge-mcp/radar/origins/tools.ts create mode 100644 src/generated/forge-mcp/radar/postQuantum/origin/tools.ts create mode 100644 src/generated/forge-mcp/radar/postQuantum/tls/tools.ts create mode 100644 src/generated/forge-mcp/radar/quality/iqi/tools.ts create mode 100644 src/generated/forge-mcp/radar/quality/speed/tools.ts create mode 100644 src/generated/forge-mcp/radar/quality/speed/top/tools.ts create mode 100644 src/generated/forge-mcp/radar/ranking/domain/tools.ts create mode 100644 src/generated/forge-mcp/radar/ranking/internetServices/tools.ts create mode 100644 src/generated/forge-mcp/radar/ranking/tools.ts create mode 100644 src/generated/forge-mcp/radar/robotsTxt/top/tools.ts create mode 100644 src/generated/forge-mcp/radar/robotsTxt/top/userAgents/tools.ts create mode 100644 src/generated/forge-mcp/radar/search/tools.ts create mode 100644 src/generated/forge-mcp/radar/tcpResetsTimeouts/tools.ts create mode 100644 src/generated/forge-mcp/radar/tlds/performance/tools.ts create mode 100644 src/generated/forge-mcp/radar/tlds/tools.ts create mode 100644 src/generated/forge-mcp/radar/trafficAnomalies/locations/tools.ts create mode 100644 src/generated/forge-mcp/radar/trafficAnomalies/tools.ts create mode 100644 src/generated/forge-mcp/ready/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/analytics/livestreams/daily/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/analytics/livestreams/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/analytics/usage/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/apps/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/livestreams/sessions/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/livestreams/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/meetings/active/polls/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/meetings/active/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/meetings/livestream/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/meetings/participants/tokens/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/meetings/participants/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/meetings/schemas.ts create mode 100644 src/generated/forge-mcp/realtime/kit/meetings/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/presets/schemas.ts create mode 100644 src/generated/forge-mcp/realtime/kit/presets/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/recordings/active/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/recordings/schemas.ts create mode 100644 src/generated/forge-mcp/realtime/kit/recordings/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/recordings/tracks/schemas.ts create mode 100644 src/generated/forge-mcp/realtime/kit/recordings/tracks/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/schemas.ts create mode 100644 src/generated/forge-mcp/realtime/kit/sessions/chat/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/sessions/livestreams/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/sessions/participants/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/sessions/peers/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/sessions/summaries/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/sessions/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/sessions/transcripts/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/webhooks/events/tools.ts create mode 100644 src/generated/forge-mcp/realtime/kit/webhooks/schemas.ts create mode 100644 src/generated/forge-mcp/realtime/kit/webhooks/tools.ts create mode 100644 src/generated/forge-mcp/realtime/moq/relays/schemas.ts create mode 100644 src/generated/forge-mcp/realtime/moq/relays/tokens/tools.ts create mode 100644 src/generated/forge-mcp/realtime/moq/relays/tools.ts create mode 100644 src/generated/forge-mcp/realtime/schemas.ts create mode 100644 src/generated/forge-mcp/realtime/sfu/apps/schemas.ts create mode 100644 src/generated/forge-mcp/realtime/sfu/apps/tools.ts create mode 100644 src/generated/forge-mcp/realtime/turn/keys/schemas.ts create mode 100644 src/generated/forge-mcp/realtime/turn/keys/tools.ts create mode 100644 src/generated/forge-mcp/recentSubmissions/tools.ts create mode 100644 src/generated/forge-mcp/refute/tools.ts create mode 100644 src/generated/forge-mcp/registrar/extensions/tools.ts create mode 100644 src/generated/forge-mcp/registrar/registrations/schemas.ts create mode 100644 src/generated/forge-mcp/registrar/registrations/tools.ts create mode 100644 src/generated/forge-mcp/registrarSandbox/extensions/tools.ts create mode 100644 src/generated/forge-mcp/registrarSandbox/registrations/schemas.ts create mode 100644 src/generated/forge-mcp/registrarSandbox/registrations/tools.ts create mode 100644 src/generated/forge-mcp/reporting/industry/schemas.ts create mode 100644 src/generated/forge-mcp/reporting/industry/tools.ts create mode 100644 src/generated/forge-mcp/reporting/policies/tools.ts create mode 100644 src/generated/forge-mcp/reporting/reports/tools.ts create mode 100644 src/generated/forge-mcp/requestTracers/traces/tools.ts create mode 100644 src/generated/forge-mcp/resourceSharing/excludedRecipients/schemas.ts create mode 100644 src/generated/forge-mcp/resourceSharing/excludedRecipients/tools.ts create mode 100644 src/generated/forge-mcp/resourceSharing/recipients/schemas.ts create mode 100644 src/generated/forge-mcp/resourceSharing/recipients/tools.ts create mode 100644 src/generated/forge-mcp/resourceSharing/resources/schemas.ts create mode 100644 src/generated/forge-mcp/resourceSharing/resources/tools.ts create mode 100644 src/generated/forge-mcp/resourceSharing/schemas.ts create mode 100644 src/generated/forge-mcp/resourceSharing/tools.ts create mode 100644 src/generated/forge-mcp/rules/lists/bulkOperations/tools.ts create mode 100644 src/generated/forge-mcp/rules/lists/items/schemas.ts create mode 100644 src/generated/forge-mcp/rules/lists/items/tools.ts create mode 100644 src/generated/forge-mcp/rules/lists/schemas.ts create mode 100644 src/generated/forge-mcp/rules/lists/tools.ts create mode 100644 src/generated/forge-mcp/rulesets/entrypoint/tools.ts create mode 100644 src/generated/forge-mcp/rulesets/entrypoint/versions/tools.ts create mode 100644 src/generated/forge-mcp/rulesets/rules/schemas.ts create mode 100644 src/generated/forge-mcp/rulesets/rules/tools.ts create mode 100644 src/generated/forge-mcp/rulesets/schemas.ts create mode 100644 src/generated/forge-mcp/rulesets/tools.ts create mode 100644 src/generated/forge-mcp/rulesets/versions/byTag/tools.ts create mode 100644 src/generated/forge-mcp/rulesets/versions/tools.ts create mode 100644 src/generated/forge-mcp/rum/rules/schemas.ts create mode 100644 src/generated/forge-mcp/rum/rules/tools.ts create mode 100644 src/generated/forge-mcp/rum/schemas.ts create mode 100644 src/generated/forge-mcp/rum/siteInfo/schemas.ts create mode 100644 src/generated/forge-mcp/rum/siteInfo/tools.ts create mode 100644 src/generated/forge-mcp/scanLogo/tools.ts create mode 100644 src/generated/forge-mcp/scanPage/tools.ts create mode 100644 src/generated/forge-mcp/schemas.ts create mode 100644 src/generated/forge-mcp/scim/groups/schemas.ts create mode 100644 src/generated/forge-mcp/scim/groups/tools.ts create mode 100644 src/generated/forge-mcp/scim/resourceTypes/tools.ts create mode 100644 src/generated/forge-mcp/scim/schemas/tools.ts create mode 100644 src/generated/forge-mcp/scim/serviceProviderConfig/tools.ts create mode 100644 src/generated/forge-mcp/scim/users/schemas.ts create mode 100644 src/generated/forge-mcp/scim/users/tools.ts create mode 100644 src/generated/forge-mcp/search/tools.ts create mode 100644 src/generated/forge-mcp/secretsStore/quota/tools.ts create mode 100644 src/generated/forge-mcp/secretsStore/secrets/schemas.ts create mode 100644 src/generated/forge-mcp/secretsStore/secrets/tools.ts create mode 100644 src/generated/forge-mcp/secretsStore/stores/tools.ts create mode 100644 src/generated/forge-mcp/securityInsights/auditLogs/tools.ts create mode 100644 src/generated/forge-mcp/securityInsights/context/tools.ts create mode 100644 src/generated/forge-mcp/securityInsights/count/tools.ts create mode 100644 src/generated/forge-mcp/securityInsights/partners/schemas.ts create mode 100644 src/generated/forge-mcp/securityInsights/partners/settings/schemas.ts create mode 100644 src/generated/forge-mcp/securityInsights/partners/settings/tools.ts create mode 100644 src/generated/forge-mcp/securityInsights/partners/shadowHosts/tools.ts create mode 100644 src/generated/forge-mcp/securityInsights/partners/shadowZoneHosts/tools.ts create mode 100644 src/generated/forge-mcp/securityInsights/partners/shadowZones/tools.ts create mode 100644 src/generated/forge-mcp/securityInsights/scans/schemas.ts create mode 100644 src/generated/forge-mcp/securityInsights/scans/tools.ts create mode 100644 src/generated/forge-mcp/securityInsights/schemas.ts create mode 100644 src/generated/forge-mcp/securityInsights/state/schemas.ts create mode 100644 src/generated/forge-mcp/securityInsights/state/tools.ts create mode 100644 src/generated/forge-mcp/securityInsights/tools.ts create mode 100644 src/generated/forge-mcp/securityTxt/schemas.ts create mode 100644 src/generated/forge-mcp/securityTxt/tools.ts create mode 100644 src/generated/forge-mcp/signedUrl/tools.ts create mode 100644 src/generated/forge-mcp/smartShield/cacheReserveClear/tools.ts create mode 100644 src/generated/forge-mcp/smartShield/healthChecks/schemas.ts create mode 100644 src/generated/forge-mcp/smartShield/healthChecks/tools.ts create mode 100644 src/generated/forge-mcp/smartShield/schemas.ts create mode 100644 src/generated/forge-mcp/smartShield/tools.ts create mode 100644 src/generated/forge-mcp/snippets/content/tools.ts create mode 100644 src/generated/forge-mcp/snippets/rules/schemas.ts create mode 100644 src/generated/forge-mcp/snippets/rules/tools.ts create mode 100644 src/generated/forge-mcp/snippets/schemas.ts create mode 100644 src/generated/forge-mcp/snippets/tools.ts create mode 100644 src/generated/forge-mcp/spectrum/analytics/aggregates/currents/schemas.ts create mode 100644 src/generated/forge-mcp/spectrum/analytics/aggregates/currents/tools.ts create mode 100644 src/generated/forge-mcp/spectrum/analytics/events/bytimes/tools.ts create mode 100644 src/generated/forge-mcp/spectrum/analytics/events/schemas.ts create mode 100644 src/generated/forge-mcp/spectrum/analytics/events/summaries/tools.ts create mode 100644 src/generated/forge-mcp/spectrum/analytics/schemas.ts create mode 100644 src/generated/forge-mcp/spectrum/analytics/zones/report/tools.ts create mode 100644 src/generated/forge-mcp/spectrum/apps/schemas.ts create mode 100644 src/generated/forge-mcp/spectrum/apps/tools.ts create mode 100644 src/generated/forge-mcp/spectrum/protocols/tools.ts create mode 100644 src/generated/forge-mcp/speed/availabilities/tools.ts create mode 100644 src/generated/forge-mcp/speed/pages/tests/tools.ts create mode 100644 src/generated/forge-mcp/speed/pages/tools.ts create mode 100644 src/generated/forge-mcp/speed/schedule/tools.ts create mode 100644 src/generated/forge-mcp/speed/schemas.ts create mode 100644 src/generated/forge-mcp/sql/tools.ts create mode 100644 src/generated/forge-mcp/ssl/analyze/tools.ts create mode 100644 src/generated/forge-mcp/ssl/autoOriginTlsKex/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/autoOriginTlsKex/tools.ts create mode 100644 src/generated/forge-mcp/ssl/automaticUpgrader/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/automaticUpgrader/tools.ts create mode 100644 src/generated/forge-mcp/ssl/certificateAuthorities/hostnameAssociations/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/certificateAuthorities/hostnameAssociations/tools.ts create mode 100644 src/generated/forge-mcp/ssl/certificatePacks/quota/tools.ts create mode 100644 src/generated/forge-mcp/ssl/certificatePacks/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/certificatePacks/tools.ts create mode 100644 src/generated/forge-mcp/ssl/clientCertificates/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/clientCertificates/tools.ts create mode 100644 src/generated/forge-mcp/ssl/ctAlerting/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/ctAlerting/tools.ts create mode 100644 src/generated/forge-mcp/ssl/customCertificates/prioritize/tools.ts create mode 100644 src/generated/forge-mcp/ssl/customCertificates/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/customCertificates/tools.ts create mode 100644 src/generated/forge-mcp/ssl/dcvDelegation/tools.ts create mode 100644 src/generated/forge-mcp/ssl/keylessCertificates/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/keylessCertificates/tools.ts create mode 100644 src/generated/forge-mcp/ssl/mtlsCertificates/associations/tools.ts create mode 100644 src/generated/forge-mcp/ssl/mtlsCertificates/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/mtlsCertificates/tools.ts create mode 100644 src/generated/forge-mcp/ssl/originCaCertificates/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/originCaCertificates/tools.ts create mode 100644 src/generated/forge-mcp/ssl/originTlsClientAuth/hostnameAssociations/tools.ts create mode 100644 src/generated/forge-mcp/ssl/originTlsClientAuth/hostnameCertificates/tools.ts create mode 100644 src/generated/forge-mcp/ssl/originTlsClientAuth/hostnames/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/originTlsClientAuth/hostnames/tools.ts create mode 100644 src/generated/forge-mcp/ssl/originTlsClientAuth/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/originTlsClientAuth/settings/tools.ts create mode 100644 src/generated/forge-mcp/ssl/originTlsClientAuth/zoneCertificates/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/originTlsClientAuth/zoneCertificates/tools.ts create mode 100644 src/generated/forge-mcp/ssl/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/universal/settings/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/universal/settings/tools.ts create mode 100644 src/generated/forge-mcp/ssl/verification/schemas.ts create mode 100644 src/generated/forge-mcp/ssl/verification/tools.ts create mode 100644 src/generated/forge-mcp/stream/keys/tools.ts create mode 100644 src/generated/forge-mcp/stream/liveInputs/outputs/schemas.ts create mode 100644 src/generated/forge-mcp/stream/liveInputs/outputs/tools.ts create mode 100644 src/generated/forge-mcp/stream/liveInputs/schemas.ts create mode 100644 src/generated/forge-mcp/stream/liveInputs/tools.ts create mode 100644 src/generated/forge-mcp/stream/schemas.ts create mode 100644 src/generated/forge-mcp/stream/tools.ts create mode 100644 src/generated/forge-mcp/stream/usage/tools.ts create mode 100644 src/generated/forge-mcp/stream/videos/audioTracks/schemas.ts create mode 100644 src/generated/forge-mcp/stream/videos/audioTracks/tools.ts create mode 100644 src/generated/forge-mcp/stream/videos/captions/language/tools.ts create mode 100644 src/generated/forge-mcp/stream/videos/captions/language/vtt/tools.ts create mode 100644 src/generated/forge-mcp/stream/videos/captions/tools.ts create mode 100644 src/generated/forge-mcp/stream/videos/directUpload/schemas.ts create mode 100644 src/generated/forge-mcp/stream/videos/directUpload/tools.ts create mode 100644 src/generated/forge-mcp/stream/videos/downloads/tools.ts create mode 100644 src/generated/forge-mcp/stream/videos/downloadsDefault/tools.ts create mode 100644 src/generated/forge-mcp/stream/videos/schemas.ts create mode 100644 src/generated/forge-mcp/stream/videos/token/schemas.ts create mode 100644 src/generated/forge-mcp/stream/videos/token/tools.ts create mode 100644 src/generated/forge-mcp/stream/videos/tools.ts create mode 100644 src/generated/forge-mcp/stream/watermarks/tools.ts create mode 100644 src/generated/forge-mcp/stream/webhooks/schemas.ts create mode 100644 src/generated/forge-mcp/stream/webhooks/tools.ts create mode 100644 src/generated/forge-mcp/submissionInfo/tools.ts create mode 100644 src/generated/forge-mcp/submit/tools.ts create mode 100644 src/generated/forge-mcp/tags/accountResources/schemas.ts create mode 100644 src/generated/forge-mcp/tags/accountResources/tools.ts create mode 100644 src/generated/forge-mcp/tags/keys/tools.ts create mode 100644 src/generated/forge-mcp/tags/resources/tools.ts create mode 100644 src/generated/forge-mcp/tags/schemas.ts create mode 100644 src/generated/forge-mcp/tags/summary/tools.ts create mode 100644 src/generated/forge-mcp/tags/values/tools.ts create mode 100644 src/generated/forge-mcp/tenant/account/tools.ts create mode 100644 src/generated/forge-mcp/tenant/accountType/tools.ts create mode 100644 src/generated/forge-mcp/tenant/entitlement/tools.ts create mode 100644 src/generated/forge-mcp/tenant/tools.ts create mode 100644 src/generated/forge-mcp/tenantCustomNameservers/tools.ts create mode 100644 src/generated/forge-mcp/totalQueries/tools.ts create mode 100644 src/generated/forge-mcp/trackedDomains/tools.ts create mode 100644 src/generated/forge-mcp/tunnel/tools.ts create mode 100644 src/generated/forge-mcp/tunnels/config/schemas.ts create mode 100644 src/generated/forge-mcp/tunnels/config/tools.ts create mode 100644 src/generated/forge-mcp/tunnels/connections/tools.ts create mode 100644 src/generated/forge-mcp/tunnels/connectors/tools.ts create mode 100644 src/generated/forge-mcp/tunnels/managementToken/schemas.ts create mode 100644 src/generated/forge-mcp/tunnels/managementToken/tools.ts create mode 100644 src/generated/forge-mcp/tunnels/token/tools.ts create mode 100644 src/generated/forge-mcp/tunnels/tools.ts create mode 100644 src/generated/forge-mcp/turnstile/widgets/schemas.ts create mode 100644 src/generated/forge-mcp/turnstile/widgets/tools.ts create mode 100644 src/generated/forge-mcp/urlInfo/tools.ts create mode 100644 src/generated/forge-mcp/urlNormalization/schemas.ts create mode 100644 src/generated/forge-mcp/urlNormalization/tools.ts create mode 100644 src/generated/forge-mcp/urlScanner/responses/tools.ts create mode 100644 src/generated/forge-mcp/urlScanner/scans/tools.ts create mode 100644 src/generated/forge-mcp/user/auditLogs/tools.ts create mode 100644 src/generated/forge-mcp/user/firewall/accessRules/tools.ts create mode 100644 src/generated/forge-mcp/user/invites/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancers/monitors/preview/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancers/monitors/references/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancers/monitors/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancers/pools/edit/pools/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancers/pools/health/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancers/pools/preview/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancers/pools/references/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancers/pools/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancers/preview/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancers/regions/tools.ts create mode 100644 src/generated/forge-mcp/user/loadBalancingAnalytics/events/schemas.ts create mode 100644 src/generated/forge-mcp/user/loadBalancingAnalytics/events/tools.ts create mode 100644 src/generated/forge-mcp/user/memberships/schemas.ts create mode 100644 src/generated/forge-mcp/user/memberships/tools.ts create mode 100644 src/generated/forge-mcp/user/schemas.ts create mode 100644 src/generated/forge-mcp/user/subscriptions/tools.ts create mode 100644 src/generated/forge-mcp/user/tenant/tools.ts create mode 100644 src/generated/forge-mcp/user/tokens/permissionGroups/tools.ts create mode 100644 src/generated/forge-mcp/user/tokens/tools.ts create mode 100644 src/generated/forge-mcp/user/tools.ts create mode 100644 src/generated/forge-mcp/vectorize/metadataIndex/schemas.ts create mode 100644 src/generated/forge-mcp/vectorize/metadataIndex/tools.ts create mode 100644 src/generated/forge-mcp/vectorize/schemas.ts create mode 100644 src/generated/forge-mcp/vectorize/tools.ts create mode 100644 src/generated/forge-mcp/verify/tools.ts create mode 100644 src/generated/forge-mcp/waitingRooms/accountWaitingRooms/tools.ts create mode 100644 src/generated/forge-mcp/waitingRooms/events/details/tools.ts create mode 100644 src/generated/forge-mcp/waitingRooms/events/schemas.ts create mode 100644 src/generated/forge-mcp/waitingRooms/events/tools.ts create mode 100644 src/generated/forge-mcp/waitingRooms/page/schemas.ts create mode 100644 src/generated/forge-mcp/waitingRooms/page/tools.ts create mode 100644 src/generated/forge-mcp/waitingRooms/rules/schemas.ts create mode 100644 src/generated/forge-mcp/waitingRooms/rules/tools.ts create mode 100644 src/generated/forge-mcp/waitingRooms/schemas.ts create mode 100644 src/generated/forge-mcp/waitingRooms/settings/schemas.ts create mode 100644 src/generated/forge-mcp/waitingRooms/settings/tools.ts create mode 100644 src/generated/forge-mcp/waitingRooms/statuses/tools.ts create mode 100644 src/generated/forge-mcp/waitingRooms/tools.ts create mode 100644 src/generated/forge-mcp/web3/hostnames/ipfsUniversalPaths/contentLists/entries/schemas.ts create mode 100644 src/generated/forge-mcp/web3/hostnames/ipfsUniversalPaths/contentLists/entries/tools.ts create mode 100644 src/generated/forge-mcp/web3/hostnames/ipfsUniversalPaths/contentLists/schemas.ts create mode 100644 src/generated/forge-mcp/web3/hostnames/ipfsUniversalPaths/contentLists/tools.ts create mode 100644 src/generated/forge-mcp/web3/hostnames/schemas.ts create mode 100644 src/generated/forge-mcp/web3/hostnames/tools.ts create mode 100644 src/generated/forge-mcp/webAssets/discovery/operations/schemas.ts create mode 100644 src/generated/forge-mcp/webAssets/discovery/operations/tools.ts create mode 100644 src/generated/forge-mcp/webAssets/discovery/tools.ts create mode 100644 src/generated/forge-mcp/webAssets/labels/managed/operations/tools.ts create mode 100644 src/generated/forge-mcp/webAssets/labels/managed/tools.ts create mode 100644 src/generated/forge-mcp/webAssets/labels/schemas.ts create mode 100644 src/generated/forge-mcp/webAssets/labels/tools.ts create mode 100644 src/generated/forge-mcp/webAssets/labels/user/operations/tools.ts create mode 100644 src/generated/forge-mcp/webAssets/labels/user/schemas.ts create mode 100644 src/generated/forge-mcp/webAssets/labels/user/tools.ts create mode 100644 src/generated/forge-mcp/webAssets/operations/labels/schemas.ts create mode 100644 src/generated/forge-mcp/webAssets/operations/labels/tools.ts create mode 100644 src/generated/forge-mcp/webAssets/operations/schemas.ts create mode 100644 src/generated/forge-mcp/webAssets/operations/tools.ts create mode 100644 src/generated/forge-mcp/webAssets/schemas.ts create mode 100644 src/generated/forge-mcp/webAssets/schemas/tools.ts create mode 100644 src/generated/forge-mcp/workers/accountSettings/schemas.ts create mode 100644 src/generated/forge-mcp/workers/accountSettings/tools.ts create mode 100644 src/generated/forge-mcp/workers/assets/upload/tools.ts create mode 100644 src/generated/forge-mcp/workers/deployments/schemas.ts create mode 100644 src/generated/forge-mcp/workers/deployments/tools.ts create mode 100644 src/generated/forge-mcp/workers/domains/tools.ts create mode 100644 src/generated/forge-mcp/workers/legacy/scripts/content/tools.ts create mode 100644 src/generated/forge-mcp/workers/legacy/scripts/scriptAndVersionSettings/tools.ts create mode 100644 src/generated/forge-mcp/workers/legacy/scripts/settings/schemas.ts create mode 100644 src/generated/forge-mcp/workers/legacy/scripts/settings/tools.ts create mode 100644 src/generated/forge-mcp/workers/legacy/scripts/subdomain/tools.ts create mode 100644 src/generated/forge-mcp/workers/legacy/scripts/tools.ts create mode 100644 src/generated/forge-mcp/workers/legacy/scripts/usageModel/schemas.ts create mode 100644 src/generated/forge-mcp/workers/legacy/scripts/usageModel/tools.ts create mode 100644 src/generated/forge-mcp/workers/legacy/scripts/versions/tools.ts create mode 100644 src/generated/forge-mcp/workers/placement/regions/tools.ts create mode 100644 src/generated/forge-mcp/workers/previews/deployments/schemas.ts create mode 100644 src/generated/forge-mcp/workers/previews/deployments/tools.ts create mode 100644 src/generated/forge-mcp/workers/previews/schemas.ts create mode 100644 src/generated/forge-mcp/workers/previews/tools.ts create mode 100644 src/generated/forge-mcp/workers/routes/tools.ts create mode 100644 src/generated/forge-mcp/workers/schemas.ts create mode 100644 src/generated/forge-mcp/workers/scripts/schedules/schemas.ts create mode 100644 src/generated/forge-mcp/workers/scripts/schedules/tools.ts create mode 100644 src/generated/forge-mcp/workers/scripts/tools.ts create mode 100644 src/generated/forge-mcp/workers/secrets/tools.ts create mode 100644 src/generated/forge-mcp/workers/subdomains/schemas.ts create mode 100644 src/generated/forge-mcp/workers/subdomains/tools.ts create mode 100644 src/generated/forge-mcp/workers/tail/tools.ts create mode 100644 src/generated/forge-mcp/workers/tools.ts create mode 100644 src/generated/forge-mcp/workers/versions/latest/tools.ts create mode 100644 src/generated/forge-mcp/workers/versions/schemas.ts create mode 100644 src/generated/forge-mcp/workers/versions/tools.ts create mode 100644 src/generated/forge-mcp/workersBuilds/workers/previews/schemas.ts create mode 100644 src/generated/forge-mcp/workersBuilds/workers/previews/tools.ts create mode 100644 src/generated/forge-mcp/workersBuilds/workers/schemas.ts create mode 100644 src/generated/forge-mcp/workersBuilds/workers/tools.ts create mode 100644 src/generated/forge-mcp/workersForPlatforms/dispatchNamespaces/schemas.ts create mode 100644 src/generated/forge-mcp/workersForPlatforms/dispatchNamespaces/scripts/assets/upload/tools.ts create mode 100644 src/generated/forge-mcp/workersForPlatforms/dispatchNamespaces/scripts/bindings/tools.ts create mode 100644 src/generated/forge-mcp/workersForPlatforms/dispatchNamespaces/scripts/content/tools.ts create mode 100644 src/generated/forge-mcp/workersForPlatforms/dispatchNamespaces/scripts/secrets/tools.ts create mode 100644 src/generated/forge-mcp/workersForPlatforms/dispatchNamespaces/scripts/settings/tools.ts create mode 100644 src/generated/forge-mcp/workersForPlatforms/dispatchNamespaces/scripts/tags/schemas.ts create mode 100644 src/generated/forge-mcp/workersForPlatforms/dispatchNamespaces/scripts/tags/tools.ts create mode 100644 src/generated/forge-mcp/workersForPlatforms/dispatchNamespaces/scripts/tools.ts create mode 100644 src/generated/forge-mcp/workersForPlatforms/dispatchNamespaces/tools.ts create mode 100644 src/generated/forge-mcp/workersVpc/services/schemas.ts create mode 100644 src/generated/forge-mcp/workersVpc/services/tools.ts create mode 100644 src/generated/forge-mcp/workflows/concurrency/tools.ts create mode 100644 src/generated/forge-mcp/workflows/instances/batch/tools.ts create mode 100644 src/generated/forge-mcp/workflows/instances/events/tools.ts create mode 100644 src/generated/forge-mcp/workflows/instances/step/tools.ts create mode 100644 src/generated/forge-mcp/workflows/instances/tools.ts create mode 100644 src/generated/forge-mcp/workflows/settings/tools.ts create mode 100644 src/generated/forge-mcp/workflows/tools.ts create mode 100644 src/generated/forge-mcp/workflows/versions/tools.ts create mode 100644 src/generated/forge-mcp/zaraz/config/schemas.ts create mode 100644 src/generated/forge-mcp/zaraz/config/tools.ts create mode 100644 src/generated/forge-mcp/zaraz/default/tools.ts create mode 100644 src/generated/forge-mcp/zaraz/export/tools.ts create mode 100644 src/generated/forge-mcp/zaraz/history/configs/tools.ts create mode 100644 src/generated/forge-mcp/zaraz/history/tools.ts create mode 100644 src/generated/forge-mcp/zaraz/publish/tools.ts create mode 100644 src/generated/forge-mcp/zaraz/schemas.ts create mode 100644 src/generated/forge-mcp/zaraz/workflow/schemas.ts create mode 100644 src/generated/forge-mcp/zaraz/workflow/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/applications/policies/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/applications/policyTests/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/applications/policyTests/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/applications/policyTests/users/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/applications/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/applications/settings/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/applications/settings/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/applications/shortLivedCertificates/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/applications/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/applications/userPolicyChecks/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/customPages/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/customPages/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/infrastructure/auditSshSettings/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/infrastructure/auditSshSettings/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/infrastructure/sshCa/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/logs/accessRequests/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/logs/accessRequests/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/logs/jitRequests/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/logs/jitRequests/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/logs/scim/updates/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/logs/scim/updates/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/mfa/authenticatorCatalog/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/mtlsCertificates/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/mtlsCertificates/settings/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/mtlsCertificates/settings/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/mtlsCertificates/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/policies/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/ruleGroups/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/ruleGroups/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/samlEncryptionCertificates/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/serviceTokens/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/serviceTokens/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/signingKeys/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/signingKeys/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/tags/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/tags/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/targets/bulk/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/targets/bulk/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/targets/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/targets/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/userPopulations/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/userPopulations/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/userPopulations/users/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/userPopulations/users/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/users/activeSessions/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/users/failedLogins/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/users/lastSeenIdentity/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/access/users/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/applications/authMethods/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/applications/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/assetSchemas/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/content/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/content/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/exports/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/findingTypes/remediationTypes/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/findingTypes/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/findingTypes/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/findings/instances/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/findings/instances/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/findings/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/findings/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/integrations/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/integrations/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/policies/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/policies/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/remediations/jobs/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/remediations/jobs/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/webhooks/jobs/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/webhooks/jobs/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/webhooks/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/casb/webhooks/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/connectivitySettings/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/connectivitySettings/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/basicAuthCredentials/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/basicAuthCredentials/secrets/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/basicAuthCredentials/secrets/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/basicAuthCredentials/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/deployments/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/deployments/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/domainAcls/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/domainAcls/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/policies/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/policies/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/policySets/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/policySets/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/regoMetadata/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/regoMetadata/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/regoModules/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/regoModules/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/tenantStructures/nodes/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/tenantStructures/nodes/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/tenantStructures/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/tenantStructures/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/workloads/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/cws/workloads/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/clientVersions/targetEnvironments/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/clientVersions/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/deploymentGroups/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/deploymentGroups/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/emergencyDisconnect/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/emergencyDisconnect/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/ipProfiles/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/ipProfiles/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/networks/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/networks/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/overrideCodes/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/overrideCodes/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/posture/integrations/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/posture/integrations/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/posture/rules/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/posture/rules/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/profiles/custom/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/profiles/custom/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/profiles/default/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/profiles/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/registrations/overrideCodes/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/registrations/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/settings/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/settings/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/devices/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/colos/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/commands/eligibleDevices/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/commands/quota/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/commands/results/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/commands/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/devices/aggregates/live/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/devices/aggregates/overTime/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/devices/overTime/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/devices/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/devices/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/isps/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/overview/tests/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/overview/tests/uniqueDevices/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/rules/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/rules/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/testResults/http/percentiles/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/testResults/http/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/testResults/traceroute/networkPath/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/testResults/traceroute/percentiles/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/testResults/traceroute/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/tests/networkPath/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/tests/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/tests/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dex/warpChangeEvents/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/customPromptTopics/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/customPromptTopics/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/dataClasses/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/dataClasses/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/dataTagCategories/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/dataTagCategories/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/dataTagCategoryTemplates/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/dataTags/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/dataTags/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/datasets/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/datasets/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/documentFingerprints/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/documentFingerprints/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/email/accountMapping/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/email/accountMapping/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/email/rules/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/email/rules/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/entries/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/entries/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/limits/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/patterns/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/patterns/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/profiles/custom/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/profiles/custom/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/profiles/predefined/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/profiles/predefined/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/profiles/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/profiles/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/sensitivityGroupTemplates/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/sensitivityGroups/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/sensitivityGroups/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/sensitivityLevels/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/sensitivityLevels/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/settings/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/settings/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/validators/proximityWords/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/validators/proximityWords/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/validators/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/validators/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/validators/worker/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/validators/worker/status/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/dlp/validators/worker/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/appTypes/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/categories/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/certificates/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/certificates/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/configurations/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/configurations/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/dnsDestinationIps/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/lists/items/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/lists/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/lists/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/locations/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/locations/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/logging/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/logging/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/pacfiles/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/pacfiles/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/proxyEndpoints/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/proxyEndpoints/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/rules/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/rules/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/gateway/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/identityProviders/federationGrants/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/identityProviders/federationGrants/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/identityProviders/samlCertificate/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/identityProviders/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/identityProviders/scim/groups/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/identityProviders/scim/groups/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/identityProviders/scim/users/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/identityProviders/scim/users/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/identityProviders/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/organization/doh/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/organization/doh/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/organization/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/organization/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/riskScoring/behaviours/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/riskScoring/behaviours/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/riskScoring/integrations/references/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/riskScoring/integrations/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/riskScoring/integrations/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/riskScoring/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/riskScoring/summary/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/riskScoring/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/seats/schemas.ts create mode 100644 src/generated/forge-mcp/zeroTrust/seats/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/users/mfa/authenticators/tools.ts create mode 100644 src/generated/forge-mcp/zeroTrust/users/passkeys/tools.ts create mode 100644 src/generated/forge-mcp/zone/tools.ts create mode 100644 src/generated/forge-mcp/zones/aegis/schemas.ts create mode 100644 src/generated/forge-mcp/zones/aegis/tools.ts create mode 100644 src/generated/forge-mcp/zones/automaticPlatformOptimization/schemas.ts create mode 100644 src/generated/forge-mcp/zones/automaticPlatformOptimization/tools.ts create mode 100644 src/generated/forge-mcp/zones/binaryAst/schemas.ts create mode 100644 src/generated/forge-mcp/zones/binaryAst/tools.ts create mode 100644 src/generated/forge-mcp/zones/fonts/schemas.ts create mode 100644 src/generated/forge-mcp/zones/fonts/tools.ts create mode 100644 src/generated/forge-mcp/zones/h2Prioritization/schemas.ts create mode 100644 src/generated/forge-mcp/zones/h2Prioritization/tools.ts create mode 100644 src/generated/forge-mcp/zones/holds/tools.ts create mode 100644 src/generated/forge-mcp/zones/hostnames/settings/schemas.ts create mode 100644 src/generated/forge-mcp/zones/hostnames/settings/tls/tools.ts create mode 100644 src/generated/forge-mcp/zones/hostnames/settings/tlsSingle/tools.ts create mode 100644 src/generated/forge-mcp/zones/imageResizing/schemas.ts create mode 100644 src/generated/forge-mcp/zones/imageResizing/tools.ts create mode 100644 src/generated/forge-mcp/zones/originH2MaxStreams/schemas.ts create mode 100644 src/generated/forge-mcp/zones/originH2MaxStreams/tools.ts create mode 100644 src/generated/forge-mcp/zones/originMaxHttpVersion/schemas.ts create mode 100644 src/generated/forge-mcp/zones/originMaxHttpVersion/tools.ts create mode 100644 src/generated/forge-mcp/zones/originTlsComplianceModes/schemas.ts create mode 100644 src/generated/forge-mcp/zones/originTlsComplianceModes/tools.ts create mode 100644 src/generated/forge-mcp/zones/plans/tools.ts create mode 100644 src/generated/forge-mcp/zones/ratePlans/tools.ts create mode 100644 src/generated/forge-mcp/zones/rum/schemas.ts create mode 100644 src/generated/forge-mcp/zones/rum/tools.ts create mode 100644 src/generated/forge-mcp/zones/schemas.ts create mode 100644 src/generated/forge-mcp/zones/settings/schemas.ts create mode 100644 src/generated/forge-mcp/zones/settings/tools.ts create mode 100644 src/generated/forge-mcp/zones/speedBrain/tools.ts create mode 100644 src/generated/forge-mcp/zones/subscriptions/tools.ts create mode 100644 src/generated/forge-mcp/zones/tools.ts create mode 100644 src/generated/forge-mcp/zones/transformationsAllowedOrigins/schemas.ts create mode 100644 src/generated/forge-mcp/zones/transformationsAllowedOrigins/tools.ts create mode 100644 src/generated/forge-mcp/zones/transformationsC2pa/schemas.ts create mode 100644 src/generated/forge-mcp/zones/transformationsC2pa/tools.ts create mode 100644 src/generated/forge-mcp/zones/transformationsConfig/schemas.ts create mode 100644 src/generated/forge-mcp/zones/transformationsConfig/tools.ts create mode 100644 tests/forge-tools-cloudflare.test.ts delete mode 100644 tests/forge-tools-plugin.test.ts delete mode 100644 tests/helpers/forge-tools.ts delete mode 100644 vendor/cloudflare-forge-mcp-0.1.0.tgz diff --git a/.github/workflows/forge-tools.yml b/.github/workflows/forge-tools.yml new file mode 100644 index 00000000..bb352d04 --- /dev/null +++ b/.github/workflows/forge-tools.yml @@ -0,0 +1,109 @@ +name: Forge tools + +# Every six hours, regenerates src/generated/forge-mcp, the direct tools served +# at /mcp?forge=true, from the latest openapi.forge.json Forge release with the +# forge commit that forge.json names. When the generated code changes, it opens +# or updates one pull request; merging it deploys through Workers Builds. +# +# Pull requests opened with GITHUB_TOKEN don't start other workflows, so this +# job runs the type check and tests itself before opening one. + +on: + schedule: + - cron: '30 */6 * * *' + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +concurrency: + group: forge-tools + cancel-in-progress: false + +env: + BRANCH: bot/forge-tools + TITLE: 'chore(forge): regenerate the forge MCP tools' + +jobs: + generate: + name: Generate + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Read forge.json + id: forge + run: | + echo "repository=$(jq -r .repository forge.json)" >> "$GITHUB_OUTPUT" + echo "ref=$(jq -r .ref forge.json)" >> "$GITHUB_OUTPUT" + + - uses: actions/checkout@v6 + with: + repository: ${{ steps.forge.outputs.repository }} + ref: ${{ steps.forge.outputs.ref }} + path: .forge + + - uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + .forge/target + key: forge-${{ runner.os }}-${{ steps.forge.outputs.ref }} + + # rustup reads .forge/rust-toolchain.toml and installs that toolchain. + - name: Build forge + working-directory: .forge + run: cargo build --release --bin forge + + - uses: actions/setup-node@v6 + with: + node-version: '22' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Generate + env: + FORGE_BINARY: .forge/target/release/forge + run: npm run generate:tools -- --summary "$RUNNER_TEMP/summary.md" + + - name: Check for changes + id: changes + run: | + if [ -n "$(git status --porcelain -- src/generated/forge-mcp)" ]; then + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Type check + if: steps.changes.outputs.changed == 'true' + run: npm run typecheck + + - name: Test + if: steps.changes.outputs.changed == 'true' + run: npm run test + + - name: Open or update the pull request + if: steps.changes.outputs.changed == 'true' + env: + GH_TOKEN: ${{ github.token }} + FORGE_REF: ${{ steps.forge.outputs.ref }} + run: | + git config user.name 'github-actions[bot]' + git config user.email '41898282+github-actions[bot]@users.noreply.github.com' + git checkout -B "$BRANCH" + git add src/generated/forge-mcp + git commit -q -m "$TITLE" + git push -q --force origin "$BRANCH" + { + echo "Regenerated from the latest \`openapi.forge.json\` with forge \`${FORGE_REF:0:12}\`. Merging deploys the new tools to \`/mcp?forge=true\`." + echo + cat "$RUNNER_TEMP/summary.md" + } > "$RUNNER_TEMP/body.md" + if [ "$(gh pr view "$BRANCH" --json state --jq .state 2>/dev/null)" = OPEN ]; then + gh pr edit "$BRANCH" --body-file "$RUNNER_TEMP/body.md" + else + gh pr create --base main --head "$BRANCH" --title "$TITLE" --body-file "$RUNNER_TEMP/body.md" + fi diff --git a/.gitignore b/.gitignore index 44bfaef4..8fa91f76 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,3 @@ node_modules dist/ *.log .worktrees/ -generated/ diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 08068dd7..19a7ede2 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -2,5 +2,8 @@ "$schema": "./node_modules/oxfmt/configuration_schema.json", "singleQuote": true, "semi": false, - "trailingComma": "none" + "trailingComma": "none", + "ignorePatterns": [ + "src/generated/**" + ] } diff --git a/AGENTS.md b/AGENTS.md index 008ad1df..b18767a1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -36,6 +36,8 @@ cloudflare-mcp/ │ ├── api-refusal-hint.ts # Looks up a refused execute request's permissions in mcp-tools.json │ ├── scope-challenge.ts # Per-request insufficient_scope step-up challenge │ ├── clients.ts # Known MCP clients that deviate from the spec, and their behavior +│ ├── generated/forge-mcp/ # Direct tools generated by forge (?forge=true); never edit by hand +│ ├── forge-tools/ # Cloudflare policy for the generated tools │ ├── auth/ │ │ ├── types.ts # Auth props schemas (Zod discriminated union) │ │ ├── api-token-mode.ts # Prefix classification & external resolver @@ -54,9 +56,12 @@ cloudflare-mcp/ │ ├── worker.test.ts # Real worker end to end via exports.default.fetch │ └── *.test.ts ├── scripts/ -│ └── seed-r2.ts # Seed OpenAPI spec to R2 bucket +│ ├── seed-r2.ts # Seed OpenAPI spec to R2 bucket +│ └── generate-tools.ts # Regenerate src/generated/forge-mcp with forge +├── forge.json # The forge commit that generates src/generated/forge-mcp ├── .github/workflows/ │ ├── ci.yml # PR validation +│ ├── forge-tools.yml # Six-hourly regeneration PR for src/generated/forge-mcp │ └── bonk.yml # AI code review ├── wrangler.jsonc # Workers config (dev/staging/prod) ├── .oxfmtrc.json # oxfmt formatter config @@ -162,13 +167,14 @@ The consent page offers minimal, read-only and full-access templates. Minimal is - `mcp-tools.json` holds the final wire JSON Schemas (including the session-independent optional `account_id`) plus minimal request-routing metadata. Each isolate builds the `tools/list` payload from it once and serves it unchanged; `tools/call` lazily validates/dispatches only the requested operation with Zod. No per-endpoint SDK tools are registered - `src/isolate-cache.ts` caches all three artifacts for one hour in warm isolates. Concurrent requests on a cold isolate share one load, and a failed load is not cached. There is no fallback: a missing `mcp-tools.json` fails the request, so seed R2 (`npm run seed:staging` / `seed:prod`) before deploying a change to its key or shape -### forge-mcp direct tools (`?forge=true`, opt-in) +### Forge-generated direct tools (`?forge=true`, opt-in) -A second direct-tool surface, generated by forge rather than by `src/openapi.ts`, while it is tried out: +A second direct-tool surface whose code is generated by forge rather than built from the spec at runtime, while it is tried out: -- `src/forge-tools/plugin-entry.ts` is a forge plugin: the generic `@cloudflare/forge-mcp` catalogue (vendored in `vendor/` until it is published) with the Cloudflare policy in `src/forge-tools/cloudflare-plugin.ts` applied. `account_id` is optional with one description, merged `account_or_zone` tools name their two values, and accepted API token permissions go in each tool's `extensions`, which clients never see. `src/forge-tools/policy.ts` holds what the plugin and the Worker share -- `npm run generate:tools` builds the plugin with `forge-plugin` and runs the `forge` binary (both from the `@cloudflare/forge` dev dependency) on the latest `openapi.forge.json`, into `generated/forge/` (gitignored). The scheduled handler can't run forge, so `forge-mcp-tools.json` reaches R2 only through `npm run seed:staging` / `seed:prod` for now -- `src/tools/forge-tools.ts` serves the catalogue from the isolate cache next to `docs` and `whoami`, fills in the session's account, builds each request with forge-mcp's `buildRequest`, and explains refused calls and steps up OAuth scopes like the other direct tools +- `src/generated/forge-mcp/` is TypeScript that `forge openapi.forge.json --target mcp` writes, committed and never edited by hand. Each group's `tools.ts` has its tools: schema, hints, the method's extensions, and a `request(args)` function that builds the API request. `schemas.ts` files hold the shared model schemas, `index.ts` exports every tool, `README.md` lists the methods without a tool and why, and `_/` is forge's runtime for serving them on an `McpServer`. oxfmt and oxlint skip it +- The MCP target lives on the long-lived `forge-mcp` branch of a forge fork; `forge.json` pins the commit. `FORGE_BINARY=… npm run generate:tools` regenerates locally. `.github/workflows/forge-tools.yml` builds that forge, regenerates from the latest `openapi.forge.json` every six hours, runs the type check and tests, and opens or updates the `bot/forge-tools` pull request when the code changes. Merging it deploys. To change the generator, bump `forge.json`'s `ref` +- `src/forge-tools/cloudflare.ts` applies the Cloudflare policy once per isolate: `account_id` is optional with one description, and merged `account_or_zone` tools name their two values. Permissions come from each tool's `x-api-token-group` extension, which clients never see +- `src/tools/forge-tools.ts` imports the generated module lazily, so isolates serving Code Mode only scan it (about +27 ms of startup CPU against +55 ms for a static import). It serves the tools next to `docs` and `whoami`, fills in the session's account, builds each request with the tool's generated code, and explains refused calls and steps up OAuth scopes like the other direct tools - Tool names are forge's (`d1_list`, `zones_list`), not `src/openapi.ts`'s, so `?forge=true` is a separate opt-in; `?codemode=false` is unchanged ### Skills over MCP diff --git a/README.md b/README.md index b11885cb..469398bf 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ https://mcp.cloudflare.com/mcp?codemode=false&truncateToolResult=false ### Forge-generated tools (preview) -`?forge=true` serves direct tools generated by [forge-mcp](https://github.com/cloudflare/forge) from the Cloudflare API's [Forge](https://github.com/cloudflare/forge) document instead. Tool names follow the `cf` CLI (`zones_list`, `d1_list`), and request bodies are typed, nested JSON. It is a preview: names and schemas may change. +`?forge=true` serves direct tools whose code [forge](https://github.com/cloudflare/forge) generates from the Cloudflare API's OpenAPI document instead. Tool names follow the `cf` CLI (`zones_list`, `d1_list`), and request bodies are typed, nested JSON. It is a preview: names and schemas may change. ``` https://mcp.cloudflare.com/mcp?forge=true diff --git a/forge.json b/forge.json new file mode 100644 index 00000000..d2f2498c --- /dev/null +++ b/forge.json @@ -0,0 +1,5 @@ +{ + "$comment": "The forge that generates src/generated/forge-mcp: a commit of the forge-mcp branch. Bump ref to pick up generator changes; CI builds it.", + "repository": "mattzcarey/forge", + "ref": "7343465ffba1eb5534394fa9219b1c96f0518a3d" +} diff --git a/package-lock.json b/package-lock.json index b1ff5146..5877003b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,6 @@ "name": "cloudflare-mcp", "version": "0.1.0", "dependencies": { - "@cloudflare/forge-mcp": "file:vendor/cloudflare-forge-mcp-0.1.0.tgz", "@cloudflare/workers-oauth-provider": "^1.2.3", "@modelcontextprotocol/server": "2.3.1", "hono": "^4.13.7", @@ -16,8 +15,6 @@ "zod": "^4.3.5" }, "devDependencies": { - "@bytecodealliance/jco": "1.37.0", - "@cloudflare/forge": "https://pkg.pr.new/cloudflare/forge/@cloudflare/forge@ca70d7f5", "@cloudflare/vitest-plugin": "^1.4.0", "@modelcontextprotocol/client": "2.3.1", "@types/node": "^25.0.6", @@ -32,124 +29,104 @@ "wrangler": "^4.149.0" } }, - "node_modules/@andreiltd/componentize-qjs-binding-darwin-arm64": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-darwin-arm64/-/componentize-qjs-binding-darwin-arm64-0.4.5.tgz", - "integrity": "sha512-CW+ukVP778x2NAHAC1FvXb5KVSXmUlUQxhQTFtF0mAqqOVnYrQgy4DDNUa48EGthwtLdgLT1+eE71qmQiyMEqg==", - "cpu": [ - "arm64" - ], + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", + "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT OR Apache-2.0", "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, - "node_modules/@andreiltd/componentize-qjs-binding-darwin-x64": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-darwin-x64/-/componentize-qjs-binding-darwin-x64-0.4.5.tgz", - "integrity": "sha512-37uz97pCEuXNfoVuZMBbI6xUirSndxJyMzPa4UCQb9nJdZhzRujmrU79yiFl+5nDYQxcCjthhBVEKU3OxJNAdg==", - "cpu": [ - "x64" - ], + "node_modules/@cloudflare/unenv-preset": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.2.tgz", + "integrity": "sha512-JBP1+Z7ZSNG/d4mRP+y8VC5dka3tZVMLEZRvS+rzQ4DGV1EoxRFQckcJTTkXbHSQiTj0DtNI01Zwb/V2fX0mvQ==", "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18.0.0" + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": ">1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } } }, - "node_modules/@andreiltd/componentize-qjs-binding-linux-arm64-gnu": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-linux-arm64-gnu/-/componentize-qjs-binding-linux-arm64-gnu-0.4.5.tgz", - "integrity": "sha512-L5S0C6qIx3f+DnwN42HnDuMhV8NgfqaY+J1PaJAw468Ip/JN+h67tVAp4wUvs8xgTqj6UnGSBbSZVGYifK2XtA==", - "cpu": [ - "arm64" - ], + "node_modules/@cloudflare/vitest-plugin": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@cloudflare/vitest-plugin/-/vitest-plugin-1.4.0.tgz", + "integrity": "sha512-SgIhyhpVH+2MVSJxidG8gosqrpzF25IwKevQhPykwulTgAFe4s0Nkj71pNzqCkwV2+A4NKkHJP2ReyyRsoIxsg==", "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18.0.0" + "license": "MIT", + "dependencies": { + "cjs-module-lexer": "1.2.3", + "esbuild": "0.28.2", + "miniflare": "5.20261006.1-alpha", + "wrangler": "4.149.0", + "zod": "4.6.5" + }, + "peerDependencies": { + "vitest": "^4.1.0 || ^5.0.0" } }, - "node_modules/@andreiltd/componentize-qjs-binding-linux-arm64-musl": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-linux-arm64-musl/-/componentize-qjs-binding-linux-arm64-musl-0.4.5.tgz", - "integrity": "sha512-bBaq8/tvQ6HweqBLKWkE5tsPEMf7g3l5EGtka3Z7AFDUOtFzkAkG67nW1OYiYT6/0pjwDYw7Mvya45f79PG28g==", + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20261006.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20261006.1.tgz", + "integrity": "sha512-lCX6avJO2It9AyDEYitjmOtJRVp/xmaW0TziyoLAnfxlzozyyRbSFfIIMMCiDx/sTP1++E4VLbV+7BHSD33f0Q==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=18.0.0" + "node": ">=16" } }, - "node_modules/@andreiltd/componentize-qjs-binding-linux-x64-gnu": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-linux-x64-gnu/-/componentize-qjs-binding-linux-x64-gnu-0.4.5.tgz", - "integrity": "sha512-Xec4O4sy/xHlhPPhf7GAV41D+AT7f9vxxjBpE7lUIElZNhX/kc+Ty6AQG50xbHsT5Mi4XQvSmtJJqhnB6xi8Vw==", + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20261006.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20261006.1.tgz", + "integrity": "sha512-PyFGjOaldtppnLuKsdkoYWXfLVpDjuf8u+uoykX+1Xvxo2EPmCVViq0iDKm+U7c7PRno85ehS3/MPVXyk2HwHw==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=18.0.0" + "node": ">=16" } }, - "node_modules/@andreiltd/componentize-qjs-binding-linux-x64-musl": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-linux-x64-musl/-/componentize-qjs-binding-linux-x64-musl-0.4.5.tgz", - "integrity": "sha512-62+PgJ+tJOjgNvXzRuz3s76tPBaExCodeVhDIIXkGI/PNbulqTHiyYXRw4O3UX6/CO71Nux8onqnXxQkcXBlvg==", + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20261006.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20261006.1.tgz", + "integrity": "sha512-Ntf9S8eesmVufdjaT2kzWlz6Ng9XGYTc6cHQVRKAg59lFufwsIabGeMT6U4KkrpEeSIxgHq8aPtuLbZXE19tCA==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18.0.0" + "node": ">=16" } }, - "node_modules/@andreiltd/componentize-qjs-binding-win32-arm64-msvc": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-win32-arm64-msvc/-/componentize-qjs-binding-win32-arm64-msvc-0.4.5.tgz", - "integrity": "sha512-OZO/omsMQFpw3wJJs3XFN+iEu2ZQCWMK8BxkhmXVm1sddEHtgSTY2sT/zq69VZeXjC0zgN1HzlxHbNBq0OkcOQ==", + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20261006.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20261006.1.tgz", + "integrity": "sha512-JyeDBymVWw5tVRebSsVE8ojDYxd6UlZrAseHU8G+NpIyd5wF61tXlF/axLeCUqu0pOhBFHb8I5QKi0jwrCK41Q==", "cpu": [ "arm64" ], @@ -157,16 +134,16 @@ "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">=18.0.0" + "node": ">=16" } }, - "node_modules/@andreiltd/componentize-qjs-binding-win32-x64-msvc": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@andreiltd/componentize-qjs-binding-win32-x64-msvc/-/componentize-qjs-binding-win32-x64-msvc-0.4.5.tgz", - "integrity": "sha512-IlhlcNOEFky46ypfiD6l8MS45zosfhKWUclr10evQFw5Cpky+pji2RAGJRnBXdLQvH4Q3bZr6KYlIhxmtGRhkw==", + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20261006.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20261006.1.tgz", + "integrity": "sha512-nWP0URNqOBN9fa/gZ7eh/w051DwjOXN8j4lDZDYVXyQPsux6sV3DfyYZT+CjR/rt9nKBSmJT9QE9/bWT18+84w==", "cpu": [ "x64" ], @@ -177,734 +154,434 @@ "win32" ], "engines": { - "node": ">=18.0.0" + "node": ">=16" } }, - "node_modules/@bytecodealliance/componentize-js": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/componentize-js/-/componentize-js-0.23.0.tgz", - "integrity": "sha512-Qc2+lrwJHU7lq4CBMyVVYE8ASyUFeegMYdRnMVG0wNpNiATzGDF/mWpjDNTeVZeT8L9chhK3vuLaQE9FVANvfw==", - "dev": true, - "workspaces": [ - "." - ], - "dependencies": { - "@bytecodealliance/jco": "^1.15.1", - "@bytecodealliance/weval": "^0.5.0", - "@bytecodealliance/wizer": "^10.0.0", - "es-module-lexer": "^1.6.0", - "oxc-parser": "^0.76.0" - }, - "bin": { - "componentize-js": "src/cli.js" - } + "node_modules/@cloudflare/workers-oauth-provider": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-oauth-provider/-/workers-oauth-provider-1.2.3.tgz", + "integrity": "sha512-40eGeA3DnTOEl2ijHYY5Z9yNIf0fdjgomoaA6GHPo4FyKQw0oXPuy4GVjTE/uNfS/MoFAvzsuVBRwTPKUki4hA==", + "license": "MIT" }, - "node_modules/@bytecodealliance/componentize-js-0-19-3": { - "name": "@bytecodealliance/componentize-js", - "version": "0.19.3", - "resolved": "https://registry.npmjs.org/@bytecodealliance/componentize-js/-/componentize-js-0.19.3.tgz", - "integrity": "sha512-ju7Y4WeF0B9uMkSPHJgmT6ouEfSwbe9M1uR/YOnYZjBpxJjH9qzxIkJg/kf8NycVDyFJ2/lscmJ1E1uPiDQVRQ==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "workspaces": [ - "." - ], + "license": "MIT", "dependencies": { - "@bytecodealliance/jco": "^1.15.1", - "@bytecodealliance/wizer": "^10.0.0", - "es-module-lexer": "^1.6.0", - "oxc-parser": "^0.76.0" + "@jridgewell/trace-mapping": "0.3.9" }, - "bin": { - "componentize-js": "src/cli.js" + "engines": { + "node": ">=12" } }, - "node_modules/@bytecodealliance/componentize-js-0-19-3/node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@bytecodealliance/componentize-js/node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@bytecodealliance/jco": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco/-/jco-1.37.0.tgz", - "integrity": "sha512-z/crtP4L3wumdFA74K1cEsLfdZ8Ki0dE/7m1fJ9SVq5Z9VsAf0yQXWQzMb6ZrJmXvRN+4wHC2MNkFwSFdaoBzQ==", + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", + "license": "MIT", + "optional": true, "dependencies": { - "@bytecodealliance/componentize-js": "^0.23.0", - "@bytecodealliance/componentize-js-0-19-3": "npm:@bytecodealliance/componentize-js@^0.19.3", - "@bytecodealliance/jco-std": "^0.7.0", - "@bytecodealliance/jco-transpile": "^0.18.0", - "@bytecodealliance/preview2-shim": "^0.28.0", - "binaryen": "^132.0.0", - "commander": "^14", - "componentize-qjs": "^0.4.5", - "mkdirp": "^3", - "regexpu-core": "6.4.0", - "rolldown": "^1.2.4", - "typescript": "7.0.2", - "typescript-compiler-api": "npm:typescript@6.0.3", - "unenv": "2.0.0-rc.24" - }, - "bin": { - "jco": "dist/jco.js" + "tslib": "^2.4.0" } }, - "node_modules/@bytecodealliance/jco-node-fs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs/-/jco-node-fs-0.3.2.tgz", - "integrity": "sha512-yxvqQreNcOQdMsEKZomkSqThtkxrAz3f1Cmy8BsV0UHi9saa2/D1KDB14IAXPYwDq/maS6lCzS+MuMQx6QkUgA==", - "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", - "engines": { - "node": ">=20" - }, - "optionalDependencies": { - "@bytecodealliance/jco-node-fs-darwin-arm64": "0.3.2", - "@bytecodealliance/jco-node-fs-darwin-x64": "0.3.2", - "@bytecodealliance/jco-node-fs-linux-arm64-gnu": "0.3.2", - "@bytecodealliance/jco-node-fs-linux-arm64-musl": "0.3.2", - "@bytecodealliance/jco-node-fs-linux-x64-gnu": "0.3.2", - "@bytecodealliance/jco-node-fs-linux-x64-musl": "0.3.2", - "@bytecodealliance/jco-node-fs-win32-arm64-msvc": "0.3.2", - "@bytecodealliance/jco-node-fs-win32-x64-msvc": "0.3.2" - } - }, - "node_modules/@bytecodealliance/jco-node-fs-darwin-arm64": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-darwin-arm64/-/jco-node-fs-darwin-arm64-0.3.2.tgz", - "integrity": "sha512-WXQq1tRVUWhbK+ImH0G8Kni2AR0sdokLf/KyXRw5P6n4A9ZbgMHOuPfN/PEsYgw4eosuTAonutK0xILk/hA81A==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", + "license": "MIT", "optional": true, "os": [ - "darwin" + "aix" ], "engines": { - "node": ">=20" + "node": ">=18" } }, - "node_modules/@bytecodealliance/jco-node-fs-darwin-x64": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-darwin-x64/-/jco-node-fs-darwin-x64-0.3.2.tgz", - "integrity": "sha512-Fy/OjHnto7hNE5ksewVkmAMXG/uXyj+RAKFZWQFTzFkp73UyT5vuPjKq3nvx9KolUGWBG37BudEMb4ZAoD9TbQ==", + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ - "x64" + "arm" ], "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", + "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": ">=20" + "node": ">=18" } }, - "node_modules/@bytecodealliance/jco-node-fs-linux-arm64-gnu": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-linux-arm64-gnu/-/jco-node-fs-linux-arm64-gnu-0.3.2.tgz", - "integrity": "sha512-OafRtRu3tfOFQARfkia/LDEqSo2R3yAL1xPwzf4RcRW6JqkOY7qKWsUS5+LPVo/aFaSkMX7F7bdFGpFPmcoZJg==", + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "(Apache-2.0 WITH LLVM-exception)", + "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">=20" + "node": ">=18" } }, - "node_modules/@bytecodealliance/jco-node-fs-linux-arm64-musl": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-linux-arm64-musl/-/jco-node-fs-linux-arm64-musl-0.3.2.tgz", - "integrity": "sha512-JblDiwD7+Y+w0d/tjaNDX4QdGvh5lyuDc+S/jDeT7sYA1caA9yiwIjLa8PC/lm2xudqSxD+Cuy4AosXvl+qI0g==", + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "libc": [ - "musl" - ], - "license": "(Apache-2.0 WITH LLVM-exception)", + "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">=20" + "node": ">=18" } }, - "node_modules/@bytecodealliance/jco-node-fs-linux-x64-gnu": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-linux-x64-gnu/-/jco-node-fs-linux-x64-gnu-0.3.2.tgz", - "integrity": "sha512-6FzmHoLOsa6b4X9AuFLsvlpNF66Dt4sRRftZHaT1I1pYzCWrJkkpgNJhRXxf67ZPmOwBZJT4dan/g752Rx4xRw==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "(Apache-2.0 WITH LLVM-exception)", + "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=20" + "node": ">=18" } }, - "node_modules/@bytecodealliance/jco-node-fs-linux-x64-musl": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-linux-x64-musl/-/jco-node-fs-linux-x64-musl-0.3.2.tgz", - "integrity": "sha512-SbAJG2PDV8YAHBESHU9sVSckOitJyvlezdF4CGP5/mOp01JnijVkLVXzGK62yVSfa5TpAybbSd1rk+v36NAW/Q==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], - "license": "(Apache-2.0 WITH LLVM-exception)", + "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=20" + "node": ">=18" } }, - "node_modules/@bytecodealliance/jco-node-fs-win32-arm64-msvc": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-win32-arm64-msvc/-/jco-node-fs-win32-arm64-msvc-0.3.2.tgz", - "integrity": "sha512-nUWYdFysRQJGsIOCk0KAYN2smkNYiHG7rZ7m+0ZXqP+5wqWxKEjkDsORwXiBjdaWFLVww0anZ3SBxrju6P7hXQ==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", + "license": "MIT", "optional": true, "os": [ - "win32" + "freebsd" ], "engines": { - "node": ">=20" + "node": ">=18" } }, - "node_modules/@bytecodealliance/jco-node-fs-win32-x64-msvc": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-node-fs-win32-x64-msvc/-/jco-node-fs-win32-x64-msvc-0.3.2.tgz", - "integrity": "sha512-RsPj2t8TvltsMWK7/Z7JcVC/IWPMi07/AJkNLiNTCuGTdT/sseqTThJJwhuz3sjFw7dJdxA+bSGT+23y/KT0fw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", + "license": "MIT", "optional": true, "os": [ - "win32" + "freebsd" ], "engines": { - "node": ">=20" + "node": ">=18" } }, - "node_modules/@bytecodealliance/jco-std": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-std/-/jco-std-0.7.0.tgz", - "integrity": "sha512-QSiIRXS5eMUTe0gt5D45vZK4Pt7Hdf0S0Gr2Lt3+Q0h4YIq+n8EbEioQ2lem2edNWT/Zym+YvEXDZOhS3qZ2dw==", + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", - "dependencies": { - "acorn": "8.17.0", - "acorn-walk": "8.3.5", - "minimatch": "10.2.6", - "punycode": "2.3.1", - "readable-stream": "4.7.0", - "urlpattern-polyfill": "10.1.0", - "whatwg-url": "14.2.0" - }, - "peerDependencies": { - "@bytecodealliance/preview2-shim": "^0.28.0" - }, - "peerDependenciesMeta": { - "@bytecodealliance/preview2-shim": { - "optional": true - } - } - }, - "node_modules/@bytecodealliance/jco-transpile": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/jco-transpile/-/jco-transpile-0.18.0.tgz", - "integrity": "sha512-Ou4MWoxGC6HKBjRpTJ4SEUxsN8DOAv9LIi2RD22Kosq2OZTnUvKikFrOAGS2vCGNMzvXkeKBS1jFMLKzYBk4pg==", - "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", - "dependencies": { - "@bytecodealliance/preview2-shim": "^0.28.0", - "@bytecodealliance/preview3-shim": "^0.9.0", - "binaryen": "^132.0.0", - "oxc-minify": "^0.151.0" - } - }, - "node_modules/@bytecodealliance/jco/node_modules/typescript": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", - "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc" - }, - "engines": { - "node": ">=16.20.0" - }, - "optionalDependencies": { - "@typescript/typescript-aix-ppc64": "7.0.2", - "@typescript/typescript-darwin-arm64": "7.0.2", - "@typescript/typescript-darwin-x64": "7.0.2", - "@typescript/typescript-freebsd-arm64": "7.0.2", - "@typescript/typescript-freebsd-x64": "7.0.2", - "@typescript/typescript-linux-arm": "7.0.2", - "@typescript/typescript-linux-arm64": "7.0.2", - "@typescript/typescript-linux-loong64": "7.0.2", - "@typescript/typescript-linux-mips64el": "7.0.2", - "@typescript/typescript-linux-ppc64": "7.0.2", - "@typescript/typescript-linux-riscv64": "7.0.2", - "@typescript/typescript-linux-s390x": "7.0.2", - "@typescript/typescript-linux-x64": "7.0.2", - "@typescript/typescript-netbsd-arm64": "7.0.2", - "@typescript/typescript-netbsd-x64": "7.0.2", - "@typescript/typescript-openbsd-arm64": "7.0.2", - "@typescript/typescript-openbsd-x64": "7.0.2", - "@typescript/typescript-sunos-x64": "7.0.2", - "@typescript/typescript-win32-arm64": "7.0.2", - "@typescript/typescript-win32-x64": "7.0.2" - } - }, - "node_modules/@bytecodealliance/preview2-shim": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/preview2-shim/-/preview2-shim-0.28.0.tgz", - "integrity": "sha512-55y59uAzYMTA1bTepmgC7LmK8DUyhOU+y7cfKQRV7wRVABMYna4t7KYpBUkO8VhI+FbDn5cq0ghPLelaP24OpQ==", - "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", - "dependencies": { - "@bytecodealliance/jco-node-fs": "0.3.2" - } - }, - "node_modules/@bytecodealliance/preview3-shim": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/preview3-shim/-/preview3-shim-0.9.0.tgz", - "integrity": "sha512-/0dEMWyxFyTF/1tsxspU8p6dgfWnQ4SSY+ray8QBJi7KFJu1W6R3M3BFRL83PJ+PmMyuOBaRhhYH3rR6kE+pcA==", - "dev": true, - "license": "(Apache-2.0 WITH LLVM-exception)", - "dependencies": { - "@bytecodealliance/jco-node-fs": "0.3.2", - "@bytecodealliance/preview2-shim": "^0.28.0" - } - }, - "node_modules/@bytecodealliance/weval": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@bytecodealliance/weval/-/weval-0.5.1.tgz", - "integrity": "sha512-Hb8qRoF3b2UgkZqeDTzaTKGITa31KCLcoyfFstE/uO/aYVUyHweaNDchF4SNrPQfEpiBwRnMUilI4Jbbl8Hl6w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@napi-rs/lzma": "^1.1.2", - "fflate": "^0.8.3", - "tar": "^7.5.19" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@bytecodealliance/wizer": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer/-/wizer-10.0.0.tgz", - "integrity": "sha512-ziWmovyu1jQl9TsKlfC2bwuUZwxVPFHlX4fOqTzxhgS76jITIo45nzODEwPgU+jjmOr8F3YX2V2wAChC5NKujg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "wizer": "wizer.js" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "@bytecodealliance/wizer-darwin-arm64": "10.0.0", - "@bytecodealliance/wizer-darwin-x64": "10.0.0", - "@bytecodealliance/wizer-linux-arm64": "10.0.0", - "@bytecodealliance/wizer-linux-s390x": "10.0.0", - "@bytecodealliance/wizer-linux-x64": "10.0.0", - "@bytecodealliance/wizer-win32-x64": "10.0.0" - } - }, - "node_modules/@bytecodealliance/wizer-darwin-arm64": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-darwin-arm64/-/wizer-darwin-arm64-10.0.0.tgz", - "integrity": "sha512-dhZTWel+xccGTKSJtI9A7oM4yyP20FWflsT+AoqkOqkCY7kCNrj4tmMtZ6GXZFRDkrPY5+EnOh62sfShEibAMA==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], - "bin": { - "wizer-darwin-arm64": "wizer" + "engines": { + "node": ">=18" } }, - "node_modules/@bytecodealliance/wizer-darwin-x64": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-darwin-x64/-/wizer-darwin-x64-10.0.0.tgz", - "integrity": "sha512-r/LUIZw6Q3Hf4htd46mD+EBxfwjBkxVIrTM1r+B2pTCddoBYQnKVdVsI4UFyy7NoBxzEg8F8BwmTNoSLmFRjpw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ - "x64" + "ia32" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], - "bin": { - "wizer-darwin-x64": "wizer" + "engines": { + "node": ">=18" } }, - "node_modules/@bytecodealliance/wizer-linux-arm64": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-arm64/-/wizer-linux-arm64-10.0.0.tgz", - "integrity": "sha512-pGSfFWXzeTqHm6z1PtVaEn+7Fm3QGC8YnHrzBV4sQDVS3N1NwmuHZAc8kslmlFPNdu61ycEvdOsSgCny8JPQvg==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ - "arm64" + "loong64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], - "bin": { - "wizer-linux-arm64": "wizer" + "engines": { + "node": ">=18" } }, - "node_modules/@bytecodealliance/wizer-linux-s390x": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-s390x/-/wizer-linux-s390x-10.0.0.tgz", - "integrity": "sha512-O8vHxRTAdb1lUnVXMIMTcp/9q4pq1D4iIKigJCipg2JN15taV9uFAWh0fO88wylXwuSlO7dOE1AwQl54fMKXQg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ - "s390x" + "mips64el" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], - "bin": { - "wizer-linux-s390x": "wizer" + "engines": { + "node": ">=18" } }, - "node_modules/@bytecodealliance/wizer-linux-x64": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-linux-x64/-/wizer-linux-x64-10.0.0.tgz", - "integrity": "sha512-fJtM1sy43FBMnp+xpapFX6U1YdTBKA/1T4CYfG/qeE8jn0SXk2EuiYoY/EnC2uyNy9hjTrvfdYO5n4MXW0EIdQ==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ - "x64" + "ppc64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], - "bin": { - "wizer-linux-x64": "wizer" + "engines": { + "node": ">=18" } }, - "node_modules/@bytecodealliance/wizer-win32-x64": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@bytecodealliance/wizer-win32-x64/-/wizer-win32-x64-10.0.0.tgz", - "integrity": "sha512-55BPLfGT7iT7gH5M69NpTM16QknJZ7OxJ0z73VOEoeGA9CT8QPKMRzFKsPIvLs+W8G28fdudFA94nElrdkp3Kg==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ - "x64" + "riscv64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], - "bin": { - "wizer-win32-x64": "wizer" - } - }, - "node_modules/@cloudflare/forge": { - "version": "0.1.0", - "resolved": "https://pkg.pr.new/cloudflare/forge/@cloudflare/forge@ca70d7f5", - "integrity": "sha512-h6POFCKOMX96O8RFhV/ZNyQouZdJIbx8e51D4pq6NKxNeCixV4fuSc4bKbieX0xVfF+e81iw5HlG9vKg9twvlw==", - "dev": true, - "bin": { - "forge": "bin/forge.cjs", - "forge-plugin": "bin/forge-plugin.mjs" - }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "@bytecodealliance/jco": "^1.37.0" - }, - "peerDependenciesMeta": { - "@bytecodealliance/jco": { - "optional": true - } - } - }, - "node_modules/@cloudflare/forge-mcp": { - "version": "0.1.0", - "resolved": "file:vendor/cloudflare-forge-mcp-0.1.0.tgz", - "integrity": "sha512-uqpZCVozTOkmdL+wNoenKp1J4OndTEOMAFgD6/Lf1WCcLb8N2e+J3JqnruW15oR0a5e2XFo8ZK1lQxgsXi54+g==", - "dependencies": { - "@modelcontextprotocol/server": "2.3.1" - } - }, - "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", - "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", - "dev": true, - "license": "MIT OR Apache-2.0", - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/@cloudflare/unenv-preset": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.2.tgz", - "integrity": "sha512-JBP1+Z7ZSNG/d4mRP+y8VC5dka3tZVMLEZRvS+rzQ4DGV1EoxRFQckcJTTkXbHSQiTj0DtNI01Zwb/V2fX0mvQ==", - "dev": true, - "license": "MIT OR Apache-2.0", - "peerDependencies": { - "unenv": "2.0.0-rc.24", - "workerd": ">1.20260305.0 <2.0.0-0" - }, - "peerDependenciesMeta": { - "workerd": { - "optional": true - } } }, - "node_modules/@cloudflare/vitest-plugin": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@cloudflare/vitest-plugin/-/vitest-plugin-1.4.0.tgz", - "integrity": "sha512-SgIhyhpVH+2MVSJxidG8gosqrpzF25IwKevQhPykwulTgAFe4s0Nkj71pNzqCkwV2+A4NKkHJP2ReyyRsoIxsg==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "cjs-module-lexer": "1.2.3", - "esbuild": "0.28.2", - "miniflare": "5.20261006.1-alpha", - "wrangler": "4.149.0", - "zod": "4.6.5" - }, - "peerDependencies": { - "vitest": "^4.1.0 || ^5.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20261006.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20261006.1.tgz", - "integrity": "sha512-lCX6avJO2It9AyDEYitjmOtJRVp/xmaW0TziyoLAnfxlzozyyRbSFfIIMMCiDx/sTP1++E4VLbV+7BHSD33f0Q==", + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20261006.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20261006.1.tgz", - "integrity": "sha512-PyFGjOaldtppnLuKsdkoYWXfLVpDjuf8u+uoykX+1Xvxo2EPmCVViq0iDKm+U7c7PRno85ehS3/MPVXyk2HwHw==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "darwin" + "netbsd" ], "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20261006.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20261006.1.tgz", - "integrity": "sha512-Ntf9S8eesmVufdjaT2kzWlz6Ng9XGYTc6cHQVRKAg59lFufwsIabGeMT6U4KkrpEeSIxgHq8aPtuLbZXE19tCA==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20261006.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20261006.1.tgz", - "integrity": "sha512-JyeDBymVWw5tVRebSsVE8ojDYxd6UlZrAseHU8G+NpIyd5wF61tXlF/axLeCUqu0pOhBFHb8I5QKi0jwrCK41Q==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "openbsd" ], "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20261006.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20261006.1.tgz", - "integrity": "sha512-nWP0URNqOBN9fa/gZ7eh/w051DwjOXN8j4lDZDYVXyQPsux6sV3DfyYZT+CjR/rt9nKBSmJT9QE9/bWT18+84w==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "win32" + "openbsd" ], "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@cloudflare/workers-oauth-provider": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-oauth-provider/-/workers-oauth-provider-1.2.3.tgz", - "integrity": "sha512-40eGeA3DnTOEl2ijHYY5Z9yNIf0fdjgomoaA6GHPo4FyKQw0oXPuy4GVjTE/uNfS/MoFAvzsuVBRwTPKUki4hA==", - "license": "MIT" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@emnapi/core": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", - "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", - "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/openharmony-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", - "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "openharmony" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { + "node_modules/@esbuild/sunos-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", - "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "sunos" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm64": { + "node_modules/@esbuild/win32-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", - "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -912,425 +589,513 @@ "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-x64": { + "node_modules/@esbuild/win32-ia32": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", - "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ - "x64" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/darwin-arm64": { + "node_modules/@esbuild/win32-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", - "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", - "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", - "cpu": [ - "x64" - ], + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", - "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.5.tgz", + "integrity": "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "freebsd" + "darwin" ], "engines": { - "node": ">=18" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.4" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", - "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "node_modules/@img/sharp-darwin-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.5.tgz", + "integrity": "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "freebsd" + "darwin" ], "engines": { - "node": ">=18" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.4" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", - "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", - "cpu": [ - "arm" - ], + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", + "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "os": [ - "linux" + "freebsd" ], + "dependencies": { + "@img/sharp-wasm32": "0.35.5" + }, "engines": { - "node": ">=18" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", - "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.4.tgz", + "integrity": "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "linux" + "darwin" ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", - "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.4.tgz", + "integrity": "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", "cpu": [ - "ia32" + "x64" ], "dev": true, - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "linux" + "darwin" ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", - "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.4.tgz", + "integrity": "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", "cpu": [ - "loong64" + "arm" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", - "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.4.tgz", + "integrity": "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", "cpu": [ - "mips64el" + "arm64" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", - "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.4.tgz", + "integrity": "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", - "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.4.tgz", + "integrity": "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", - "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.4.tgz", + "integrity": "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", - "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.4.tgz", + "integrity": "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", - "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.4.tgz", + "integrity": "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "netbsd" + "linux" ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", - "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.4.tgz", + "integrity": "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "netbsd" + "linux" ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", - "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.5.tgz", + "integrity": "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", "cpu": [ - "arm64" + "arm" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.4" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", - "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.5.tgz", + "integrity": "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.4" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", - "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.5.tgz", + "integrity": "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ - "openharmony" + "linux" ], "engines": { - "node": ">=18" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.4" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", - "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.5.tgz", + "integrity": "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", "cpu": [ - "x64" + "riscv64" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ - "sunos" + "linux" ], "engines": { - "node": ">=18" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.4" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", - "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.5.tgz", + "integrity": "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", "cpu": [ - "arm64" + "s390x" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">=18" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.4" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", - "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.5.tgz", + "integrity": "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", "cpu": [ - "ia32" + "x64" ], "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">=18" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.4" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.5.tgz", + "integrity": "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "MIT", + "libc": [ + "musl" + ], + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@img/colour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" } }, - "node_modules/@img/sharp-darwin-arm64": { + "node_modules/@img/sharp-linuxmusl-x64": { "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.5.tgz", - "integrity": "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.5.tgz", + "integrity": "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", "cpu": [ - "arm64" + "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "Apache-2.0", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { "node": ">=20.9.0" @@ -1339,42 +1104,36 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.3.4" + "@img/sharp-libvips-linuxmusl-x64": "1.3.4" } }, - "node_modules/@img/sharp-darwin-x64": { + "node_modules/@img/sharp-wasm32": { "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.5.tgz", - "integrity": "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", - "cpu": [ - "x64" - ], + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", + "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", "dev": true, - "license": "Apache-2.0", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, "engines": { "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.3.4" } }, - "node_modules/@img/sharp-freebsd-wasm32": { + "node_modules/@img/sharp-webcontainers-wasm32": { "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", - "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.5.tgz", + "integrity": "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", + "cpu": [ + "wasm32" + ], "dev": true, "license": "Apache-2.0", "optional": true, - "os": [ - "freebsd" - ], "dependencies": { "@img/sharp-wasm32": "0.35.5" }, @@ -1385,2075 +1144,289 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.4.tgz", - "integrity": "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.5.tgz", + "integrity": "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", "cpu": [ "arm64" ], "dev": true, - "license": "LGPL-3.0-or-later", + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ - "darwin" + "win32" ], + "engines": { + "node": ">=20.9.0" + }, "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.4.tgz", - "integrity": "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.5.tgz", + "integrity": "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", "cpu": [ - "x64" + "ia32" ], "dev": true, - "license": "LGPL-3.0-or-later", + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ - "darwin" + "win32" ], + "engines": { + "node": "^20.9.0" + }, "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.4.tgz", - "integrity": "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.5.tgz", + "integrity": "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", "cpu": [ - "arm" + "x64" ], "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ - "linux" + "win32" ], + "engines": { + "node": ">=20.9.0" + }, "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.4.tgz", - "integrity": "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", - "cpu": [ - "arm64" - ], + "node_modules/@inquirer/ansi": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", + "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.4.tgz", - "integrity": "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@inquirer/confirm": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", + "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.4.tgz", - "integrity": "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", - "cpu": [ - "riscv64" - ], + "node_modules/@inquirer/core": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.4.tgz", - "integrity": "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", - "cpu": [ - "s390x" - ], + "node_modules/@inquirer/figures": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", + "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.4.tgz", - "integrity": "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.4.tgz", - "integrity": "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.4.tgz", - "integrity": "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.5.tgz", - "integrity": "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.3.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.5.tgz", - "integrity": "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.3.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.5.tgz", - "integrity": "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.3.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.5.tgz", - "integrity": "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.3.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.5.tgz", - "integrity": "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.3.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.5.tgz", - "integrity": "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.3.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.5.tgz", - "integrity": "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.5.tgz", - "integrity": "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.3.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", - "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.11.3" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-webcontainers-wasm32": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.5.tgz", - "integrity": "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/sharp-wasm32": "0.35.5" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.5.tgz", - "integrity": "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.5.tgz", - "integrity": "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.5.tgz", - "integrity": "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@inquirer/ansi": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", - "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - } - }, - "node_modules/@inquirer/confirm": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", - "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^11.2.1", - "@inquirer/type": "^4.0.7" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", - "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^2.0.7", - "@inquirer/figures": "^2.0.7", - "@inquirer/type": "^4.0.7", - "cli-width": "^4.1.0", - "fast-wrap-ansi": "^0.2.0", - "mute-stream": "^3.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", - "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - } - }, - "node_modules/@inquirer/type": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", - "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@modelcontextprotocol/client": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/client/-/client-2.3.1.tgz", - "integrity": "sha512-mIGZXpHsjnZ6lD+gD/WCMpR5k8yVQQ8nNFH1N0Srf7AvnwTUMYD6pvTY8ng2+He5FfV7YMZLmrjL7cLa/cc3dQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@modelcontextprotocol/core": "2.3.1", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.8", - "jose": "^6.1.3", - "pkce-challenge": "^5.0.0", - "zod": "^4.2.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@modelcontextprotocol/core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.3.1.tgz", - "integrity": "sha512-laVmIhPGpWi7rG9q+0UigblRN0Hws/Yjlb6qLFtVqryXVLkc4h+yN8z731POD2LnAGQlFe7/tXhUm7Bi0YB91g==", - "license": "Apache-2.0", - "dependencies": { - "zod": "^4.2.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@modelcontextprotocol/server": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.3.1.tgz", - "integrity": "sha512-e59MfWuSssj6DoQ96JCTqdW1AXT5/XtnTl0WWd6MU1Ka434fFUGGosCLJbGNySDhHGvxQWoRWK137FXYFkYNWw==", - "license": "Apache-2.0", - "dependencies": { - "@modelcontextprotocol/core": "2.3.1", - "zod": "^4.2.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@mswjs/interceptors": { - "version": "0.41.9", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.9.tgz", - "integrity": "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mswjs/interceptors/node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@napi-rs/lzma": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma/-/lzma-1.5.1.tgz", - "integrity": "sha512-sgOZ89+y8cDbY+3WbzR8CtIhCuFRWotZ9/2PjPVDJHz6np5KFTAev0DrwiyTJTgFsCRDhfGlbmhMgyhHbWdZ6g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.20 || ^24.12 || >=25" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@napi-rs/lzma-android-arm-eabi": "1.5.1", - "@napi-rs/lzma-android-arm64": "1.5.1", - "@napi-rs/lzma-darwin-arm64": "1.5.1", - "@napi-rs/lzma-darwin-x64": "1.5.1", - "@napi-rs/lzma-freebsd-x64": "1.5.1", - "@napi-rs/lzma-linux-arm-gnueabihf": "1.5.1", - "@napi-rs/lzma-linux-arm64-gnu": "1.5.1", - "@napi-rs/lzma-linux-arm64-musl": "1.5.1", - "@napi-rs/lzma-linux-ppc64-gnu": "1.5.1", - "@napi-rs/lzma-linux-riscv64-gnu": "1.5.1", - "@napi-rs/lzma-linux-s390x-gnu": "1.5.1", - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@napi-rs/lzma-linux-x64-musl": "1.5.1", - "@napi-rs/lzma-wasm32-wasi": "1.5.1", - "@napi-rs/lzma-win32-arm64-msvc": "1.5.1", - "@napi-rs/lzma-win32-ia32-msvc": "1.5.1", - "@napi-rs/lzma-win32-x64-msvc": "1.5.1" - } - }, - "node_modules/@napi-rs/lzma-android-arm-eabi": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-android-arm-eabi/-/lzma-android-arm-eabi-1.5.1.tgz", - "integrity": "sha512-sahBe4ko2Z69NPTddaX6ZgbQZu9SDoITxw1S3dWl1gAGynZG34qHHCT8UaUMFxf3h3zMhCJjEzz4basaBxiTuQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-android-arm64": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-android-arm64/-/lzma-android-arm64-1.5.1.tgz", - "integrity": "sha512-7tkQAJJuBHxAxiEBNFgSTpvrtGpbwZYYJUSOmGEK3OfbdbNeoT2rdBxpM/gY1s+itEVbtOSlpaRPPG19MnwOzA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-darwin-arm64": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-darwin-arm64/-/lzma-darwin-arm64-1.5.1.tgz", - "integrity": "sha512-XWX8gtF+GHGk3nH3Wm3QUZNcxw9QHsFVZz3MzVLhWWHhceede1J4/vD+3dj3E1iKB9G6mualaZxOoD08R3E+7g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-darwin-x64": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-darwin-x64/-/lzma-darwin-x64-1.5.1.tgz", - "integrity": "sha512-CfsqUpMTI1z8enrA/b+GcHM6YDI8D0kqCiqPYEnst4rbOABQ9KZ92ybTTNnlnZ7A017WoMZKUEWc36KXDwi0xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-freebsd-x64": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-freebsd-x64/-/lzma-freebsd-x64-1.5.1.tgz", - "integrity": "sha512-bTyNfg90FXIgE61U7l14aMmVOqRQ6AyP5JMT3jmCStaZI18apLNPdzZ8i7yqxZfKvRMVfPjE2brXIw27c+RRgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-linux-arm-gnueabihf": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-arm-gnueabihf/-/lzma-linux-arm-gnueabihf-1.5.1.tgz", - "integrity": "sha512-vNE+D8nrw+eOkBsdKCsmDhowDV3pIMKXEhedvXfbgrWbrO7GlZJH+RXL+X+RYLxGwi8Ym61ZMt15sIOnNmh9Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-linux-arm64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-arm64-gnu/-/lzma-linux-arm64-gnu-1.5.1.tgz", - "integrity": "sha512-csUem4WgoKGTprv/pOPm9UIWbb+hrfUwYXefpTHPAEGVFLl5behEFabisJ7FtihCa3yG2Efcl+yw25rlhhrIYw==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-linux-arm64-musl": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-arm64-musl/-/lzma-linux-arm64-musl-1.5.1.tgz", - "integrity": "sha512-kB/xhlVN1eLvVmDJSKZEjp5Gg2xDYexNrB5jwpSMbOkeGS6N9AasByPBg5VqCpMYC+zZi7DM458DRhtWYhqXTQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-linux-ppc64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-ppc64-gnu/-/lzma-linux-ppc64-gnu-1.5.1.tgz", - "integrity": "sha512-s28RW0W1yBWQc1nbPdF7tp14koqslY3ZWLVI8uaanX292Dc6ezd4NPVwxEoCNBVON/oD7BmUbWGtyFvmm7dQ5A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-linux-riscv64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-riscv64-gnu/-/lzma-linux-riscv64-gnu-1.5.1.tgz", - "integrity": "sha512-+lGNwYlIN14YPMTNvYtIJJqHFevDTd6Juw/1NmXbWx/iRd/LLrjhlM/yluMX6pxs6NkOGsuuEXJJrbbEUS59OQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-linux-s390x-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-s390x-gnu/-/lzma-linux-s390x-gnu-1.5.1.tgz", - "integrity": "sha512-PB44FFWWFrLeQowhcep1hPD1YcLqKlnnY60RMU74qrxTlr4YGEyzeMItJqh2uivBfv9kQScOF/B0J9+Vab/oyw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-linux-x64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", - "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-linux-x64-musl": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-musl/-/lzma-linux-x64-musl-1.5.1.tgz", - "integrity": "sha512-I3nsYrWtrW9JpeCr+mkJIVDt0HY3m6qVUBs5vTtoIvJQxwqf1PBXSy5IS7T53ksQFH2kd2UX8rLxJ7B4WISpZg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-wasm32-wasi": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-wasm32-wasi/-/lzma-wasm32-wasi-1.5.1.tgz", - "integrity": "sha512-gy3wwPBa6+XEyA4fUzq6CClrXA1ajXjuVf5zbnHytJRgoHznj+mvpU3+co2fxXwqTCmIpn6KrzqH5bRDztBPhA==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.11.2", - "@emnapi/runtime": "1.11.2", - "@napi-rs/wasm-runtime": "^1.1.6" - }, - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", - "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@napi-rs/lzma-win32-arm64-msvc": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-win32-arm64-msvc/-/lzma-win32-arm64-msvc-1.5.1.tgz", - "integrity": "sha512-dK+huOsHiyH6oJjij+cnjqFCakk2HgWmpI12Xm4pLUyPphe4ebYoJBgehaNAxprmjFqBQ7nL95YPVz9BHyqmPg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-win32-ia32-msvc": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-win32-ia32-msvc/-/lzma-win32-ia32-msvc-1.5.1.tgz", - "integrity": "sha512-dGE8L+0EQ+GyU9ap9InqB/t/PmPG/bLj918q7OsJ29FuTdn8fK4OX3U4IQZhylHIA+/dQ/SXJk5n4yfah2XVvA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/lzma-win32-x64-msvc": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-win32-x64-msvc/-/lzma-win32-x64-msvc-1.5.1.tgz", - "integrity": "sha512-EKW4t/iqdCT/xnd5t9oXLvVER/PMNAWXKqUAl3fgvUcOILeZIIht77/dVnfFcc9htA/DCBXC/6YQWdW+LusjFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.5.tgz", - "integrity": "sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" - } - }, - "node_modules/@open-draft/deferred-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-3.0.0.tgz", - "integrity": "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@oxc-minify/binding-android-arm-eabi": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm-eabi/-/binding-android-arm-eabi-0.151.0.tgz", - "integrity": "sha512-Y1kwFf+GCq62PWojA4u5ME99T1quxdM+VPB67kIC1x0wLmfGAWAhS9cwKIxe/bW95loAxGIruvkYDVMCrvOBvw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-android-arm64": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm64/-/binding-android-arm64-0.151.0.tgz", - "integrity": "sha512-IuRgG5pZ5Axv88yMK5nIeQHOQqrWkGd2Wcu4yUlGhV9NMr2C6N/HpJ7crLWwpflZSHgWXW5s/5AsmEN2CBJw0w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-darwin-arm64": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-arm64/-/binding-darwin-arm64-0.151.0.tgz", - "integrity": "sha512-Uuo84npyREYIOJ8ohYdc7eA+QKVcZnX4524U81+6nhdmxkMp19AZHaBGmd/tN6c7KDfsF3ATXQUOxKkCOGGxUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-darwin-x64": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-x64/-/binding-darwin-x64-0.151.0.tgz", - "integrity": "sha512-XiWlF2PpwoiX6RcqWmFTvcxW5hH+C96l9km164vbM9wisSBoapo95dvZjEzG7lEmffHOGzb4BOAlAeeZ/WlRWw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-freebsd-x64": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-freebsd-x64/-/binding-freebsd-x64-0.151.0.tgz", - "integrity": "sha512-fM6/wcqfGp1R+zxYxHXs+P+wBpTlhU1Nr7iiZyBoCg+mphrgyYS7drUiHWoWzAvUSpicnmFm6rag9bSSWTDUMA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-linux-arm-gnueabihf": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.151.0.tgz", - "integrity": "sha512-s/aBPTyIMW9uAD0mP+xSz7UbuxXfEIi/1rEpqTd1gGjVCz2Sl58sbc65FauI4K26S9nDpk7fGc7y9C9rjK9L+A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-linux-arm-musleabihf": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.151.0.tgz", - "integrity": "sha512-9t44xCPN7E93Pmxsov9qwEGcTc0UJa+z0ZJzvjCk0LqXdLNOQhd15k8KgVuzVbWitI19TvOX/fEC3ZVF6LB/kw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-linux-arm64-gnu": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.151.0.tgz", - "integrity": "sha512-a77EK4y+3fyD1GZiMnOUSr8x52Hx6eKjPnfIzeh4C9UgnUZBRYMsdHBbBDHLLOX1adjyluxtn4Tze7yTVByCeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-linux-arm64-musl": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.151.0.tgz", - "integrity": "sha512-2AjX1jJsj/guky9OuM1jKmuwRVvy+8UUChK3uvrRWV89I/FyrQj9wKPj8TkuL0Ay5yL2xvZj/Ti1Qg0qiRsP+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-linux-ppc64-gnu": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.151.0.tgz", - "integrity": "sha512-l3iUa60pK2WenCy9jhO4UTK/yz9RjVIXPXqfzMdz7DA0QQZ9dxAk/p2p3ERf4KZq/MEIfvs9e4LuFVYg5PFYdQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-linux-riscv64-gnu": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.151.0.tgz", - "integrity": "sha512-v+sdB36Rp8BxmQoP5Jt6ixz7G0aN9Nayh/LvdNBW/0nkKoLHFyEAcV/Uy+79R3oB0uBC1J6DM9XlDxCC1uMkbA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-linux-riscv64-musl": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.151.0.tgz", - "integrity": "sha512-QER/ajZukltjbfFi4rGx6/jC5XEnImAma5P606Xnej0D3fyMC8rXPmae5Z3HyUJMt1Hd5POOkC3S5yQBNPppwQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-linux-s390x-gnu": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.151.0.tgz", - "integrity": "sha512-+r7s5IPrWPtdz/x5LiNSk0ySmzvdP0/VLwt23ULFvcU6jsMrw8DseylMfp4HxvGlJcYyKAUj7JSGxwEmEACUvw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-linux-x64-gnu": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.151.0.tgz", - "integrity": "sha512-O1Rs0HbgKvEhTiq1bVcZnsOY6q8f4LoPE6pgOieB19Coyz1XP/ugq7XILUD6evlszBGRKliRAwycRScbl2kjqg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-linux-x64-musl": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-musl/-/binding-linux-x64-musl-0.151.0.tgz", - "integrity": "sha512-RSbyV8xzLsvypVTo871IYAfL5We9/8JNyAQLMXiCRnQGD/daFm/bp+iLhtoy2jelgOa6kp4H3bkdl+ci5SSwDQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-openharmony-arm64": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-openharmony-arm64/-/binding-openharmony-arm64-0.151.0.tgz", - "integrity": "sha512-WHwdIt3Kj0TQSVey3RiWXgyeZpXUz3Hapq/mdCXyxVCBkvRk/KHIxmHE32EGE/PRx+EQFHVo1+gm627XOde/qg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-win32-arm64-msvc": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.151.0.tgz", - "integrity": "sha512-mFL0B3HByMlBxspR+SeqyBR8b96QkoI2D8quQOwBXEUExR4Ozu3Ya0uyYR9MBdwvQHZZWQ2EWgum8bdHdTfl/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-win32-ia32-msvc": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.151.0.tgz", - "integrity": "sha512-p6QBBxYsg0A0jUQu5NRqW/UuPtoLtmA72SE8N7Rkhn43m/gSLNTE/nFjsLSsX6T9yM8d8k5PfnYvFnSUf+IlRw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-minify/binding-win32-x64-msvc": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.151.0.tgz", - "integrity": "sha512-lkP3SsNXm3JUrNX9c9Ijhl3Iipw0fWuCAOOxju+YjH2AolPUbTLE664KeEDdxt8kaLCh+wCBNyqnV67OLVHZWA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-android-arm64": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.76.0.tgz", - "integrity": "sha512-1XJW/16CDmF5bHE7LAyPPmEEVnxSadDgdJz+xiLqBrmC4lfAeuAfRw3HlOygcPGr+AJsbD4Z5sFJMkwjbSZlQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-darwin-arm64": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.76.0.tgz", - "integrity": "sha512-yoQwSom8xsB+JdGsPUU0xxmxLKiF2kdlrK7I56WtGKZilixuBf/TmOwNYJYLRWkBoW5l2/pDZOhBm2luwmLiLw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-darwin-x64": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.76.0.tgz", - "integrity": "sha512-uRIopPLvr3pf2Xj7f5LKyCuqzIU6zOS+zEIR8UDYhcgJyZHnvBkfrYnfcztyIcrGdQehrFUi3uplmI09E7RdiQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-freebsd-x64": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.76.0.tgz", - "integrity": "sha512-a0EOFvnOd2FqmDSvH6uWLROSlU6KV/JDKbsYDA/zRLyKcG6HCsmFnPsp8iV7/xr9WMbNgyJi6R5IMpePQlUq7Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.76.0.tgz", - "integrity": "sha512-ikRYDHL3fOdZwfJKmcdqjlLgkeNZ3Ez0qM8wAev5zlHZ+lY/Ig7qG5SCqPlvuTu+nNQ6zrFFaKvvt69EBKXU/g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.76.0.tgz", - "integrity": "sha512-dtRv5J5MRCLR7x39K8ufIIW4svIc7gYFUaI0YFXmmeOBhK/K2t/CkguPnDroKtsmXIPHDRtmJ1JJYzNcgJl6Wg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.76.0.tgz", - "integrity": "sha512-IE4iiiggFH2snagQxHrY5bv6dDpRMMat+vdlMN/ibonA65eOmRLp8VLTXnDiNrcla/itJ1L9qGABHNKU+SnE8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm64-musl": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.76.0.tgz", - "integrity": "sha512-wi9zQPMDHrBuRuT7Iurfidc9qlZh7cKa5vfYzOWNBCaqJdgxmNOFzvYen02wVUxSWGKhpiPHxrPX0jdRyJ8Npg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.76.0.tgz", - "integrity": "sha512-0tqqu1pqPee2lLGY8vtYlX1L415fFn89e0a3yp4q5N9f03j1rRs0R31qesTm3bt/UK8HYjECZ+56FCVPs2MEMQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.76.0.tgz", - "integrity": "sha512-y36Hh1a5TA+oIGtlc8lT7N9vdHXBlhBetQJW0p457KbiVQ7jF7AZkaPWhESkjHWAsTVKD2OjCa9ZqfaqhSI0FQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-gnu": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.76.0.tgz", - "integrity": "sha512-7/acaG9htovp3gp/J0kHgbItQTuHctl+rbqPPqZ9DRBYTz8iV8kv3QN8t8Or8i/hOmOjfZp9McDoSU1duoR4/A==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-musl": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.76.0.tgz", - "integrity": "sha512-AxFt0reY6Q2rfudABmMTFGR8tFFr58NlH2rRBQgcj+F+iEwgJ+jMwAPhXd2y1I2zaI8GspuahedUYQinqxWqjA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-wasm32-wasi": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.76.0.tgz", - "integrity": "sha512-wHdkHdhf6AWBoO8vs5cpoR6zEFY1rB+fXWtq6j/xb9j/lu1evlujRVMkh8IM/M/pOUIrNkna3nzST/mRImiveQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.76.0.tgz", - "integrity": "sha512-G7ZlEWcb2hNwCK3qalzqJoyB6HaTigQ/GEa7CU8sAJ/WwMdG/NnPqiC9IqpEAEy1ARSo4XMALfKbKNuqbSs5mg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-win32-x64-msvc": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.76.0.tgz", - "integrity": "sha512-0jLzzmnu8/mqNhKBnNS2lFUbPEzRdj5ReiZwHGHpjma0+ullmmwP2AqSEqx3ssHDK9CpcEMdKOK2LsbCfhHKIA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", - "integrity": "sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/oxc-project" - } - }, - "node_modules/@oxfmt/binding-android-arm-eabi": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.31.0.tgz", - "integrity": "sha512-2A7s+TmsY7xF3yM0VWXq2YJ82Z7Rd7AOKraotyp58Fbk7q9cFZKczW6Zrz/iaMaJYfR/UHDxF3kMR11vayflug==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxfmt/binding-android-arm64": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.31.0.tgz", - "integrity": "sha512-3ppKOIf2lQv/BFhRyENWs/oarueppCEnPNo0Az2fKkz63JnenRuJPoHaGRrMHg1oFMUitdYy+YH29Cv5ISZWRQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxfmt/binding-darwin-arm64": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.31.0.tgz", - "integrity": "sha512-eFhNnle077DPRW6QPsBtl/wEzPoqgsB1LlzDRYbbztizObHdCo6Yo8T0hew9+HoYtnVMAP19zcRE7VG9OfqkMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxfmt/binding-darwin-x64": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.31.0.tgz", - "integrity": "sha512-9UQSunEqokhR1WnlQCgJjkjw13y8PSnBvR98L78beGudTtNSaPMgwE7t/T0IPDibtDTxeEt+IQVKoQJ+8Jo6Lg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxfmt/binding-freebsd-x64": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.31.0.tgz", - "integrity": "sha512-FHo7ITkDku3kQ8/44nU6IGR1UNH22aqYM3LV2ytV40hWSMVllXFlM+xIVusT+I/SZBAtuFpwEWzyS+Jn4TkkAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.31.0.tgz", - "integrity": "sha512-o1NiDlJDO9SOoY5wH8AyPUX60yQcOwu5oVuepi2eetArBp0iFF9qIH1uLlZsUu4QQ6ywqxcJSMjXCqGKC5uQFg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxfmt/binding-linux-arm-musleabihf": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.31.0.tgz", - "integrity": "sha512-VXiRxlBz7ivAIjhnnVBEYdjCQ66AsjM0YKxYAcliS0vPqhWKiScIT61gee0DPCVaw1XcuW8u19tfRwpfdYoreg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxfmt/binding-linux-arm64-gnu": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.31.0.tgz", - "integrity": "sha512-ryGPOtPViNcjs8N8Ap+wn7SM6ViiLzR9f0Pu7yprae+wjl6qwnNytzsUe7wcb+jT43DJYmvemFqE8tLVUavYbQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxfmt/binding-linux-arm64-musl": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.31.0.tgz", - "integrity": "sha512-BA3Euxp4bfd+AU3cKPgmHL44BbuBtmQTyAQoVDhX/nqPgbS/auoGp71uQBE4SAPTsQM/FcXxfKmCAdBS7ygF9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxfmt/binding-linux-ppc64-gnu": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.31.0.tgz", - "integrity": "sha512-wIiKHulVWE9s6PSftPItucTviyCvjugwPqEyUl1VD47YsFqa5UtQTknBN49NODHJvBgO+eqqUodgRqmNMp3xyw==", - "cpu": [ - "ppc64" - ], + "node_modules/@inquirer/type": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", + "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@oxfmt/binding-linux-riscv64-gnu": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.31.0.tgz", - "integrity": "sha512-6cM8Jt54bg9V/JoeUWhwnzHAS9Kvgc0oFsxql8PVs/njAGs0H4r+GEU4d+LXZPwI3b3ZUuzpbxlRJzer8KW+Cg==", - "cpu": [ - "riscv64" - ], + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=6.0.0" } }, - "node_modules/@oxfmt/binding-linux-riscv64-musl": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.31.0.tgz", - "integrity": "sha512-d+b05wXVRGaO6gobTaDqUdBvTXwYc0ro7k1UVC37k4VimLRQOzEZqTwVinqIX3LxTaFCmfO1yG00u9Pct3AKwQ==", - "cpu": [ - "riscv64" - ], + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "license": "MIT" }, - "node_modules/@oxfmt/binding-linux-s390x-gnu": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.31.0.tgz", - "integrity": "sha512-Q+i2kj8e+two9jTZ3vxmxdNlg++qShe1ODL6xV4+Qt6SnJYniMxfcqphuXli4ft270kuHqd8HSVZs84CsSh1EA==", - "cpu": [ - "s390x" - ], + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@oxfmt/binding-linux-x64-gnu": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.31.0.tgz", - "integrity": "sha512-F2Z5ffj2okhaQBi92MylwZddKvFPBjrsZnGvvRmVvWRf8WJ0WkKUTtombDgRYNDgoW7GBUUrNNNgWhdB7kVjBA==", - "cpu": [ - "x64" - ], + "node_modules/@modelcontextprotocol/client": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/client/-/client-2.3.1.tgz", + "integrity": "sha512-mIGZXpHsjnZ6lD+gD/WCMpR5k8yVQQ8nNFH1N0Srf7AvnwTUMYD6pvTY8ng2+He5FfV7YMZLmrjL7cLa/cc3dQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", + "dependencies": { + "@modelcontextprotocol/core": "2.3.1", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.8", + "jose": "^6.1.3", + "pkce-challenge": "^5.0.0", + "zod": "^4.2.0" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=20" } }, - "node_modules/@oxfmt/binding-linux-x64-musl": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.31.0.tgz", - "integrity": "sha512-Vz7dZQd1yhE5wTWujGanPmZgDtzLZS1PQoeMmUj89p4eMTmpIkvWaIr3uquJCbh8dQd5cPZrFvMmdDgcY5z+GA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@modelcontextprotocol/core": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.3.1.tgz", + "integrity": "sha512-laVmIhPGpWi7rG9q+0UigblRN0Hws/Yjlb6qLFtVqryXVLkc4h+yN8z731POD2LnAGQlFe7/tXhUm7Bi0YB91g==", + "license": "Apache-2.0", + "dependencies": { + "zod": "^4.2.0" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=20" } }, - "node_modules/@oxfmt/binding-openharmony-arm64": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.31.0.tgz", - "integrity": "sha512-nm0gus6R5V9tM1XaELiiIduUzmdBuCefkwToWKL4UtuFoMCGkigVQnbzHwPTGLVWOEF6wTQucFA8Fn1U8hxxVw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], + "node_modules/@modelcontextprotocol/server": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.3.1.tgz", + "integrity": "sha512-e59MfWuSssj6DoQ96JCTqdW1AXT5/XtnTl0WWd6MU1Ka434fFUGGosCLJbGNySDhHGvxQWoRWK137FXYFkYNWw==", + "license": "Apache-2.0", + "dependencies": { + "@modelcontextprotocol/core": "2.3.1", + "zod": "^4.2.0" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=20" } }, - "node_modules/@oxfmt/binding-win32-arm64-msvc": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.31.0.tgz", - "integrity": "sha512-mMpvvPpoLD97Q2TMhjWDJSn+ib3kN+H+F4gq9p88zpeef6sqWc9djorJ3JXM2sOZMJ6KZ+1kSJfe0rkji74Pog==", - "cpu": [ - "arm64" - ], + "node_modules/@mswjs/interceptors": { + "version": "0.41.9", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.9.tgz", + "integrity": "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@oxfmt/binding-win32-ia32-msvc": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.31.0.tgz", - "integrity": "sha512-zTngbPyrTDBYJFVQa4OJldM6w1Rqzi8c0/eFxAEbZRoj6x149GkyMkAY3kM+09ZhmszFitCML2S3p10NE2XmHA==", - "cpu": [ - "ia32" - ], + "node_modules/@mswjs/interceptors/node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/deferred-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-3.0.0.tgz", + "integrity": "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" } }, - "node_modules/@oxfmt/binding-win32-x64-msvc": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.31.0.tgz", - "integrity": "sha512-TB30D+iRLe6eUbc/utOA93+FNz5C6vXSb/TEhwvlODhKYZZSSKn/lFpYzZC7bdhx3a8m4Jq8fEUoCJ6lKnzdpA==", - "cpu": [ - "x64" - ], + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@oxc-project/types": { + "version": "0.151.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.151.0.tgz", + "integrity": "sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "funding": { + "url": "https://github.com/sponsors/oxc-project" } }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.46.0.tgz", - "integrity": "sha512-vLPcE+HcZ/W/0cVA1KLuAnoUSejGougDH/fDjBFf0Q+rbBIyBNLevOhgx3AnBNAt3hcIGY7U05ISbJCKZeVa3w==", + "node_modules/@oxfmt/binding-android-arm-eabi": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.31.0.tgz", + "integrity": "sha512-2A7s+TmsY7xF3yM0VWXq2YJ82Z7Rd7AOKraotyp58Fbk7q9cFZKczW6Zrz/iaMaJYfR/UHDxF3kMR11vayflug==", "cpu": [ "arm" ], @@ -3467,10 +1440,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.46.0.tgz", - "integrity": "sha512-b8IqCczUsirdtJ3R/be4cRm64I5pMPafMO/9xyTAZvc+R/FxZHMQuhw0iNT9hQwRn+Uo5rNAoA8QS7QurG2QeA==", + "node_modules/@oxfmt/binding-android-arm64": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.31.0.tgz", + "integrity": "sha512-3ppKOIf2lQv/BFhRyENWs/oarueppCEnPNo0Az2fKkz63JnenRuJPoHaGRrMHg1oFMUitdYy+YH29Cv5ISZWRQ==", "cpu": [ "arm64" ], @@ -3484,10 +1457,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.46.0.tgz", - "integrity": "sha512-CfC/KGnNMhI01dkfCMjquKnW4zby3kqD5o/9XA7+pgo9I4b+Nipm+JVFyZPWMNwKqLXNmi35GTLWjs9svPxlew==", + "node_modules/@oxfmt/binding-darwin-arm64": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.31.0.tgz", + "integrity": "sha512-eFhNnle077DPRW6QPsBtl/wEzPoqgsB1LlzDRYbbztizObHdCo6Yo8T0hew9+HoYtnVMAP19zcRE7VG9OfqkMw==", "cpu": [ "arm64" ], @@ -3501,10 +1474,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.46.0.tgz", - "integrity": "sha512-m38mKPsV3rBdWOJ4TAGZiUjWU8RGrBxsmdSeMQ0bPr/8O6CUOm/RJkPBf0GAfPms2WRVcbkfEXvIiPshAeFkeA==", + "node_modules/@oxfmt/binding-darwin-x64": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.31.0.tgz", + "integrity": "sha512-9UQSunEqokhR1WnlQCgJjkjw13y8PSnBvR98L78beGudTtNSaPMgwE7t/T0IPDibtDTxeEt+IQVKoQJ+8Jo6Lg==", "cpu": [ "x64" ], @@ -3518,10 +1491,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.46.0.tgz", - "integrity": "sha512-YaFRKslSAfuMwn7ejS1/wo9jENqQigpGBjjThX+mrpmEROLYGky+zIC5xSVGRng28U92VEDVbSNJ/sguz3dUAA==", + "node_modules/@oxfmt/binding-freebsd-x64": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.31.0.tgz", + "integrity": "sha512-FHo7ITkDku3kQ8/44nU6IGR1UNH22aqYM3LV2ytV40hWSMVllXFlM+xIVusT+I/SZBAtuFpwEWzyS+Jn4TkkAQ==", "cpu": [ "x64" ], @@ -3535,10 +1508,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.46.0.tgz", - "integrity": "sha512-Nlw+5mSZQtkg1Oj0N8ulxzG8ATpmSDz5V2DNaGhaYAVlcdR8NYSm/xTOnweOXc/UOOv3LwkPPYzqcfPhu2lEkA==", + "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.31.0.tgz", + "integrity": "sha512-o1NiDlJDO9SOoY5wH8AyPUX60yQcOwu5oVuepi2eetArBp0iFF9qIH1uLlZsUu4QQ6ywqxcJSMjXCqGKC5uQFg==", "cpu": [ "arm" ], @@ -3552,10 +1525,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.46.0.tgz", - "integrity": "sha512-d3Y5y4ukMqAGnWLMKpwqj8ftNUaac7pA0NrId4AZ77JvHzezmxEcm2gswaBw2HW8y1pnq6KDB0vEPPvpTfDLrA==", + "node_modules/@oxfmt/binding-linux-arm-musleabihf": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.31.0.tgz", + "integrity": "sha512-VXiRxlBz7ivAIjhnnVBEYdjCQ66AsjM0YKxYAcliS0vPqhWKiScIT61gee0DPCVaw1XcuW8u19tfRwpfdYoreg==", "cpu": [ "arm" ], @@ -3569,10 +1542,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.46.0.tgz", - "integrity": "sha512-jkjx+XSOPuFR+C458prQmehO+v0VK19/3Hj2mOYDF4hHUf3CzmtA4fTmQUtkITZiGHnky7Oao6JeJX24mrX7WQ==", + "node_modules/@oxfmt/binding-linux-arm64-gnu": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.31.0.tgz", + "integrity": "sha512-ryGPOtPViNcjs8N8Ap+wn7SM6ViiLzR9f0Pu7yprae+wjl6qwnNytzsUe7wcb+jT43DJYmvemFqE8tLVUavYbQ==", "cpu": [ "arm64" ], @@ -3586,10 +1559,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.46.0.tgz", - "integrity": "sha512-X/aPB1rpJUdykjWSeeGIbjk6qbD8VDulgLuTSMWgr/t6m1ljcAjqHb1g49pVG9bZl55zjECgzvlpPLWnfb4FMQ==", + "node_modules/@oxfmt/binding-linux-arm64-musl": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.31.0.tgz", + "integrity": "sha512-BA3Euxp4bfd+AU3cKPgmHL44BbuBtmQTyAQoVDhX/nqPgbS/auoGp71uQBE4SAPTsQM/FcXxfKmCAdBS7ygF9w==", "cpu": [ "arm64" ], @@ -3603,10 +1576,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.46.0.tgz", - "integrity": "sha512-AymyOxGWwKY2KJa8b+h8iLrYJZbWKYCjqctSc2q6uIAkYPrCsxcWlge1JP6XZ14Sa80DVMwI/QvktbytSV+xVw==", + "node_modules/@oxfmt/binding-linux-ppc64-gnu": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.31.0.tgz", + "integrity": "sha512-wIiKHulVWE9s6PSftPItucTviyCvjugwPqEyUl1VD47YsFqa5UtQTknBN49NODHJvBgO+eqqUodgRqmNMp3xyw==", "cpu": [ "ppc64" ], @@ -3620,10 +1593,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.46.0.tgz", - "integrity": "sha512-PkeVdPKCDA59rlMuucsel2LjlNEpslQN5AhkMMorIJZItbbqi/0JSuACCzaiIcXYv0oNfbeQ8rbOBikv+aT6cg==", + "node_modules/@oxfmt/binding-linux-riscv64-gnu": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.31.0.tgz", + "integrity": "sha512-6cM8Jt54bg9V/JoeUWhwnzHAS9Kvgc0oFsxql8PVs/njAGs0H4r+GEU4d+LXZPwI3b3ZUuzpbxlRJzer8KW+Cg==", "cpu": [ "riscv64" ], @@ -3637,10 +1610,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.46.0.tgz", - "integrity": "sha512-snQaRLO/X+Ry/CxX1px1g8GUbmXzymdRs+/RkP2bySHWZFhFDtbLm2hA1ujX/jKlTLMJDZn4hYzFGLDwG/Rh2w==", + "node_modules/@oxfmt/binding-linux-riscv64-musl": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.31.0.tgz", + "integrity": "sha512-d+b05wXVRGaO6gobTaDqUdBvTXwYc0ro7k1UVC37k4VimLRQOzEZqTwVinqIX3LxTaFCmfO1yG00u9Pct3AKwQ==", "cpu": [ "riscv64" ], @@ -3654,112 +1627,27 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.46.0.tgz", - "integrity": "sha512-kZhDMwUe/sgDTluGao9c0Dqc1JzV6wPzfGo0l/FLQdh5Zmp39Yg1FbBsCgsJfVKmKl1fNqsHyFLTShWMOlOEhA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.46.0.tgz", - "integrity": "sha512-n5a7VtQTxHZ13cNAKQc3ziARv5bE1Fx868v/tnhZNVUjaRNYe5uiUrRJ/LZghdAzOxVuQGarjjq/q4QM2+9OPA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.46.0.tgz", - "integrity": "sha512-KpsDU/BhdVn3iKCLxMXAOZIpO8fS0jEA5iluRoK1rhHPwKtpzEm/OCwERsu/vboMSZm66qnoTUVXRPJ8M+iKVQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.46.0.tgz", - "integrity": "sha512-jtbqUyEXlsDlRmMtTZqNbw49+1V/WxqNAR5l0S3OEkdat9diI5I+eqq9IT+jb5cSDdszTGcXpn7S3+gUYSydxQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.46.0.tgz", - "integrity": "sha512-EE8NjpqEZPwHQVigNvdyJ11dZwWIfsfn4VeBAuiJeAdrnY4HFX27mIjJINJgP5ZdBYEFV1OWH/eb9fURCYel8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.46.0.tgz", - "integrity": "sha512-BHyk3H/HRdXs+uImGZ/2+qCET+B8lwGHOm7m54JiJEEUWf3zYCFX/Df1SPqtozWWmnBvioxoTG1J3mPRAr8KUA==", + "node_modules/@oxfmt/binding-linux-s390x-gnu": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.31.0.tgz", + "integrity": "sha512-Q+i2kj8e+two9jTZ3vxmxdNlg++qShe1ODL6xV4+Qt6SnJYniMxfcqphuXli4ft270kuHqd8HSVZs84CsSh1EA==", "cpu": [ - "ia32" + "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.46.0.tgz", - "integrity": "sha512-DJbQsSJUr4KSi9uU0QqOgI7PX2C+fKGZX+YDprt3vM2sC0dWZsgVTLoN2vtkNyEWJSY2mnvRFUshWXT3bmo0Ug==", + "node_modules/@oxfmt/binding-linux-x64-gnu": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.31.0.tgz", + "integrity": "sha512-F2Z5ffj2okhaQBi92MylwZddKvFPBjrsZnGvvRmVvWRf8WJ0WkKUTtombDgRYNDgoW7GBUUrNNNgWhdB7kVjBA==", "cpu": [ "x64" ], @@ -3767,62 +1655,33 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@poppinss/colors": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", - "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^4.1.5" - } - }, - "node_modules/@poppinss/dumper": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", - "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@poppinss/colors": "^4.1.5", - "@sindresorhus/is": "^7.0.2", - "supports-color": "^10.0.0" - } - }, - "node_modules/@poppinss/exception": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", - "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.11.tgz", - "integrity": "sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==", + "node_modules/@oxfmt/binding-linux-x64-musl": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.31.0.tgz", + "integrity": "sha512-Vz7dZQd1yhE5wTWujGanPmZgDtzLZS1PQoeMmUj89p4eMTmpIkvWaIr3uquJCbh8dQd5cPZrFvMmdDgcY5z+GA==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.11.tgz", - "integrity": "sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==", + "node_modules/@oxfmt/binding-openharmony-arm64": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.31.0.tgz", + "integrity": "sha512-nm0gus6R5V9tM1XaELiiIduUzmdBuCefkwToWKL4UtuFoMCGkigVQnbzHwPTGLVWOEF6wTQucFA8Fn1U8hxxVw==", "cpu": [ "arm64" ], @@ -3830,16 +1689,16 @@ "license": "MIT", "optional": true, "os": [ - "android" + "openharmony" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.11.tgz", - "integrity": "sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==", + "node_modules/@oxfmt/binding-win32-arm64-msvc": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.31.0.tgz", + "integrity": "sha512-mMpvvPpoLD97Q2TMhjWDJSn+ib3kN+H+F4gq9p88zpeef6sqWc9djorJ3JXM2sOZMJ6KZ+1kSJfe0rkji74Pog==", "cpu": [ "arm64" ], @@ -3847,33 +1706,33 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.11.tgz", - "integrity": "sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==", + "node_modules/@oxfmt/binding-win32-ia32-msvc": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.31.0.tgz", + "integrity": "sha512-zTngbPyrTDBYJFVQa4OJldM6w1Rqzi8c0/eFxAEbZRoj6x149GkyMkAY3kM+09ZhmszFitCML2S3p10NE2XmHA==", "cpu": [ - "x64" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.11.tgz", - "integrity": "sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==", + "node_modules/@oxfmt/binding-win32-x64-msvc": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.31.0.tgz", + "integrity": "sha512-TB30D+iRLe6eUbc/utOA93+FNz5C6vXSb/TEhwvlODhKYZZSSKn/lFpYzZC7bdhx3a8m4Jq8fEUoCJ6lKnzdpA==", "cpu": [ "x64" ], @@ -3881,16 +1740,16 @@ "license": "MIT", "optional": true, "os": [ - "freebsd" + "win32" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.11.tgz", - "integrity": "sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==", + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.46.0.tgz", + "integrity": "sha512-vLPcE+HcZ/W/0cVA1KLuAnoUSejGougDH/fDjBFf0Q+rbBIyBNLevOhgx3AnBNAt3hcIGY7U05ISbJCKZeVa3w==", "cpu": [ "arm" ], @@ -3898,103 +1757,88 @@ "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.11.tgz", - "integrity": "sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==", + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.46.0.tgz", + "integrity": "sha512-b8IqCczUsirdtJ3R/be4cRm64I5pMPafMO/9xyTAZvc+R/FxZHMQuhw0iNT9hQwRn+Uo5rNAoA8QS7QurG2QeA==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.11.tgz", - "integrity": "sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==", + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.46.0.tgz", + "integrity": "sha512-CfC/KGnNMhI01dkfCMjquKnW4zby3kqD5o/9XA7+pgo9I4b+Nipm+JVFyZPWMNwKqLXNmi35GTLWjs9svPxlew==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.11.tgz", - "integrity": "sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==", + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.46.0.tgz", + "integrity": "sha512-m38mKPsV3rBdWOJ4TAGZiUjWU8RGrBxsmdSeMQ0bPr/8O6CUOm/RJkPBf0GAfPms2WRVcbkfEXvIiPshAeFkeA==", "cpu": [ - "ppc64" + "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.11.tgz", - "integrity": "sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==", + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.46.0.tgz", + "integrity": "sha512-YaFRKslSAfuMwn7ejS1/wo9jENqQigpGBjjThX+mrpmEROLYGky+zIC5xSVGRng28U92VEDVbSNJ/sguz3dUAA==", "cpu": [ - "s390x" + "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.11.tgz", - "integrity": "sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==", + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.46.0.tgz", + "integrity": "sha512-Nlw+5mSZQtkg1Oj0N8ulxzG8ATpmSDz5V2DNaGhaYAVlcdR8NYSm/xTOnweOXc/UOOv3LwkPPYzqcfPhu2lEkA==", "cpu": [ - "x64" + "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -4004,17 +1848,14 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.11.tgz", - "integrity": "sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==", + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.46.0.tgz", + "integrity": "sha512-d3Y5y4ukMqAGnWLMKpwqj8ftNUaac7pA0NrId4AZ77JvHzezmxEcm2gswaBw2HW8y1pnq6KDB0vEPPvpTfDLrA==", "cpu": [ - "x64" + "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4024,10 +1865,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.11.tgz", - "integrity": "sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==", + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.46.0.tgz", + "integrity": "sha512-jkjx+XSOPuFR+C458prQmehO+v0VK19/3Hj2mOYDF4hHUf3CzmtA4fTmQUtkITZiGHnky7Oao6JeJX24mrX7WQ==", "cpu": [ "arm64" ], @@ -4035,16 +1876,16 @@ "license": "MIT", "optional": true, "os": [ - "openharmony" + "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.11.tgz", - "integrity": "sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==", + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.46.0.tgz", + "integrity": "sha512-X/aPB1rpJUdykjWSeeGIbjk6qbD8VDulgLuTSMWgr/t6m1ljcAjqHb1g49pVG9bZl55zjECgzvlpPLWnfb4FMQ==", "cpu": [ "arm64" ], @@ -4052,466 +1893,570 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.11.tgz", - "integrity": "sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==", + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.46.0.tgz", + "integrity": "sha512-AymyOxGWwKY2KJa8b+h8iLrYJZbWKYCjqctSc2q6uIAkYPrCsxcWlge1JP6XZ14Sa80DVMwI/QvktbytSV+xVw==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", - "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@speed-highlight/core": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.17.tgz", - "integrity": "sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", - "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.46.0.tgz", + "integrity": "sha512-PkeVdPKCDA59rlMuucsel2LjlNEpslQN5AhkMMorIJZItbbqi/0JSuACCzaiIcXYv0oNfbeQ8rbOBikv+aT6cg==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.46.0.tgz", + "integrity": "sha512-snQaRLO/X+Ry/CxX1px1g8GUbmXzymdRs+/RkP2bySHWZFhFDtbLm2hA1ujX/jKlTLMJDZn4hYzFGLDwG/Rh2w==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "25.0.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.6.tgz", - "integrity": "sha512-NNu0sjyNxpoiW3YuVFfNz7mxSQ+S4X2G28uqg2s+CzoqoQjLPsWSbsFFyztIAqt2vb8kfEAsJNepMGPTxFDx3Q==", + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.46.0.tgz", + "integrity": "sha512-kZhDMwUe/sgDTluGao9c0Dqc1JzV6wPzfGo0l/FLQdh5Zmp39Yg1FbBsCgsJfVKmKl1fNqsHyFLTShWMOlOEhA==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@types/set-cookie-parser": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", - "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.46.0.tgz", + "integrity": "sha512-n5a7VtQTxHZ13cNAKQc3ziARv5bE1Fx868v/tnhZNVUjaRNYe5uiUrRJ/LZghdAzOxVuQGarjjq/q4QM2+9OPA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@types/statuses": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", - "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript/typescript-aix-ppc64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", - "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.46.0.tgz", + "integrity": "sha512-KpsDU/BhdVn3iKCLxMXAOZIpO8fS0jEA5iluRoK1rhHPwKtpzEm/OCwERsu/vboMSZm66qnoTUVXRPJ8M+iKVQ==", "cpu": [ - "ppc64" + "x64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "aix" + "linux" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-darwin-arm64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", - "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.46.0.tgz", + "integrity": "sha512-jtbqUyEXlsDlRmMtTZqNbw49+1V/WxqNAR5l0S3OEkdat9diI5I+eqq9IT+jb5cSDdszTGcXpn7S3+gUYSydxQ==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "darwin" + "openharmony" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-darwin-x64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", - "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.46.0.tgz", + "integrity": "sha512-EE8NjpqEZPwHQVigNvdyJ11dZwWIfsfn4VeBAuiJeAdrnY4HFX27mIjJINJgP5ZdBYEFV1OWH/eb9fURCYel8w==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-freebsd-arm64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", - "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.46.0.tgz", + "integrity": "sha512-BHyk3H/HRdXs+uImGZ/2+qCET+B8lwGHOm7m54JiJEEUWf3zYCFX/Df1SPqtozWWmnBvioxoTG1J3mPRAr8KUA==", "cpu": [ - "arm64" + "ia32" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "freebsd" + "win32" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-freebsd-x64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", - "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.46.0.tgz", + "integrity": "sha512-DJbQsSJUr4KSi9uU0QqOgI7PX2C+fKGZX+YDprt3vM2sC0dWZsgVTLoN2vtkNyEWJSY2mnvRFUshWXT3bmo0Ug==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "freebsd" + "win32" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" } }, - "node_modules/@typescript/typescript-linux-arm": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", - "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.11.tgz", + "integrity": "sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==", "cpu": [ "arm" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-linux-arm64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", - "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.11.tgz", + "integrity": "sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-linux-loong64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", - "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.11.tgz", + "integrity": "sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==", "cpu": [ - "loong64" + "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-linux-mips64el": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", - "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.11.tgz", + "integrity": "sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==", "cpu": [ - "mips64el" + "x64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-linux-ppc64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", - "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.11.tgz", + "integrity": "sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==", "cpu": [ - "ppc64" + "x64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-linux-riscv64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", - "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.11.tgz", + "integrity": "sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==", "cpu": [ - "riscv64" + "arm" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-linux-s390x": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", - "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.11.tgz", + "integrity": "sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==", "cpu": [ - "s390x" + "arm64" ], "dev": true, - "license": "Apache-2.0", + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-linux-x64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", - "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.11.tgz", + "integrity": "sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "Apache-2.0", + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-netbsd-arm64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", - "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.11.tgz", + "integrity": "sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, - "license": "Apache-2.0", + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-netbsd-x64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", - "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.11.tgz", + "integrity": "sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==", "cpu": [ - "x64" + "s390x" ], "dev": true, - "license": "Apache-2.0", + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-openbsd-arm64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", - "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.11.tgz", + "integrity": "sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "license": "Apache-2.0", + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-openbsd-x64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", - "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.11.tgz", + "integrity": "sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0", + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-sunos-x64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", - "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.11.tgz", + "integrity": "sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "sunos" + "openharmony" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-win32-arm64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", - "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.11.tgz", + "integrity": "sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@typescript/typescript-win32-x64": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", - "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.11.tgz", + "integrity": "sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=16.20.0" + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.17.tgz", + "integrity": "sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.6.tgz", + "integrity": "sha512-NNu0sjyNxpoiW3YuVFfNz7mxSQ+S4X2G28uqg2s+CzoqoQjLPsWSbsFFyztIAqt2vb8kfEAsJNepMGPTxFDx3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/set-cookie-parser": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", + "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, "node_modules/@vitest/expect": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", @@ -4625,45 +2570,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -4700,99 +2606,12 @@ "node": ">=12" } }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/binaryen": { - "version": "132.0.0", - "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-132.0.0.tgz", - "integrity": "sha512-4Usg7yEvwO3FMso3Oov6qkOOHSod1IEv+boKkh77kTljM+eNBouqCTbqWswGzbG+vDNO/b/v2C4gfEh1WgB9Lg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "wasm-as": "bin/wasm-as", - "wasm-ctor-eval": "bin/wasm-ctor-eval", - "wasm-dis": "bin/wasm-dis", - "wasm-merge": "bin/wasm-merge", - "wasm-metadce": "bin/wasm-metadce", - "wasm-opt": "bin/wasm-opt", - "wasm-reduce": "bin/wasm-reduce", - "wasm-shell": "bin/wasm-shell", - "wasm2js": "bin/wasm2js" - } - }, - "node_modules/blake3-wasm": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", - "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", - "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" }, "node_modules/chai": { "version": "6.2.2", @@ -4804,16 +2623,6 @@ "node": ">=18" } }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", @@ -4866,39 +2675,6 @@ "dev": true, "license": "MIT" }, - "node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/componentize-qjs": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/componentize-qjs/-/componentize-qjs-0.4.5.tgz", - "integrity": "sha512-/Brt+/Ps7DQ1mYuUsDISTQTFSaZfCSoRHkHnh9Dm5WHCO6arc/vzVdD8TXssfyNex2Iv3UR8NHdahsqABPDh0w==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "componentize-qjs": "bin/componentize-qjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "@andreiltd/componentize-qjs-binding-darwin-arm64": "0.4.5", - "@andreiltd/componentize-qjs-binding-darwin-x64": "0.4.5", - "@andreiltd/componentize-qjs-binding-linux-arm64-gnu": "0.4.5", - "@andreiltd/componentize-qjs-binding-linux-arm64-musl": "0.4.5", - "@andreiltd/componentize-qjs-binding-linux-x64-gnu": "0.4.5", - "@andreiltd/componentize-qjs-binding-linux-x64-musl": "0.4.5", - "@andreiltd/componentize-qjs-binding-win32-arm64-msvc": "0.4.5", - "@andreiltd/componentize-qjs-binding-win32-x64-msvc": "0.4.5" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -5017,26 +2793,6 @@ "@types/estree": "^1.0.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", @@ -5115,13 +2871,6 @@ } } }, - "node_modules/fflate": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", - "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", - "dev": true, - "license": "MIT" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -5177,27 +2926,6 @@ "node": ">=16.9.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -5232,19 +2960,6 @@ "url": "https://github.com/sponsors/panva" } }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -5556,61 +3271,6 @@ "node": ">=22.0.0" } }, - "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/msw": { "version": "2.14.6", "resolved": "https://registry.npmjs.org/msw/-/msw-2.14.6.tgz", @@ -5720,83 +3380,6 @@ "dev": true, "license": "MIT" }, - "node_modules/oxc-minify": { - "version": "0.151.0", - "resolved": "https://registry.npmjs.org/oxc-minify/-/oxc-minify-0.151.0.tgz", - "integrity": "sha512-fYdJw3+WYswBWedCl3G0ReJPlHIR1msz3uf5cGAgpHOlQOxfrVu5nOp2gLnccA91Vs7Yw2nH00lj8pc0rjZvYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/oxc-project" - }, - "optionalDependencies": { - "@oxc-minify/binding-android-arm-eabi": "0.151.0", - "@oxc-minify/binding-android-arm64": "0.151.0", - "@oxc-minify/binding-darwin-arm64": "0.151.0", - "@oxc-minify/binding-darwin-x64": "0.151.0", - "@oxc-minify/binding-freebsd-x64": "0.151.0", - "@oxc-minify/binding-linux-arm-gnueabihf": "0.151.0", - "@oxc-minify/binding-linux-arm-musleabihf": "0.151.0", - "@oxc-minify/binding-linux-arm64-gnu": "0.151.0", - "@oxc-minify/binding-linux-arm64-musl": "0.151.0", - "@oxc-minify/binding-linux-ppc64-gnu": "0.151.0", - "@oxc-minify/binding-linux-riscv64-gnu": "0.151.0", - "@oxc-minify/binding-linux-riscv64-musl": "0.151.0", - "@oxc-minify/binding-linux-s390x-gnu": "0.151.0", - "@oxc-minify/binding-linux-x64-gnu": "0.151.0", - "@oxc-minify/binding-linux-x64-musl": "0.151.0", - "@oxc-minify/binding-openharmony-arm64": "0.151.0", - "@oxc-minify/binding-win32-arm64-msvc": "0.151.0", - "@oxc-minify/binding-win32-ia32-msvc": "0.151.0", - "@oxc-minify/binding-win32-x64-msvc": "0.151.0" - } - }, - "node_modules/oxc-parser": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.76.0.tgz", - "integrity": "sha512-l98B2e9evuhES7zN99rb1QGhbzx25829TJFaKi2j0ib3/K/G5z1FdGYz6HZkrU3U8jdH7v2FC8mX1j2l9JrOUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "^0.76.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-parser/binding-android-arm64": "0.76.0", - "@oxc-parser/binding-darwin-arm64": "0.76.0", - "@oxc-parser/binding-darwin-x64": "0.76.0", - "@oxc-parser/binding-freebsd-x64": "0.76.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.76.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.76.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.76.0", - "@oxc-parser/binding-linux-arm64-musl": "0.76.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.76.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.76.0", - "@oxc-parser/binding-linux-x64-gnu": "0.76.0", - "@oxc-parser/binding-linux-x64-musl": "0.76.0", - "@oxc-parser/binding-wasm32-wasi": "0.76.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.76.0", - "@oxc-parser/binding-win32-x64-msvc": "0.76.0" - } - }, - "node_modules/oxc-parser/node_modules/@oxc-project/types": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.76.0.tgz", - "integrity": "sha512-CH3THIrSViKal8yV/Wh3FK0pFhp40nzW1MUDCik9fNuid2D/7JJXKJnfFOAvMxInGXDlvmgT6ACAzrl47TqzkQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, "node_modules/oxfmt": { "version": "0.31.0", "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.31.0.tgz", @@ -5975,101 +3558,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/regenerate": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.5.0.tgz", - "integrity": "sha512-1s+CxXjJ71i7LNVy8nYwg47XV4y6lAnOEhsMtSKq3WpmPfhl9LuKlTqKIn/3yUpE8lBz+W+TT88Bxyhnr0U4yw==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.3.0.tgz", - "integrity": "sha512-9ns8odR8e9q3otKeHj3DE80jZYKg6zVeZKE+zQmRKXFoVUcuiTGeO6iusDhPRoIQQPVPRvH+SfBhrTud4eczuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.4.tgz", - "integrity": "sha512-EWV80YgFaVgFrjGCAsV7oybp4GOxbls5RzBg8OB0nKEVXsBJR1JlV8Di1JhCROg3MzTfe1RI8yitIm1eOs68iA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6121,27 +3609,6 @@ "@rolldown/binding-win32-x64-msvc": "1.2.11" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -6296,16 +3763,6 @@ "dev": true, "license": "MIT" }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -6360,23 +3817,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tar": { - "version": "7.5.22", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", - "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -6454,19 +3894,6 @@ "node": ">=16" } }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -6524,21 +3951,6 @@ "node": ">=14.17" } }, - "node_modules/typescript-compiler-api": { - "name": "typescript", - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/undici": { "version": "7.29.1", "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz", @@ -6566,50 +3978,6 @@ "pathe": "^2.0.3" } }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/until-async": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", @@ -6620,13 +3988,6 @@ "url": "https://github.com/sponsors/kettanaito" } }, - "node_modules/urlpattern-polyfill": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", - "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", - "dev": true, - "license": "MIT" - }, "node_modules/vite": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.1.tgz", @@ -6795,30 +4156,6 @@ } } }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6975,16 +4312,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/yaml": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", diff --git a/package.json b/package.json index 86bb6486..eece63a5 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,9 @@ "deploy:prod": "wrangler deploy --env production", "types": "wrangler types --env-file .env_example", "typecheck": "tsc --noEmit", - "lint": "oxlint src/", + "lint": "oxlint src/ --ignore-pattern 'src/generated/**'", "format": "oxfmt --write src/ tests/ scripts/ vitest.config.ts", + "generate:tools": "tsx scripts/generate-tools.ts", "format:check": "oxfmt --check src/ tests/ scripts/ vitest.config.ts", "test": "vitest run", "test:events": "vitest run tests/events-e2e.test.ts tests/ans-bridge.test.ts", @@ -18,11 +19,9 @@ "test:watch": "vitest", "check": "npm run format:check && npm run lint && npm run typecheck && npm run test", "seed:staging": "tsx scripts/seed-r2.ts staging", - "seed:prod": "tsx scripts/seed-r2.ts production", - "generate:tools": "tsx scripts/generate-tools.ts" + "seed:prod": "tsx scripts/seed-r2.ts production" }, "dependencies": { - "@cloudflare/forge-mcp": "file:vendor/cloudflare-forge-mcp-0.1.0.tgz", "@cloudflare/workers-oauth-provider": "^1.2.3", "@modelcontextprotocol/server": "2.3.1", "hono": "^4.13.7", @@ -30,8 +29,6 @@ "zod": "^4.3.5" }, "devDependencies": { - "@bytecodealliance/jco": "1.37.0", - "@cloudflare/forge": "https://pkg.pr.new/cloudflare/forge/@cloudflare/forge@ca70d7f5", "@cloudflare/vitest-plugin": "^1.4.0", "@modelcontextprotocol/client": "2.3.1", "@types/node": "^25.0.6", diff --git a/scripts/forge-tools.ts b/scripts/forge-tools.ts deleted file mode 100644 index 7dfb4a7a..00000000 --- a/scripts/forge-tools.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { execFileSync } from 'node:child_process' -import { mkdirSync, readFileSync } from 'node:fs' -import { join, resolve } from 'node:path' - -const root = resolve(import.meta.dirname, '..') -const bin = (name: string) => join(root, 'node_modules', '.bin', name) - -/** - * Builds the Cloudflare forge-mcp plugin and runs forge on an - * `openapi.forge.json`, writing `mcp-tools.json` into `outDir`. - * Returns the catalogue's path. - */ -export function generateForgeTools(spec: string, outDir: string): string { - mkdirSync(outDir, { recursive: true }) - const plugin = join(outDir, 'cloudflare-mcp.wasm') - execFileSync( - bin('forge-plugin'), - ['build', join(root, 'src/forge-tools/plugin-entry.ts'), '-o', plugin], - { - stdio: 'inherit' - } - ) - execFileSync(bin('forge'), [spec, '--target', `wasm://${plugin}`, '--out', outDir], { - stdio: 'inherit' - }) - - const path = join(outDir, 'mcp-tools.json') - const catalogue = JSON.parse(readFileSync(path, 'utf8')) as { - tools: unknown[] - skipped: unknown[] - } - console.log(`forge-mcp: ${catalogue.tools.length} tools, ${catalogue.skipped.length} skipped`) - return path -} diff --git a/scripts/generate-tools.ts b/scripts/generate-tools.ts index bcc5c435..9a9a88d6 100644 --- a/scripts/generate-tools.ts +++ b/scripts/generate-tools.ts @@ -1,24 +1,84 @@ -// Generates the Cloudflare direct-tool catalogue into generated/forge/: -// -// npm run generate:tools [-- path/to/openapi.forge.json] -// -// Without a path, it downloads openapi.forge.json from the latest Forge release. -import { writeFileSync, mkdirSync } from 'node:fs' -import { join, resolve } from 'node:path' -import { generateForgeTools } from './forge-tools' - -export const FORGE_SPEC_URL = - 'https://github.com/cloudflare/forge/releases/latest/download/openapi.forge.json' - -const outDir = resolve(import.meta.dirname, '..', 'generated', 'forge') -let spec = process.argv[2] -if (!spec) { - mkdirSync(outDir, { recursive: true }) - spec = join(outDir, 'openapi.forge.json') - console.log(`Downloading ${FORGE_SPEC_URL}...`) - const response = await fetch(FORGE_SPEC_URL) - if (!response.ok) throw new Error(`Failed to fetch the Forge spec: ${response.status}`) - writeFileSync(spec, Buffer.from(await response.arrayBuffer())) +/** + * Regenerates `src/generated/forge-mcp`, the direct tools served at + * `/mcp?forge=true`, with forge's MCP target: + * + * FORGE_BINARY=path/to/forge npm run generate:tools [-- --spec openapi.forge.json] [-- --summary summary.md] + * + * `forge.json` names the forge commit to build; `.github/workflows/forge-tools.yml` + * builds it, runs this every six hours, and opens a pull request when the + * generated code changes. Without `--spec`, the latest `openapi.forge.json` + * Forge release is downloaded. `--summary` writes the tools added and removed + * as Markdown, for the pull request. + */ +import { execFileSync } from 'node:child_process' +import { + existsSync, + mkdtempSync, + readFileSync, + readdirSync, + renameSync, + rmSync, + writeFileSync +} from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { parseArgs } from 'node:util' + +const SPEC_URL = 'https://github.com/cloudflare/forge/releases/latest/download/openapi.forge.json' +const OUT = 'src/generated/forge-mcp' + +const { values } = parseArgs({ options: { spec: { type: 'string' }, summary: { type: 'string' } } }) +const forge = process.env.FORGE_BINARY ?? 'forge' +const tmp = mkdtempSync(join(tmpdir(), 'forge-mcp-')) + +try { + let spec = values.spec + if (!spec) { + console.log(`Downloading ${SPEC_URL}`) + const response = await fetch(SPEC_URL) + if (!response.ok) throw new Error(`Failed to download the spec: HTTP ${response.status}`) + spec = join(tmp, 'openapi.forge.json') + writeFileSync(spec, Buffer.from(await response.arrayBuffer())) + } + + const out = join(tmp, 'out') + execFileSync(forge, [spec, '--target', 'mcp', '--out', out], { stdio: 'inherit' }) + + const before = toolNames(OUT) + rmSync(OUT, { recursive: true, force: true }) + renameSync(out, OUT) + const after = toolNames(OUT) + + const added = [...after].filter((name) => !before.has(name)).sort() + const removed = [...before].filter((name) => !after.has(name)).sort() + console.log(`${after.size} tools: ${added.length} added, ${removed.length} removed`) + if (values.summary) writeFileSync(values.summary, summary(after.size, added, removed)) +} finally { + rmSync(tmp, { recursive: true, force: true }) +} + +/** The names of the generated tools in `dir`, read from each `tools.ts`. */ +function toolNames(dir: string): Set { + const names = new Set() + if (!existsSync(dir)) return names + for (const entry of readdirSync(dir, { recursive: true, withFileTypes: true })) { + if (entry.isFile() && entry.name === 'tools.ts') { + const source = readFileSync(join(entry.parentPath, entry.name), 'utf8') + for (const match of source.matchAll(/^ {4}name: "([^"]+)",$/gm)) names.add(match[1]!) + } + } + return names } -console.log(`Wrote ${generateForgeTools(resolve(spec), outDir)}`) +function summary(count: number, added: string[], removed: string[]): string { + const list = (names: string[]) => names.map((name) => `- \`${name}\``).join('\n') + return [ + `${count} tools: ${added.length} added, ${removed.length} removed.`, + removed.length > 0 + ? `\n**Removed** (clients calling these will get "not found"):\n\n${list(removed)}` + : '', + added.length > 0 ? `\n